From eb84c02ab572f6b4669464de12b78a43f9071cb2 Mon Sep 17 00:00:00 2001 From: davidjharder Date: Wed, 20 Nov 2024 02:41:39 +0000 Subject: [PATCH] deploy: e355d1ce77f1d000c286c69af9b333124ad3a0dd --- 404.html | 4 +- ...18502.acee4281.js => 04b18502.fb736ad1.js} | 2 +- ...67842.f76e9175.js => 05767842.2aaac066.js} | 2 +- ...a8349.58f2285a.js => 080a8349.768a43bc.js} | 2 +- ...ef15d.0fc1910a.js => 08bef15d.3b51e378.js} | 2 +- ...bd43b.476a700a.js => 09dbd43b.6760537d.js} | 2 +- ...54e3a.b3f72544.js => 0b254e3a.bda17182.js} | 2 +- ...c5e6b.1a55516f.js => 0e3c5e6b.b2b6a196.js} | 2 +- ...62883.e57e73d4.js => 0e862883.c6b8fd5f.js} | 2 +- ...88e92.5b7975e1.js => 14488e92.1f235025.js} | 2 +- ...98c37.ed861371.js => 1a698c37.611eff98.js} | 2 +- ...709a2.86ed44e0.js => 1ae709a2.44927e04.js} | 2 +- ...44812.6adc0d53.js => 21944812.a0a566e2.js} | 2 +- ...b9082.64a94637.js => 257b9082.2e7b10e9.js} | 2 +- ...8a3a5.91df6f56.js => 2598a3a5.c3208c71.js} | 2 +- ...9550e.8431025b.js => 2609550e.ae2836f2.js} | 2 +- ...08ea3.5bba2662.js => 26308ea3.3ef577e8.js} | 2 +- ...f90eb.cdffec6b.js => 2a0f90eb.493adcbc.js} | 2 +- ...4ce22.59508d8f.js => 2a34ce22.6a00fac3.js} | 2 +- ...7c7d8.c20b4d40.js => 2a37c7d8.fcae30d8.js} | 2 +- ...abe09.3ece8fc5.js => 2b4abe09.218c0bc6.js} | 2 +- ...1a93c.cf6aa1b4.js => 2b61a93c.c529ff35.js} | 2 +- ...e84bd.d8e1bbcf.js => 2c3e84bd.cc61acc1.js} | 2 +- ...20c38.c3bb4798.js => 38920c38.aa4aa254.js} | 2 +- assets/js/3a2db09e.844e4be4.js | 1 + assets/js/3a2db09e.bd0b6bc5.js | 1 - ...fc7ff.faa6fafd.js => 3fdfc7ff.0f2beccb.js} | 2 +- ...05326.9f3e5519.js => 3ff05326.f1df6790.js} | 2 +- assets/js/418a6276.42385bff.js | 1 + assets/js/418a6276.bc82d44b.js | 1 - ...4de91.c6e74657.js => 41a4de91.ae57e1b1.js} | 2 +- assets/js/424f562c.8c8592ca.js | 1 - assets/js/424f562c.af0382ed.js | 1 + ...9d313.1a78f7ac.js => 45e9d313.43558a74.js} | 2 +- ...65d96.99a6e32d.js => 46a65d96.97bfd57f.js} | 2 +- assets/js/4802fa93.42ab49a1.js | 1 - assets/js/4802fa93.68b985c8.js | 1 + ...71c16.14dff61b.js => 49b71c16.dfd61da5.js} | 2 +- ...b6405.07a2f1ca.js => 513b6405.4ada61ee.js} | 2 +- ...b6a6b.6bd7ed5f.js => 528b6a6b.37e18ccf.js} | 2 +- ...eefa9.2deb3749.js => 533eefa9.69b673fa.js} | 2 +- ...5b4d8.779151ba.js => 5685b4d8.096f851a.js} | 2 +- ...f3753.1a9fe7e9.js => 5b7f3753.dd9a94b3.js} | 2 +- ...94406.74e8cf88.js => 5f194406.ad4c1306.js} | 2 +- ...953b4.e1437d06.js => 61c953b4.ca4b1080.js} | 2 +- ...99048.9858ebd9.js => 64699048.ea4f9bba.js} | 2 +- ...7574e.1482e835.js => 6787574e.5388a897.js} | 2 +- ...3f895.73ae0d1f.js => 6873f895.240d8b66.js} | 2 +- ...e09a0.de7c9bdf.js => 6cfe09a0.ac033cb3.js} | 2 +- ...1adf5.95872f78.js => 7071adf5.8479f3f3.js} | 2 +- assets/js/72054e31.251cbe36.js | 1 - assets/js/72054e31.855d44cc.js | 1 + ...70af4.ecf20609.js => 74470af4.182cfd03.js} | 2 +- ...41d11.a746d816.js => 75c41d11.4c49f3fa.js} | 2 +- ...c86b2.bde2ce98.js => 793c86b2.8a6806e5.js} | 2 +- ...4477a.c470cba2.js => 7a24477a.313ad2fb.js} | 2 +- ...fb106.a883ee2e.js => 7c1fb106.4e5283bc.js} | 2 +- ...100d6.2cf6c6ac.js => 7e4100d6.6a9680f6.js} | 2 +- assets/js/814f3328.55779541.js | 1 - assets/js/814f3328.6bedb449.js | 1 + ...0a22d.69e63e2e.js => 8490a22d.246da908.js} | 2 +- ...83a8c.bafc94c1.js => 88a83a8c.edbaa425.js} | 2 +- assets/js/8d193990.043ec1a8.js | 1 - assets/js/8d193990.e1e40f22.js | 1 + ...d5b32.6f81261a.js => 8e3d5b32.c1cc1aff.js} | 2 +- ...61970.06f1c4da.js => 8e861970.2715b317.js} | 2 +- ...86580.28508e9f.js => 8e886580.36d0b6a0.js} | 2 +- ...4d474.0391793d.js => 9284d474.3452b32d.js} | 2 +- ...d9ca4.55aa0c2e.js => 947d9ca4.505bb376.js} | 2 +- ...5dea6.0af7d56a.js => 9485dea6.59d263e8.js} | 2 +- ...f6484.0f0acc9e.js => 96af6484.f3226ae3.js} | 2 +- ...623e4.3b3f604c.js => 97c623e4.6a7ed37a.js} | 2 +- ...edda9.0b5c3ec1.js => 99bedda9.6a2ba6cc.js} | 2 +- ...bfad9.81af100c.js => a05bfad9.2f3ed7e3.js} | 2 +- ...8ef57.5d991b89.js => a398ef57.9832f269.js} | 2 +- assets/js/a52026b8.40d64115.js | 1 - assets/js/a52026b8.d25a67cc.js | 1 + assets/js/a6c0fb2f.5ab50382.js | 1 + ...19215.cb4c5849.js => a9e19215.3b9c4111.js} | 2 +- ...9b7a6.5e1cab36.js => ab89b7a6.d3839f29.js} | 2 +- ...05e99.18961e3e.js => ad205e99.f433409d.js} | 2 +- ...02412.74391d0c.js => b4302412.5cf034b0.js} | 2 +- ...66232.edfec4ef.js => baa66232.1385fffd.js} | 2 +- ...1b6e8.007ddec7.js => baf1b6e8.7ca3494f.js} | 2 +- ...ac66b.06e6569a.js => be4ac66b.ecca28df.js} | 2 +- ...9d003.90908041.js => be79d003.3fa5336d.js} | 2 +- ...d9823.50145b1a.js => c15d9823.bd5c9de5.js} | 2 +- ...c138b.d801b250.js => c55c138b.d4901da8.js} | 2 +- ...e29d4.476afa6b.js => c5de29d4.62c2e63d.js} | 2 +- ...1a3f4.fbdbc69c.js => c9c1a3f4.86924b51.js} | 2 +- ...891e2.0b18e5be.js => cca891e2.62ee8e8c.js} | 2 +- ...855c1.731f708b.js => ce4855c1.2ba31148.js} | 2 +- ...10a63.fc9527ff.js => cec10a63.af6f885d.js} | 2 +- ...f7e62.ec65eead.js => d00f7e62.5566e19e.js} | 2 +- ...2faf6.63069d38.js => d0d2faf6.fce96d12.js} | 2 +- assets/js/d20919b7.02c2f2df.js | 1 + assets/js/d2363c7a.3ca2df4f.js | 1 + ...62887.0677ce0c.js => d4762887.6a978042.js} | 2 +- ...70106.e6cc6c2e.js => d5670106.51fe485e.js} | 2 +- assets/js/da0423b8.d2dff3fd.js | 1 + ...d6b33.d5c00ad6.js => dabd6b33.131692ae.js} | 2 +- ...41e4a.a13163e3.js => ddc41e4a.575fe33b.js} | 2 +- ...3e94b.b47a651b.js => e083e94b.4c5e9658.js} | 2 +- ...34e95.3396276f.js => e4134e95.e4a2ef15.js} | 2 +- ...95530.5122f73c.js => e5595530.7a048164.js} | 2 +- ...74ba1.3fba08a5.js => eb074ba1.262484bb.js} | 2 +- ...e4367.046451b6.js => ec4e4367.94c4bdbd.js} | 2 +- assets/js/ecdeb26c.7d2b7ea3.js | 1 - assets/js/ecdeb26c.df2e94ce.js | 1 + ...a5927.28def90f.js => ed2a5927.0861dec6.js} | 2 +- assets/js/ef8b811a.5c57c19d.js | 1 + assets/js/ef8b811a.ab1b8ff6.js | 1 - ...29c21.6441b410.js => f0629c21.1ae44bab.js} | 2 +- ...13e1b.d545ae72.js => f1d13e1b.673f76b1.js} | 2 +- assets/js/f35b91b6.0a1e43f9.js | 1 - assets/js/f35b91b6.239937fe.js | 1 + ...58343.c7693eda.js => f3d58343.c90fcc92.js} | 2 +- ...a4739.ac558a14.js => f4aa4739.beb02c05.js} | 2 +- ...9601b.91426ff9.js => f4c9601b.262d90be.js} | 2 +- ...aa2b4.a6966a98.js => f6faa2b4.a11f6d9a.js} | 2 +- assets/js/f81c1134.1a4cc4cb.js | 1 - assets/js/f81c1134.ac31f1df.js | 1 + ...d8223.db925b05.js => f8dd8223.0f285722.js} | 2 +- ...dc457.75a60bc1.js => fb6dc457.c69a7694.js} | 2 +- ...d634e.d61ceef3.js => fb8d634e.0e14772e.js} | 2 +- ...33b73.9d462a0e.js => fc733b73.108abd58.js} | 2 +- assets/js/fe13418f.ea789d98.js | 1 + assets/js/main.30095a43.js | 2 - assets/js/main.7b021143.js | 2 + ...CENSE.txt => main.7b021143.js.LICENSE.txt} | 0 assets/js/runtime~main.835f1080.js | 1 - assets/js/runtime~main.83b596e3.js | 1 + blog/archive/index.html | 6 +-- blog/atom.xml | 43 ++++++++++++++++++- blog/authors/alfi/index.html | 14 ++++++ blog/authors/david/index.html | 6 +-- blog/authors/index.html | 6 +-- blog/authors/joey/index.html | 6 +-- blog/clean-clean-clean/index.html | 40 +++++++++++++++++ blog/don't-call-me-mate-pal/index.html | 8 ++-- blog/eopkg-is-dead-long-live-eopkg/index.html | 8 ++-- blog/index.html | 10 ++--- blog/rss.xml | 40 ++++++++++++++++- blog/solus-optimizing-packages/index.html | 10 ++--- blog/tags/3/index.html | 6 +-- blog/tags/clang/index.html | 6 +-- blog/tags/cleanup/index.html | 14 ++++++ blog/tags/devlog/index.html | 10 ++--- blog/tags/eopkg/index.html | 6 +-- blog/tags/firstpost/index.html | 6 +-- blog/tags/glibc/index.html | 6 +-- blog/tags/gnu/index.html | 6 +-- blog/tags/hello/index.html | 6 +-- blog/tags/housekeeping/index.html | 14 ++++++ blog/tags/hwcaps/index.html | 6 +-- blog/tags/index.html | 6 +-- blog/tags/llvm/index.html | 6 +-- blog/tags/lto/index.html | 6 +-- blog/tags/mate/index.html | 6 +-- blog/tags/moss/index.html | 6 +-- blog/tags/optimization/index.html | 6 +-- blog/tags/packaging/index.html | 6 +-- blog/tags/pgo/index.html | 6 +-- blog/tags/solus/index.html | 10 ++--- blog/tags/x-86-64-v-3/index.html | 6 +-- blog/welcome-solus-devlog-v1/index.html | 8 ++-- .../advanced-configuration/index.html | 4 +- docs/category/camera/index.html | 4 +- docs/category/compatibility/index.html | 4 +- docs/category/contributing/index.html | 4 +- docs/category/localization/index.html | 4 +- docs/category/mobile/index.html | 4 +- docs/category/networking/index.html | 4 +- docs/category/package-management/index.html | 4 +- docs/category/peripherals/index.html | 4 +- docs/category/procedures/index.html | 4 +- docs/category/quick-start/index.html | 4 +- docs/category/software/index.html | 4 +- docs/category/utilities/index.html | 4 +- docs/category/virtualization/index.html | 4 +- docs/category/web/index.html | 4 +- .../eopkg-configuration/index.html | 6 +-- .../local-repository/index.html | 6 +-- docs/packaging/appstream-metainfo/index.html | 6 +-- .../creating-a-new-package/index.html | 6 +-- docs/packaging/git-basics/index.html | 6 +-- docs/packaging/index.html | 6 +-- docs/packaging/monitoring.yml/index.html | 6 +-- docs/packaging/package.yml/index.html | 6 +-- docs/packaging/packaging-changes/index.html | 6 +-- docs/packaging/packaging-practices/index.html | 6 +-- .../prepare-for-packaging/index.html | 6 +-- .../procedures/maintainership/index.html | 6 +-- .../procedures/package-inclusion/index.html | 6 +-- .../procedures/release-processes/index.html | 6 +-- .../request-a-package-update/index.html | 6 +-- .../procedures/request-a-package/index.html | 6 +-- docs/packaging/stack-rebuilds/index.html | 6 +-- .../submitting-a-pull-request/index.html | 6 +-- docs/packaging/testing-a-package/index.html | 6 +-- .../translation-instructions/index.html | 6 +-- .../troubleshooting-packaging/index.html | 6 +-- .../update-dev-environment/index.html | 6 +-- .../updating-an-existing-package/index.html | 6 +-- .../your-first-package-update/index.html | 6 +-- .../community-guidelines/index.html | 6 +-- .../contributing/getting-involved/index.html | 6 +-- docs/user/contributing/style/index.html | 6 +-- .../contributing/testing-an-iso/index.html | 6 +-- .../editions/budgie/configuration/index.html | 6 +-- docs/user/editions/budgie/index.html | 6 +-- .../budgie/tips-and-tricks/index.html | 6 +-- .../editions/gnome/configuration/index.html | 6 +-- docs/user/editions/gnome/index.html | 6 +-- .../editions/gnome/tips-and-tricks/index.html | 6 +-- docs/user/editions/index.html | 6 +-- .../editions/mate/configuration/index.html | 6 +-- docs/user/editions/mate/index.html | 6 +-- .../editions/mate/tips-and-tricks/index.html | 6 +-- .../editions/plasma/configuration/index.html | 6 +-- docs/user/editions/plasma/index.html | 6 +-- .../plasma/tips-and-tricks/index.html | 6 +-- .../editions/xfce/configuration/index.html | 6 +-- docs/user/editions/xfce/index.html | 6 +-- .../editions/xfce/tips-and-tricks/index.html | 6 +-- .../hardware/compatibility/laptops/index.html | 6 +-- .../hardware/compatibility/wifi/index.html | 6 +-- docs/user/hardware/index.html | 6 +-- docs/user/hardware/mobile/android/index.html | 6 +-- docs/user/hardware/mobile/apple/index.html | 6 +-- .../peripherals/mice-and-touchpads/index.html | 6 +-- .../peripherals/midi-keyboard/index.html | 6 +-- .../printers-and-scanners/index.html | 6 +-- docs/user/intro/index.html | 6 +-- .../user/package-management/basics/index.html | 6 +-- .../history-and-rollback/index.html | 6 +-- .../repo-management/index.html | 6 +-- docs/user/privacy/index.html | 6 +-- .../quick-start/boot-management/index.html | 6 +-- .../default-applications/index.html | 6 +-- .../quick-start/installation/disks/index.html | 6 +-- docs/user/quick-start/installation/index.html | 6 +-- .../installation/secure-boot/index.html | 6 +-- .../system-requirements/index.html | 6 +-- .../quick-start/software-center/index.html | 6 +-- docs/user/software/camera/droidcam/index.html | 6 +-- docs/user/software/command-line/index.html | 6 +-- .../software/configuration_files/index.html | 6 +-- docs/user/software/desktops/index.html | 6 +-- .../development/containers/index.html | 6 +-- docs/user/software/development/index.html | 6 +-- .../user/software/development/java/index.html | 6 +-- .../development/postgresql/index.html | 6 +-- .../development/r-and-rstudio/index.html | 6 +-- .../user/software/development/rust/index.html | 6 +-- docs/user/software/development/web/index.html | 6 +-- docs/user/software/gaming/index.html | 6 +-- .../software/localization/ibus/index.html | 6 +-- .../user/software/networking/samba/index.html | 6 +-- .../software/networking/tigervnc/index.html | 6 +-- .../software/networking/wireshark/index.html | 6 +-- docs/user/software/networking/xrdp/index.html | 6 +-- docs/user/software/sound/index.html | 6 +-- docs/user/software/third-party/index.html | 6 +-- .../user/software/third-party/snap/index.html | 6 +-- .../software/utilities/ksysguard/index.html | 6 +-- .../software/utilities/kwallet/index.html | 6 +-- .../virtualization/virtualbox/index.html | 6 +-- docs/user/software/web/obs/index.html | 6 +-- .../troubleshooting/boot-rescue/index.html | 6 +-- docs/user/troubleshooting/index.html | 6 +-- .../troubleshooting/installation/index.html | 6 +-- docs/user/troubleshooting/plasma/index.html | 6 +-- index.html | 4 +- search-index-blog_authors_posts.json | 2 +- search-index-default.json | 2 +- search-index-docs-default-current.json | 2 +- sitemap.xml | 2 +- 278 files changed, 689 insertions(+), 523 deletions(-) rename assets/js/{04b18502.acee4281.js => 04b18502.fb736ad1.js} (98%) rename assets/js/{05767842.f76e9175.js => 05767842.2aaac066.js} (52%) rename assets/js/{080a8349.58f2285a.js => 080a8349.768a43bc.js} (99%) rename assets/js/{08bef15d.0fc1910a.js => 08bef15d.3b51e378.js} (98%) rename assets/js/{09dbd43b.476a700a.js => 09dbd43b.6760537d.js} (99%) rename assets/js/{0b254e3a.b3f72544.js => 0b254e3a.bda17182.js} (99%) rename assets/js/{0e3c5e6b.1a55516f.js => 0e3c5e6b.b2b6a196.js} (98%) rename assets/js/{0e862883.e57e73d4.js => 0e862883.c6b8fd5f.js} (97%) rename assets/js/{14488e92.5b7975e1.js => 14488e92.1f235025.js} (99%) rename assets/js/{1a698c37.ed861371.js => 1a698c37.611eff98.js} (98%) rename assets/js/{1ae709a2.86ed44e0.js => 1ae709a2.44927e04.js} (98%) rename assets/js/{21944812.6adc0d53.js => 21944812.a0a566e2.js} (99%) rename assets/js/{257b9082.64a94637.js => 257b9082.2e7b10e9.js} (98%) rename assets/js/{2598a3a5.91df6f56.js => 2598a3a5.c3208c71.js} (99%) rename assets/js/{2609550e.8431025b.js => 2609550e.ae2836f2.js} (99%) rename assets/js/{26308ea3.5bba2662.js => 26308ea3.3ef577e8.js} (99%) rename assets/js/{2a0f90eb.cdffec6b.js => 2a0f90eb.493adcbc.js} (55%) rename assets/js/{2a34ce22.59508d8f.js => 2a34ce22.6a00fac3.js} (98%) rename assets/js/{2a37c7d8.c20b4d40.js => 2a37c7d8.fcae30d8.js} (99%) rename assets/js/{2b4abe09.3ece8fc5.js => 2b4abe09.218c0bc6.js} (99%) rename assets/js/{2b61a93c.cf6aa1b4.js => 2b61a93c.c529ff35.js} (96%) rename assets/js/{2c3e84bd.d8e1bbcf.js => 2c3e84bd.cc61acc1.js} (98%) rename assets/js/{38920c38.c3bb4798.js => 38920c38.aa4aa254.js} (99%) create mode 100644 assets/js/3a2db09e.844e4be4.js delete mode 100644 assets/js/3a2db09e.bd0b6bc5.js rename assets/js/{3fdfc7ff.faa6fafd.js => 3fdfc7ff.0f2beccb.js} (98%) rename assets/js/{3ff05326.9f3e5519.js => 3ff05326.f1df6790.js} (99%) create mode 100644 assets/js/418a6276.42385bff.js delete mode 100644 assets/js/418a6276.bc82d44b.js rename assets/js/{41a4de91.c6e74657.js => 41a4de91.ae57e1b1.js} (99%) delete mode 100644 assets/js/424f562c.8c8592ca.js create mode 100644 assets/js/424f562c.af0382ed.js rename assets/js/{45e9d313.1a78f7ac.js => 45e9d313.43558a74.js} (98%) rename assets/js/{46a65d96.99a6e32d.js => 46a65d96.97bfd57f.js} (98%) delete mode 100644 assets/js/4802fa93.42ab49a1.js create mode 100644 assets/js/4802fa93.68b985c8.js rename assets/js/{49b71c16.14dff61b.js => 49b71c16.dfd61da5.js} (99%) rename assets/js/{513b6405.07a2f1ca.js => 513b6405.4ada61ee.js} (99%) rename assets/js/{528b6a6b.6bd7ed5f.js => 528b6a6b.37e18ccf.js} (98%) rename assets/js/{533eefa9.2deb3749.js => 533eefa9.69b673fa.js} (99%) rename assets/js/{5685b4d8.779151ba.js => 5685b4d8.096f851a.js} (96%) rename assets/js/{5b7f3753.1a9fe7e9.js => 5b7f3753.dd9a94b3.js} (98%) rename assets/js/{5f194406.74e8cf88.js => 5f194406.ad4c1306.js} (99%) rename assets/js/{61c953b4.e1437d06.js => 61c953b4.ca4b1080.js} (99%) rename assets/js/{64699048.9858ebd9.js => 64699048.ea4f9bba.js} (98%) rename assets/js/{6787574e.1482e835.js => 6787574e.5388a897.js} (99%) rename assets/js/{6873f895.73ae0d1f.js => 6873f895.240d8b66.js} (99%) rename assets/js/{6cfe09a0.de7c9bdf.js => 6cfe09a0.ac033cb3.js} (98%) rename assets/js/{7071adf5.95872f78.js => 7071adf5.8479f3f3.js} (99%) delete mode 100644 assets/js/72054e31.251cbe36.js create mode 100644 assets/js/72054e31.855d44cc.js rename assets/js/{74470af4.ecf20609.js => 74470af4.182cfd03.js} (99%) rename assets/js/{75c41d11.a746d816.js => 75c41d11.4c49f3fa.js} (94%) rename assets/js/{793c86b2.bde2ce98.js => 793c86b2.8a6806e5.js} (99%) rename assets/js/{7a24477a.c470cba2.js => 7a24477a.313ad2fb.js} (99%) rename assets/js/{7c1fb106.a883ee2e.js => 7c1fb106.4e5283bc.js} (99%) rename assets/js/{7e4100d6.2cf6c6ac.js => 7e4100d6.6a9680f6.js} (98%) delete mode 100644 assets/js/814f3328.55779541.js create mode 100644 assets/js/814f3328.6bedb449.js rename assets/js/{8490a22d.69e63e2e.js => 8490a22d.246da908.js} (99%) rename assets/js/{88a83a8c.bafc94c1.js => 88a83a8c.edbaa425.js} (99%) delete mode 100644 assets/js/8d193990.043ec1a8.js create mode 100644 assets/js/8d193990.e1e40f22.js rename assets/js/{8e3d5b32.6f81261a.js => 8e3d5b32.c1cc1aff.js} (98%) rename assets/js/{8e861970.06f1c4da.js => 8e861970.2715b317.js} (98%) rename assets/js/{8e886580.28508e9f.js => 8e886580.36d0b6a0.js} (98%) rename assets/js/{9284d474.0391793d.js => 9284d474.3452b32d.js} (99%) rename assets/js/{947d9ca4.55aa0c2e.js => 947d9ca4.505bb376.js} (99%) rename assets/js/{9485dea6.0af7d56a.js => 9485dea6.59d263e8.js} (97%) rename assets/js/{96af6484.0f0acc9e.js => 96af6484.f3226ae3.js} (98%) rename assets/js/{97c623e4.3b3f604c.js => 97c623e4.6a7ed37a.js} (98%) rename assets/js/{99bedda9.0b5c3ec1.js => 99bedda9.6a2ba6cc.js} (99%) rename assets/js/{a05bfad9.81af100c.js => a05bfad9.2f3ed7e3.js} (98%) rename assets/js/{a398ef57.5d991b89.js => a398ef57.9832f269.js} (98%) delete mode 100644 assets/js/a52026b8.40d64115.js create mode 100644 assets/js/a52026b8.d25a67cc.js create mode 100644 assets/js/a6c0fb2f.5ab50382.js rename assets/js/{a9e19215.cb4c5849.js => a9e19215.3b9c4111.js} (98%) rename assets/js/{ab89b7a6.5e1cab36.js => ab89b7a6.d3839f29.js} (97%) rename assets/js/{ad205e99.18961e3e.js => ad205e99.f433409d.js} (99%) rename assets/js/{b4302412.74391d0c.js => b4302412.5cf034b0.js} (94%) rename assets/js/{baa66232.edfec4ef.js => baa66232.1385fffd.js} (98%) rename assets/js/{baf1b6e8.007ddec7.js => baf1b6e8.7ca3494f.js} (97%) rename assets/js/{be4ac66b.06e6569a.js => be4ac66b.ecca28df.js} (99%) rename assets/js/{be79d003.90908041.js => be79d003.3fa5336d.js} (98%) rename assets/js/{c15d9823.50145b1a.js => c15d9823.bd5c9de5.js} (76%) rename assets/js/{c55c138b.d801b250.js => c55c138b.d4901da8.js} (99%) rename assets/js/{c5de29d4.476afa6b.js => c5de29d4.62c2e63d.js} (99%) rename assets/js/{c9c1a3f4.fbdbc69c.js => c9c1a3f4.86924b51.js} (99%) rename assets/js/{cca891e2.0b18e5be.js => cca891e2.62ee8e8c.js} (99%) rename assets/js/{ce4855c1.731f708b.js => ce4855c1.2ba31148.js} (98%) rename assets/js/{cec10a63.fc9527ff.js => cec10a63.af6f885d.js} (99%) rename assets/js/{d00f7e62.ec65eead.js => d00f7e62.5566e19e.js} (99%) rename assets/js/{d0d2faf6.63069d38.js => d0d2faf6.fce96d12.js} (98%) create mode 100644 assets/js/d20919b7.02c2f2df.js create mode 100644 assets/js/d2363c7a.3ca2df4f.js rename assets/js/{d4762887.0677ce0c.js => d4762887.6a978042.js} (98%) rename assets/js/{d5670106.e6cc6c2e.js => d5670106.51fe485e.js} (99%) create mode 100644 assets/js/da0423b8.d2dff3fd.js rename assets/js/{dabd6b33.d5c00ad6.js => dabd6b33.131692ae.js} (98%) rename assets/js/{ddc41e4a.a13163e3.js => ddc41e4a.575fe33b.js} (93%) rename assets/js/{e083e94b.b47a651b.js => e083e94b.4c5e9658.js} (98%) rename assets/js/{e4134e95.3396276f.js => e4134e95.e4a2ef15.js} (55%) rename assets/js/{e5595530.5122f73c.js => e5595530.7a048164.js} (99%) rename assets/js/{eb074ba1.3fba08a5.js => eb074ba1.262484bb.js} (99%) rename assets/js/{ec4e4367.046451b6.js => ec4e4367.94c4bdbd.js} (97%) delete mode 100644 assets/js/ecdeb26c.7d2b7ea3.js create mode 100644 assets/js/ecdeb26c.df2e94ce.js rename assets/js/{ed2a5927.28def90f.js => ed2a5927.0861dec6.js} (97%) create mode 100644 assets/js/ef8b811a.5c57c19d.js delete mode 100644 assets/js/ef8b811a.ab1b8ff6.js rename assets/js/{f0629c21.6441b410.js => f0629c21.1ae44bab.js} (99%) rename assets/js/{f1d13e1b.d545ae72.js => f1d13e1b.673f76b1.js} (94%) delete mode 100644 assets/js/f35b91b6.0a1e43f9.js create mode 100644 assets/js/f35b91b6.239937fe.js rename assets/js/{f3d58343.c7693eda.js => f3d58343.c90fcc92.js} (56%) rename assets/js/{f4aa4739.ac558a14.js => f4aa4739.beb02c05.js} (97%) rename assets/js/{f4c9601b.91426ff9.js => f4c9601b.262d90be.js} (99%) rename assets/js/{f6faa2b4.a6966a98.js => f6faa2b4.a11f6d9a.js} (98%) delete mode 100644 assets/js/f81c1134.1a4cc4cb.js create mode 100644 assets/js/f81c1134.ac31f1df.js rename assets/js/{f8dd8223.db925b05.js => f8dd8223.0f285722.js} (98%) rename assets/js/{fb6dc457.75a60bc1.js => fb6dc457.c69a7694.js} (99%) rename assets/js/{fb8d634e.d61ceef3.js => fb8d634e.0e14772e.js} (97%) rename assets/js/{fc733b73.9d462a0e.js => fc733b73.108abd58.js} (99%) create mode 100644 assets/js/fe13418f.ea789d98.js delete mode 100644 assets/js/main.30095a43.js create mode 100644 assets/js/main.7b021143.js rename assets/js/{main.30095a43.js.LICENSE.txt => main.7b021143.js.LICENSE.txt} (100%) delete mode 100644 assets/js/runtime~main.835f1080.js create mode 100644 assets/js/runtime~main.83b596e3.js create mode 100644 blog/authors/alfi/index.html create mode 100644 blog/clean-clean-clean/index.html create mode 100644 blog/tags/cleanup/index.html create mode 100644 blog/tags/housekeeping/index.html diff --git a/404.html b/404.html index 20ff3c5b4..f4d8cc911 100644 --- a/404.html +++ b/404.html @@ -5,8 +5,8 @@ Page Not Found | Solus Help Center - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

diff --git a/assets/js/04b18502.acee4281.js b/assets/js/04b18502.fb736ad1.js similarity index 98% rename from assets/js/04b18502.acee4281.js rename to assets/js/04b18502.fb736ad1.js index d22981df0..eb87ea83e 100644 --- a/assets/js/04b18502.acee4281.js +++ b/assets/js/04b18502.fb736ad1.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1942],{37123:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>o,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var i=n(85893),t=n(11151);const r={title:"Packaging Overview",summary:"Steps for setting up a packaging environment and submitting packages",sidebar_position:0},s="Packaging Overview",c={id:"packaging/index",title:"Packaging Overview",description:"This is the overall workflow for creating or updating a package.",source:"@site/docs/packaging/index.md",sourceDirName:"packaging",slug:"/packaging/",permalink:"/docs/packaging/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,sidebarPosition:0,frontMatter:{title:"Packaging Overview",summary:"Steps for setting up a packaging environment and submitting packages",sidebar_position:0},sidebar:"packagingSidebar",next:{title:"Prepare for Packaging",permalink:"/docs/packaging/prepare-for-packaging"}},o={},l=[{value:"Development environment preparation",id:"development-environment-preparation",level:2},{value:"Prior to building a package",id:"prior-to-building-a-package",level:2},{value:"Building packages",id:"building-packages",level:2}];function g(e){const a={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,t.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(a.header,{children:(0,i.jsx)(a.h1,{id:"packaging-overview",children:"Packaging Overview"})}),"\n",(0,i.jsx)(a.p,{children:"This is the overall workflow for creating or updating a package."}),"\n",(0,i.jsx)(a.h2,{id:"development-environment-preparation",children:"Development environment preparation"}),"\n",(0,i.jsxs)(a.ol,{children:["\n",(0,i.jsx)(a.li,{children:(0,i.jsx)(a.a,{href:"/docs/packaging/prepare-for-packaging",children:"Prepare for Packaging"})}),"\n",(0,i.jsxs)(a.li,{children:["Review the ",(0,i.jsx)(a.a,{href:"/docs/packaging/package.yml",children:"requirements for the package.yml file"}),"."]}),"\n",(0,i.jsxs)(a.li,{children:["Also review our ",(0,i.jsx)(a.a,{href:"/docs/packaging/packaging-practices",children:"Packaging Practices"}),"."]}),"\n"]}),"\n",(0,i.jsx)(a.h2,{id:"prior-to-building-a-package",children:"Prior to building a package"}),"\n",(0,i.jsx)(a.p,{children:"Please check the following:"}),"\n",(0,i.jsxs)(a.ul,{children:["\n",(0,i.jsxs)(a.li,{children:["Search ",(0,i.jsx)(a.a,{href:"https://github.com/getsolus/packages/issues?q=label%3A%22Package+Request%22",children:"open package requests"})," to see if there is one for the package. If there isn't an existing issue, go ahead and submit your pull request. If there is already a pull request, please check its status to avoid duplicating work."]}),"\n",(0,i.jsxs)(a.li,{children:["If you are submitting a pull request for the inclusion of software in the repo, the package has a corresponding package request that is ",(0,i.jsx)(a.strong,{children:"accepted for inclusion"})," or is a dependency of a package that has been accepted into the repository."]}),"\n"]}),"\n",(0,i.jsx)(a.h2,{id:"building-packages",children:"Building packages"}),"\n",(0,i.jsxs)(a.ol,{children:["\n",(0,i.jsx)(a.li,{children:(0,i.jsx)(a.a,{href:"/docs/packaging/update-dev-environment",children:"Update your development environment"})}),"\n",(0,i.jsx)(a.li,{children:"Prepare the package directory and build the package"}),"\n"]}),"\n",(0,i.jsxs)(a.ul,{children:["\n",(0,i.jsxs)(a.li,{children:["For a new package that does not yet exist in the repos see ",(0,i.jsx)(a.a,{href:"/docs/packaging/creating-a-new-package",children:"Creating a New Package"})]}),"\n",(0,i.jsxs)(a.li,{children:["For updating a package that already is in the repos see ",(0,i.jsx)(a.a,{href:"/docs/packaging/updating-an-existing-package",children:"Updating an Existing Package"})]}),"\n"]}),"\n",(0,i.jsxs)(a.ol,{start:"3",children:["\n",(0,i.jsx)(a.li,{children:(0,i.jsx)(a.a,{href:"/docs/packaging/testing-a-package",children:"Test the Package"})}),"\n",(0,i.jsx)(a.li,{children:(0,i.jsx)(a.a,{href:"/docs/packaging/submitting-a-pull-request",children:"Submit a Pull Request for Review"})}),"\n"]})]})}function p(e={}){const{wrapper:a}={...(0,t.a)(),...e.components};return a?(0,i.jsx)(a,{...e,children:(0,i.jsx)(g,{...e})}):g(e)}},11151:(e,a,n)=>{n.d(a,{Z:()=>c,a:()=>s});var i=n(67294);const t={},r=i.createContext(t);function s(e){const a=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function c(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),i.createElement(r.Provider,{value:a},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1942],{37123:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>o,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var i=n(85893),t=n(11151);const r={title:"Packaging Overview",summary:"Steps for setting up a packaging environment and submitting packages",sidebar_position:0},s="Packaging Overview",c={id:"packaging/index",title:"Packaging Overview",description:"This is the overall workflow for creating or updating a package.",source:"@site/docs/packaging/index.md",sourceDirName:"packaging",slug:"/packaging/",permalink:"/docs/packaging/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,sidebarPosition:0,frontMatter:{title:"Packaging Overview",summary:"Steps for setting up a packaging environment and submitting packages",sidebar_position:0},sidebar:"packagingSidebar",next:{title:"Prepare for Packaging",permalink:"/docs/packaging/prepare-for-packaging"}},o={},l=[{value:"Development environment preparation",id:"development-environment-preparation",level:2},{value:"Prior to building a package",id:"prior-to-building-a-package",level:2},{value:"Building packages",id:"building-packages",level:2}];function g(e){const a={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,t.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(a.header,{children:(0,i.jsx)(a.h1,{id:"packaging-overview",children:"Packaging Overview"})}),"\n",(0,i.jsx)(a.p,{children:"This is the overall workflow for creating or updating a package."}),"\n",(0,i.jsx)(a.h2,{id:"development-environment-preparation",children:"Development environment preparation"}),"\n",(0,i.jsxs)(a.ol,{children:["\n",(0,i.jsx)(a.li,{children:(0,i.jsx)(a.a,{href:"/docs/packaging/prepare-for-packaging",children:"Prepare for Packaging"})}),"\n",(0,i.jsxs)(a.li,{children:["Review the ",(0,i.jsx)(a.a,{href:"/docs/packaging/package.yml",children:"requirements for the package.yml file"}),"."]}),"\n",(0,i.jsxs)(a.li,{children:["Also review our ",(0,i.jsx)(a.a,{href:"/docs/packaging/packaging-practices",children:"Packaging Practices"}),"."]}),"\n"]}),"\n",(0,i.jsx)(a.h2,{id:"prior-to-building-a-package",children:"Prior to building a package"}),"\n",(0,i.jsx)(a.p,{children:"Please check the following:"}),"\n",(0,i.jsxs)(a.ul,{children:["\n",(0,i.jsxs)(a.li,{children:["Search ",(0,i.jsx)(a.a,{href:"https://github.com/getsolus/packages/issues?q=label%3A%22Package+Request%22",children:"open package requests"})," to see if there is one for the package. If there isn't an existing issue, go ahead and submit your pull request. If there is already a pull request, please check its status to avoid duplicating work."]}),"\n",(0,i.jsxs)(a.li,{children:["If you are submitting a pull request for the inclusion of software in the repo, the package has a corresponding package request that is ",(0,i.jsx)(a.strong,{children:"accepted for inclusion"})," or is a dependency of a package that has been accepted into the repository."]}),"\n"]}),"\n",(0,i.jsx)(a.h2,{id:"building-packages",children:"Building packages"}),"\n",(0,i.jsxs)(a.ol,{children:["\n",(0,i.jsx)(a.li,{children:(0,i.jsx)(a.a,{href:"/docs/packaging/update-dev-environment",children:"Update your development environment"})}),"\n",(0,i.jsx)(a.li,{children:"Prepare the package directory and build the package"}),"\n"]}),"\n",(0,i.jsxs)(a.ul,{children:["\n",(0,i.jsxs)(a.li,{children:["For a new package that does not yet exist in the repos see ",(0,i.jsx)(a.a,{href:"/docs/packaging/creating-a-new-package",children:"Creating a New Package"})]}),"\n",(0,i.jsxs)(a.li,{children:["For updating a package that already is in the repos see ",(0,i.jsx)(a.a,{href:"/docs/packaging/updating-an-existing-package",children:"Updating an Existing Package"})]}),"\n"]}),"\n",(0,i.jsxs)(a.ol,{start:"3",children:["\n",(0,i.jsx)(a.li,{children:(0,i.jsx)(a.a,{href:"/docs/packaging/testing-a-package",children:"Test the Package"})}),"\n",(0,i.jsx)(a.li,{children:(0,i.jsx)(a.a,{href:"/docs/packaging/submitting-a-pull-request",children:"Submit a Pull Request for Review"})}),"\n"]})]})}function p(e={}){const{wrapper:a}={...(0,t.a)(),...e.components};return a?(0,i.jsx)(a,{...e,children:(0,i.jsx)(g,{...e})}):g(e)}},11151:(e,a,n)=>{n.d(a,{Z:()=>c,a:()=>s});var i=n(67294);const t={},r=i.createContext(t);function s(e){const a=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function c(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),i.createElement(r.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/05767842.f76e9175.js b/assets/js/05767842.2aaac066.js similarity index 52% rename from assets/js/05767842.f76e9175.js rename to assets/js/05767842.2aaac066.js index 1851431cb..af0a91b15 100644 --- a/assets/js/05767842.f76e9175.js +++ b/assets/js/05767842.2aaac066.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1606],{77755:e=>{e.exports=JSON.parse('{"author":{"name":"Joey Riches","title":"Solus Staff","page":{"permalink":"/blog/authors/joey"},"socials":{"github":"https://github.com/joebonrichie"},"imageURL":"https://avatars.githubusercontent.com/u/5338090?s=400&u=f77ed45c7e83814ce3e8bd199fc293bd5b53682b&v=4","key":"joey","count":2},"listMetadata":{"permalink":"/blog/authors/joey","page":1,"postsPerPage":2,"totalPages":1,"totalCount":2,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1606],{77755:e=>{e.exports=JSON.parse('{"author":{"name":"Joey Riches","title":"Solus Staff","page":{"permalink":"/blog/authors/joey"},"socials":{"github":"https://github.com/joebonrichie"},"imageURL":"https://avatars.githubusercontent.com/u/5338090","key":"joey","count":2},"listMetadata":{"permalink":"/blog/authors/joey","page":1,"postsPerPage":2,"totalPages":1,"totalCount":2,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/080a8349.58f2285a.js b/assets/js/080a8349.768a43bc.js similarity index 99% rename from assets/js/080a8349.58f2285a.js rename to assets/js/080a8349.768a43bc.js index 74ad423ef..f3ec350e6 100644 --- a/assets/js/080a8349.58f2285a.js +++ b/assets/js/080a8349.768a43bc.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[224],{92857:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>d,toc:()=>c});var i=s(85893),t=s(11151);const r={title:"Monitoring YAML",summary:"The purpose and format of monitoring.yml"},o="monitoring.yml",d={id:"packaging/monitoring.yml",title:"Monitoring YAML",description:"A monitoring.yml file is strongly suggested, but not yet required for Solus packages.",source:"@site/docs/packaging/monitoring.yml.md",sourceDirName:"packaging",slug:"/packaging/monitoring.yml",permalink:"/docs/packaging/monitoring.yml",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/monitoring.yml.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Monitoring YAML",summary:"The purpose and format of monitoring.yml"},sidebar:"packagingSidebar",previous:{title:"Git Basics",permalink:"/docs/packaging/git-basics"},next:{title:"Package YAML",permalink:"/docs/packaging/package.yml"}},a={},c=[{value:"Adding monitoring.yml to an existing package",id:"adding-monitoringyml-to-an-existing-package",level:2},{value:"systemd as an example",id:"systemd-as-an-example",level:2},{value:""releases" fields",id:"releases-fields",level:2},{value:"Finding the Anitya ID",id:"finding-the-anitya-id",level:3},{value:""security" fields",id:"security-fields",level:2},{value:"What is a CPE Name?",id:"what-is-a-cpe-name",level:3},{value:"Finding the CPE Name",id:"finding-the-cpe-name",level:3},{value:"No known CPE",id:"no-known-cpe",level:3}];function l(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"monitoringyml",children:(0,i.jsx)(n.code,{children:"monitoring.yml"})})}),"\n",(0,i.jsx)(n.admonition,{type:"important",children:(0,i.jsxs)(n.p,{children:["A ",(0,i.jsx)(n.code,{children:"monitoring.yml"})," file is strongly suggested, but not yet required for Solus packages."]})}),"\n",(0,i.jsxs)(n.p,{children:["A ",(0,i.jsx)(n.code,{children:"monitoring.yml"})," file is included in the Packages repository directory for every Solus package to enable automatic scanning for new releases and security advisories."]}),"\n",(0,i.jsxs)(n.p,{children:["Checking for new releases is done by mapping the Solus package to an ",(0,i.jsx)(n.a,{href:"https://github.com/fedora-infra/anitya",children:"Anitya"})," ID. ",(0,i.jsx)(n.em,{children:"Anitya"})," is a Red Hat project, part of ",(0,i.jsx)(n.a,{href:"https://release-monitoring.org/",children:"release-monitoring.org"})]}),"\n",(0,i.jsxs)(n.p,{children:["Checking for security advisories (",(0,i.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Common_Vulnerabilities_and_Exposures",children:"CVEs"}),"), is done by mapping the Solus package to a ",(0,i.jsx)(n.em,{children:"Common Platform Enumeration Name"})," (",(0,i.jsx)(n.a,{href:"https://nvd.nist.gov/products/cpe",children:"CPE"}),") from the National Vulnerability Database."]}),"\n",(0,i.jsx)(n.h2,{id:"adding-monitoringyml-to-an-existing-package",children:"Adding monitoring.yml to an existing package"}),"\n",(0,i.jsxs)(n.p,{children:["To add a ",(0,i.jsx)(n.code,{children:"monitoring.yml"})," file to an existing package you can use the following ",(0,i.jsx)(n.code,{children:"go-task"})," command to add a template file, starting from within the directory containing the ",(0,i.jsx)(n.code,{children:"package.yml"})," for a given package:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task add-monitoring\n"})}),"\n",(0,i.jsx)(n.p,{children:"Which will create a file with the following contents:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"releases:\n id: null # Check https://release-monitoring.org/\n rss: null # For example https://github.com/PyO3/maturin/releases.atom\n# No known CPE, checked 2024-04-24\nsecurity:\n cpe: ~\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You must, at minimum, fill out ",(0,i.jsx)(n.code,{children:"id"})," and check if the package has a ",(0,i.jsx)(n.a,{href:"#what-is-a-cpe-name",children:"CPE name"}),". ",(0,i.jsx)(n.code,{children:"rss"})," should be deleted if no feed is available."]}),"\n",(0,i.jsx)(n.h2,{id:"systemd-as-an-example",children:"systemd as an example"}),"\n",(0,i.jsxs)(n.p,{children:["Let's look at the ",(0,i.jsx)(n.code,{children:"monitoring.yml"})," file for ",(0,i.jsx)(n.code,{children:"systemd"})," as an example."]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"systemd"})," directory in the Packages repository looks like this:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"systemd\n\u251c\u2500\u2500 monitoring.yml\n\u251c\u2500\u2500 package.yml\n\u251c\u2500\u2500 pspec_x86_64.xml\n\u2514\u2500\u2500 *lots of other files we can ignore*\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"monitoring.yml"})," looks like this:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:'releases:\n id: 205088\n ignore:\n # We only update to the n-1 stable release. So for now we\'re only interested in 252.x updates\n - "253.*"\n rss: https://github.com/systemd/systemd-stable/tags.atom\nsecurity:\n cpe:\n - vendor: systemd_project\n product: systemd\n - vendor: freedesktop\n product: systemd\n ignore:\n # A non-existent CVE added here as an example\n - CVE-2022-55555\n'})}),"\n",(0,i.jsx)(n.h2,{id:"releases-fields",children:'"releases" fields'}),"\n",(0,i.jsx)(n.p,{children:"Fields used to monitor for new versions."}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Field"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required ?"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"id"})}),(0,i.jsx)(n.td,{children:"integer"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsxs)(n.td,{children:["Anitya ID from ",(0,i.jsx)(n.a,{href:"https://release-monitoring.org/",children:"release-monitoring.org"})]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"ignore"})}),(0,i.jsx)(n.td,{children:"list of regular expressions"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"List of regular expressions enclosed in quotes matching versions to ignore. Include a comment explaining the ignored versions."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"rss"})}),(0,i.jsx)(n.td,{children:"URL"}),(0,i.jsx)(n.td,{children:"No, strongly encouraged"}),(0,i.jsxs)(n.td,{children:['URL for a releases RSS feed. If the only RSS feed you can find for a project is a general "news" feed, don\'t include the field. For GitHub projects, you can use the "tags" or "releases" feed: ',(0,i.jsx)(n.code,{children:"https://github.com/USER/REPOSITORY/tagsORreleases.atom"})]})]})]})]}),"\n",(0,i.jsx)(n.h3,{id:"finding-the-anitya-id",children:"Finding the Anitya ID"}),"\n",(0,i.jsxs)(n.p,{children:["To find the Anitya ID, search ",(0,i.jsx)(n.a,{href:"https://release-monitoring.org/",children:"release-monitoring.org"})," by project name, then take the ID out of the URL for the correct search result."]}),"\n",(0,i.jsxs)(n.p,{children:["For example, the correct ",(0,i.jsx)(n.code,{children:"systemd"})," search result for us is ",(0,i.jsx)(n.code,{children:"systemd-stable"})," with the URL ",(0,i.jsx)(n.a,{href:"https://release-monitoring.org/project/205088/",children:"https://release-monitoring.org/project/205088/"}),", so we use ",(0,i.jsx)(n.code,{children:"205088"})," in the ",(0,i.jsx)(n.code,{children:"id"})," field"]}),"\n",(0,i.jsxs)(n.p,{children:["If a project is not tracked by release-monitoring.org, you can create an account and ",(0,i.jsx)(n.a,{href:"https://release-monitoring.org/static/docs/user-guide.html#creating-new-project",children:"add it."})]}),"\n",(0,i.jsx)(n.h2,{id:"security-fields",children:'"security" fields'}),"\n",(0,i.jsx)(n.p,{children:"Fields used to monitor for security advisories (CVEs)"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Field"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required ?"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"cpe"})}),(0,i.jsx)(n.td,{children:"list"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsxs)(n.td,{children:["List of ",(0,i.jsx)(n.code,{children:"vendor:product"})," pairs from a full CPE name. CVEs for a given project may be published under more than one CPE; include more than one if that is likely."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"ignore"})}),(0,i.jsx)(n.td,{children:"list of strings"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"List of specific CVE identifiers which can be ignored, including a comment explaining why each CVE was ignored. As an example, a CVE can be ignored if the Solus package includes a patch fixing the CVE."})]})]})]}),"\n",(0,i.jsx)(n.h3,{id:"what-is-a-cpe-name",children:"What is a CPE Name?"}),"\n",(0,i.jsxs)(n.p,{children:["A ",(0,i.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Common_Platform_Enumeration",children:"CPE Name"})," is a structured naming scheme for information technology systems, primarily used to search for CVEs."]}),"\n",(0,i.jsx)(n.p,{children:"CPE names contain redundant information we can ignore, we are only interested in the vendor and the product."}),"\n",(0,i.jsxs)(n.p,{children:["For example, ",(0,i.jsx)(n.code,{children:"cpe:2.3:a:systemd_project:systemd"})," is the CPE for the ",(0,i.jsx)(n.em,{children:"vendor"})," ",(0,i.jsx)(n.code,{children:"systemd_project"}),", and the ",(0,i.jsx)(n.em,{children:"product"})," ",(0,i.jsx)(n.code,{children:"systemd"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"finding-the-cpe-name",children:"Finding the CPE Name"}),"\n",(0,i.jsxs)(n.p,{children:["The easiest way to search for CPE Names is with the following command; replacing ",(0,i.jsx)(n.code,{children:"systemd"})," with your search term:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'curl -s -X POST https://cpe-guesser.cve-search.org/search -d "{\\"query\\": [\\"systemd\\"]}" | jq .\n'})}),"\n",(0,i.jsxs)(n.p,{children:["Note this command uses the ",(0,i.jsx)(n.code,{children:"jq"})," tool, which you may not have installed:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it jq\n"})}),"\n",(0,i.jsxs)(n.p,{children:["If you have our ",(0,i.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#set-up-repository-helper-functions-optional",children:"helper functions"})," installed, you can use the following command:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cpesearch systemd\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsx)(n.p,{children:'Convert your search term to lower case and try variations on the search term if you get no results. The CPE search is not a "fuzzy" search.'})}),"\n",(0,i.jsx)(n.p,{children:"The command returns the following:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:'[\n [\n 49192,\n "cpe:2.3:a:ubuntu_developers:systemd"\n ],\n [\n 116392,\n "cpe:2.3:a:lennart_poettering:systemd"\n ],\n [\n 120506,\n "cpe:2.3:a:freedesktop:systemd"\n ],\n [\n 120627,\n "cpe:2.3:a:systemd_project:systemd"\n ]\n]\n'})}),"\n",(0,i.jsx)(n.p,{children:"Ignore the numerical ids, let's walk through the CPEs by vendor:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"ubuntu_developers"})," is for ",(0,i.jsx)(n.code,{children:"systemd"})," patched by Ubuntu; we can ignore it"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"lennart_poettering"})," is for the main ",(0,i.jsx)(n.code,{children:"systemd"})," developer and is probably a bleeding edge vendor; ignore it"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"freedesktop"})," is from freedesktop.org and is a good candidate, so we add it"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"systemd_project"})," is a good candidate, so we add it"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"no-known-cpe",children:"No known CPE"}),"\n",(0,i.jsx)(n.p,{children:"If an established product hasn't had a security advisory in the past, it might not have a CPE."}),"\n",(0,i.jsxs)(n.p,{children:["In that case, include an empty ",(0,i.jsx)(n.code,{children:"security"})," and ",(0,i.jsx)(n.code,{children:"cpe"})," field with a comment in the following format:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"# No known CPE, checked 2024-01-23\nsecurity:\n cpe: ~\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsx)(n.p,{children:"If you are unsure of what to do in this case, feel free to ask in the Solus Packaging Matrix room."})})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},11151:(e,n,s)=>{s.d(n,{Z:()=>d,a:()=>o});var i=s(67294);const t={},r=i.createContext(t);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[224],{92857:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>d,toc:()=>c});var i=s(85893),t=s(11151);const r={title:"Monitoring YAML",summary:"The purpose and format of monitoring.yml"},o="monitoring.yml",d={id:"packaging/monitoring.yml",title:"Monitoring YAML",description:"A monitoring.yml file is strongly suggested, but not yet required for Solus packages.",source:"@site/docs/packaging/monitoring.yml.md",sourceDirName:"packaging",slug:"/packaging/monitoring.yml",permalink:"/docs/packaging/monitoring.yml",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/monitoring.yml.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Monitoring YAML",summary:"The purpose and format of monitoring.yml"},sidebar:"packagingSidebar",previous:{title:"Git Basics",permalink:"/docs/packaging/git-basics"},next:{title:"Package YAML",permalink:"/docs/packaging/package.yml"}},a={},c=[{value:"Adding monitoring.yml to an existing package",id:"adding-monitoringyml-to-an-existing-package",level:2},{value:"systemd as an example",id:"systemd-as-an-example",level:2},{value:""releases" fields",id:"releases-fields",level:2},{value:"Finding the Anitya ID",id:"finding-the-anitya-id",level:3},{value:""security" fields",id:"security-fields",level:2},{value:"What is a CPE Name?",id:"what-is-a-cpe-name",level:3},{value:"Finding the CPE Name",id:"finding-the-cpe-name",level:3},{value:"No known CPE",id:"no-known-cpe",level:3}];function l(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"monitoringyml",children:(0,i.jsx)(n.code,{children:"monitoring.yml"})})}),"\n",(0,i.jsx)(n.admonition,{type:"important",children:(0,i.jsxs)(n.p,{children:["A ",(0,i.jsx)(n.code,{children:"monitoring.yml"})," file is strongly suggested, but not yet required for Solus packages."]})}),"\n",(0,i.jsxs)(n.p,{children:["A ",(0,i.jsx)(n.code,{children:"monitoring.yml"})," file is included in the Packages repository directory for every Solus package to enable automatic scanning for new releases and security advisories."]}),"\n",(0,i.jsxs)(n.p,{children:["Checking for new releases is done by mapping the Solus package to an ",(0,i.jsx)(n.a,{href:"https://github.com/fedora-infra/anitya",children:"Anitya"})," ID. ",(0,i.jsx)(n.em,{children:"Anitya"})," is a Red Hat project, part of ",(0,i.jsx)(n.a,{href:"https://release-monitoring.org/",children:"release-monitoring.org"})]}),"\n",(0,i.jsxs)(n.p,{children:["Checking for security advisories (",(0,i.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Common_Vulnerabilities_and_Exposures",children:"CVEs"}),"), is done by mapping the Solus package to a ",(0,i.jsx)(n.em,{children:"Common Platform Enumeration Name"})," (",(0,i.jsx)(n.a,{href:"https://nvd.nist.gov/products/cpe",children:"CPE"}),") from the National Vulnerability Database."]}),"\n",(0,i.jsx)(n.h2,{id:"adding-monitoringyml-to-an-existing-package",children:"Adding monitoring.yml to an existing package"}),"\n",(0,i.jsxs)(n.p,{children:["To add a ",(0,i.jsx)(n.code,{children:"monitoring.yml"})," file to an existing package you can use the following ",(0,i.jsx)(n.code,{children:"go-task"})," command to add a template file, starting from within the directory containing the ",(0,i.jsx)(n.code,{children:"package.yml"})," for a given package:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task add-monitoring\n"})}),"\n",(0,i.jsx)(n.p,{children:"Which will create a file with the following contents:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"releases:\n id: null # Check https://release-monitoring.org/\n rss: null # For example https://github.com/PyO3/maturin/releases.atom\n# No known CPE, checked 2024-04-24\nsecurity:\n cpe: ~\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You must, at minimum, fill out ",(0,i.jsx)(n.code,{children:"id"})," and check if the package has a ",(0,i.jsx)(n.a,{href:"#what-is-a-cpe-name",children:"CPE name"}),". ",(0,i.jsx)(n.code,{children:"rss"})," should be deleted if no feed is available."]}),"\n",(0,i.jsx)(n.h2,{id:"systemd-as-an-example",children:"systemd as an example"}),"\n",(0,i.jsxs)(n.p,{children:["Let's look at the ",(0,i.jsx)(n.code,{children:"monitoring.yml"})," file for ",(0,i.jsx)(n.code,{children:"systemd"})," as an example."]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"systemd"})," directory in the Packages repository looks like this:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"systemd\n\u251c\u2500\u2500 monitoring.yml\n\u251c\u2500\u2500 package.yml\n\u251c\u2500\u2500 pspec_x86_64.xml\n\u2514\u2500\u2500 *lots of other files we can ignore*\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"monitoring.yml"})," looks like this:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:'releases:\n id: 205088\n ignore:\n # We only update to the n-1 stable release. So for now we\'re only interested in 252.x updates\n - "253.*"\n rss: https://github.com/systemd/systemd-stable/tags.atom\nsecurity:\n cpe:\n - vendor: systemd_project\n product: systemd\n - vendor: freedesktop\n product: systemd\n ignore:\n # A non-existent CVE added here as an example\n - CVE-2022-55555\n'})}),"\n",(0,i.jsx)(n.h2,{id:"releases-fields",children:'"releases" fields'}),"\n",(0,i.jsx)(n.p,{children:"Fields used to monitor for new versions."}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Field"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required ?"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"id"})}),(0,i.jsx)(n.td,{children:"integer"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsxs)(n.td,{children:["Anitya ID from ",(0,i.jsx)(n.a,{href:"https://release-monitoring.org/",children:"release-monitoring.org"})]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"ignore"})}),(0,i.jsx)(n.td,{children:"list of regular expressions"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"List of regular expressions enclosed in quotes matching versions to ignore. Include a comment explaining the ignored versions."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"rss"})}),(0,i.jsx)(n.td,{children:"URL"}),(0,i.jsx)(n.td,{children:"No, strongly encouraged"}),(0,i.jsxs)(n.td,{children:['URL for a releases RSS feed. If the only RSS feed you can find for a project is a general "news" feed, don\'t include the field. For GitHub projects, you can use the "tags" or "releases" feed: ',(0,i.jsx)(n.code,{children:"https://github.com/USER/REPOSITORY/tagsORreleases.atom"})]})]})]})]}),"\n",(0,i.jsx)(n.h3,{id:"finding-the-anitya-id",children:"Finding the Anitya ID"}),"\n",(0,i.jsxs)(n.p,{children:["To find the Anitya ID, search ",(0,i.jsx)(n.a,{href:"https://release-monitoring.org/",children:"release-monitoring.org"})," by project name, then take the ID out of the URL for the correct search result."]}),"\n",(0,i.jsxs)(n.p,{children:["For example, the correct ",(0,i.jsx)(n.code,{children:"systemd"})," search result for us is ",(0,i.jsx)(n.code,{children:"systemd-stable"})," with the URL ",(0,i.jsx)(n.a,{href:"https://release-monitoring.org/project/205088/",children:"https://release-monitoring.org/project/205088/"}),", so we use ",(0,i.jsx)(n.code,{children:"205088"})," in the ",(0,i.jsx)(n.code,{children:"id"})," field"]}),"\n",(0,i.jsxs)(n.p,{children:["If a project is not tracked by release-monitoring.org, you can create an account and ",(0,i.jsx)(n.a,{href:"https://release-monitoring.org/static/docs/user-guide.html#creating-new-project",children:"add it."})]}),"\n",(0,i.jsx)(n.h2,{id:"security-fields",children:'"security" fields'}),"\n",(0,i.jsx)(n.p,{children:"Fields used to monitor for security advisories (CVEs)"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Field"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Required ?"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"cpe"})}),(0,i.jsx)(n.td,{children:"list"}),(0,i.jsx)(n.td,{children:"Yes"}),(0,i.jsxs)(n.td,{children:["List of ",(0,i.jsx)(n.code,{children:"vendor:product"})," pairs from a full CPE name. CVEs for a given project may be published under more than one CPE; include more than one if that is likely."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"ignore"})}),(0,i.jsx)(n.td,{children:"list of strings"}),(0,i.jsx)(n.td,{children:"No"}),(0,i.jsx)(n.td,{children:"List of specific CVE identifiers which can be ignored, including a comment explaining why each CVE was ignored. As an example, a CVE can be ignored if the Solus package includes a patch fixing the CVE."})]})]})]}),"\n",(0,i.jsx)(n.h3,{id:"what-is-a-cpe-name",children:"What is a CPE Name?"}),"\n",(0,i.jsxs)(n.p,{children:["A ",(0,i.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Common_Platform_Enumeration",children:"CPE Name"})," is a structured naming scheme for information technology systems, primarily used to search for CVEs."]}),"\n",(0,i.jsx)(n.p,{children:"CPE names contain redundant information we can ignore, we are only interested in the vendor and the product."}),"\n",(0,i.jsxs)(n.p,{children:["For example, ",(0,i.jsx)(n.code,{children:"cpe:2.3:a:systemd_project:systemd"})," is the CPE for the ",(0,i.jsx)(n.em,{children:"vendor"})," ",(0,i.jsx)(n.code,{children:"systemd_project"}),", and the ",(0,i.jsx)(n.em,{children:"product"})," ",(0,i.jsx)(n.code,{children:"systemd"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"finding-the-cpe-name",children:"Finding the CPE Name"}),"\n",(0,i.jsxs)(n.p,{children:["The easiest way to search for CPE Names is with the following command; replacing ",(0,i.jsx)(n.code,{children:"systemd"})," with your search term:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'curl -s -X POST https://cpe-guesser.cve-search.org/search -d "{\\"query\\": [\\"systemd\\"]}" | jq .\n'})}),"\n",(0,i.jsxs)(n.p,{children:["Note this command uses the ",(0,i.jsx)(n.code,{children:"jq"})," tool, which you may not have installed:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it jq\n"})}),"\n",(0,i.jsxs)(n.p,{children:["If you have our ",(0,i.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#set-up-repository-helper-functions-optional",children:"helper functions"})," installed, you can use the following command:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cpesearch systemd\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsx)(n.p,{children:'Convert your search term to lower case and try variations on the search term if you get no results. The CPE search is not a "fuzzy" search.'})}),"\n",(0,i.jsx)(n.p,{children:"The command returns the following:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:'[\n [\n 49192,\n "cpe:2.3:a:ubuntu_developers:systemd"\n ],\n [\n 116392,\n "cpe:2.3:a:lennart_poettering:systemd"\n ],\n [\n 120506,\n "cpe:2.3:a:freedesktop:systemd"\n ],\n [\n 120627,\n "cpe:2.3:a:systemd_project:systemd"\n ]\n]\n'})}),"\n",(0,i.jsx)(n.p,{children:"Ignore the numerical ids, let's walk through the CPEs by vendor:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"ubuntu_developers"})," is for ",(0,i.jsx)(n.code,{children:"systemd"})," patched by Ubuntu; we can ignore it"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"lennart_poettering"})," is for the main ",(0,i.jsx)(n.code,{children:"systemd"})," developer and is probably a bleeding edge vendor; ignore it"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"freedesktop"})," is from freedesktop.org and is a good candidate, so we add it"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"systemd_project"})," is a good candidate, so we add it"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"no-known-cpe",children:"No known CPE"}),"\n",(0,i.jsx)(n.p,{children:"If an established product hasn't had a security advisory in the past, it might not have a CPE."}),"\n",(0,i.jsxs)(n.p,{children:["In that case, include an empty ",(0,i.jsx)(n.code,{children:"security"})," and ",(0,i.jsx)(n.code,{children:"cpe"})," field with a comment in the following format:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"# No known CPE, checked 2024-01-23\nsecurity:\n cpe: ~\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsx)(n.p,{children:"If you are unsure of what to do in this case, feel free to ask in the Solus Packaging Matrix room."})})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},11151:(e,n,s)=>{s.d(n,{Z:()=>d,a:()=>o});var i=s(67294);const t={},r=i.createContext(t);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/08bef15d.0fc1910a.js b/assets/js/08bef15d.3b51e378.js similarity index 98% rename from assets/js/08bef15d.0fc1910a.js rename to assets/js/08bef15d.3b51e378.js index e66223c67..eeff73105 100644 --- a/assets/js/08bef15d.0fc1910a.js +++ b/assets/js/08bef15d.3b51e378.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7228],{40846:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>a,contentTitle:()=>n,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=t(85893),i=t(11151);const o={},n="Privacy Policy",l={id:"user/privacy",title:"Privacy Policy",description:"Solus installations",source:"@site/docs/user/privacy.md",sourceDirName:"user",slug:"/user/privacy",permalink:"/docs/user/privacy",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/privacy.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{},sidebar:"userSidebar",previous:{title:"Repository Management",permalink:"/docs/user/package-management/repo-management"},next:{title:"Software",permalink:"/docs/category/software"}},a={},c=[{value:"Solus installations",id:"solus-installations",level:2},{value:"Solus forum (discuss.getsol.us)",id:"solus-forum-discussgetsolus",level:2},{value:"Third party hosts",id:"third-party-hosts",level:3},{value:"Cloudflare",id:"cloudflare",level:4},{value:"GitHub",id:"github",level:4},{value:"Matrix",id:"matrix",level:4},{value:"Your rights under the GDPR",id:"your-rights-under-the-gdpr",level:2},{value:"Privacy contact",id:"privacy-contact",level:2}];function d(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"privacy-policy",children:"Privacy Policy"})}),"\n",(0,r.jsx)(s.h2,{id:"solus-installations",children:"Solus installations"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Solus does not collect or store data from user's machines."}),"\n",(0,r.jsx)(s.li,{children:"Solus does not use telemetry or automatic error reporting."}),"\n",(0,r.jsx)(s.li,{children:"Some packages may include their own built-in telemetry (examples: Firefox, Steam). Solus cannot control data collected in this way. These packages may allow you to disable this telemetry."}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"solus-forum-discussgetsolus",children:"Solus forum (discuss.getsol.us)"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"You may view the forum without providing personal data"}),"\n",(0,r.jsx)(s.li,{children:"Cookies are used to store login information"}),"\n",(0,r.jsxs)(s.li,{children:["We collect personal information when you register for an account:","\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.em,{children:"Username"})," and (optional) ",(0,r.jsx)(s.em,{children:"password"})," for account identification and authorization."]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.em,{children:"Email address"})," for account recovery and notifications."]}),"\n",(0,r.jsxs)(s.li,{children:["(optional) ",(0,r.jsx)(s.em,{children:"Third party login information"})," to allow signing in using an SSO provider like ",(0,r.jsx)(s.em,{children:"GitHub"}),"."]}),"\n",(0,r.jsx)(s.li,{children:"This information will be retained and processed to authenticate logins. The information will be retained until you delete your account."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(s.h3,{id:"third-party-hosts",children:"Third party hosts"}),"\n",(0,r.jsx)(s.p,{children:"Solus cannot control how data is collected and processed on the third party hosts we use. We use the following hosts:"}),"\n",(0,r.jsx)(s.h4,{id:"cloudflare",children:"Cloudflare"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["The Solus package mirror ",(0,r.jsx)(s.code,{children:"cdn.getsol.us"})," is hosted by Cloudflare"]}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"https://www.cloudflare.com/privacypolicy/",children:"Cloudflare Privacy Policy"})}),"\n"]}),"\n",(0,r.jsx)(s.h4,{id:"github",children:"GitHub"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["The Solus homepage ",(0,r.jsx)(s.code,{children:"getsol.us"}),", and the help center ",(0,r.jsx)(s.code,{children:"help.getsol.us"})," are hosted by GitHub Pages"]}),"\n",(0,r.jsxs)(s.li,{children:["Solus repositories are hosted on GitHub under the ",(0,r.jsxs)(s.a,{href:"https://github.com/getsolus/",children:[(0,r.jsx)(s.code,{children:"getsolus"})," organization"]})]}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"https://docs.github.com/en/site-policy/privacy-policies/github-general-privacy-statement",children:"GitHub Privacy Policy"})}),"\n"]}),"\n",(0,r.jsx)(s.h4,{id:"matrix",children:"Matrix"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"The Solus Matrix rooms are hosted by the Matrix.org homeserver"}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"https://matrix.org/legal/privacy-notice",children:"Matrix.org Homeserver Privacy Notice"})}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"your-rights-under-the-gdpr",children:"Your rights under the GDPR"}),"\n",(0,r.jsxs)(s.p,{children:["If you are covered by the ",(0,r.jsx)(s.a,{href:"https://gdpr.eu/",children:"GDPR"})," you have rights as a data subject. Your rights are detailed under ",(0,r.jsx)(s.a,{href:"https://gdpr.eu/article-12-how-controllers-should-provide-personal-data-to-the-subject/",children:"Chapter 3 of the GDPR"}),". Additionally, you have the right to lodge a complaint with your national ",(0,r.jsx)(s.a,{href:"https://www.edpb.europa.eu/about-edpb/about-edpb/members_en",children:"Data Protection Authority"}),"."]}),"\n",(0,r.jsx)(s.h2,{id:"privacy-contact",children:"Privacy contact"}),"\n",(0,r.jsxs)(s.p,{children:["Any concerns or requests about personal data should be sent to ",(0,r.jsx)(s.a,{href:"mailto:privacy@getsol.us",children:"privacy@getsol.us"})]})]})}function h(e={}){const{wrapper:s}={...(0,i.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>l,a:()=>n});var r=t(67294);const i={},o=r.createContext(i);function n(e){const s=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:n(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7228],{40846:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>a,contentTitle:()=>n,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=t(85893),i=t(11151);const o={},n="Privacy Policy",l={id:"user/privacy",title:"Privacy Policy",description:"Solus installations",source:"@site/docs/user/privacy.md",sourceDirName:"user",slug:"/user/privacy",permalink:"/docs/user/privacy",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/privacy.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{},sidebar:"userSidebar",previous:{title:"Repository Management",permalink:"/docs/user/package-management/repo-management"},next:{title:"Software",permalink:"/docs/category/software"}},a={},c=[{value:"Solus installations",id:"solus-installations",level:2},{value:"Solus forum (discuss.getsol.us)",id:"solus-forum-discussgetsolus",level:2},{value:"Third party hosts",id:"third-party-hosts",level:3},{value:"Cloudflare",id:"cloudflare",level:4},{value:"GitHub",id:"github",level:4},{value:"Matrix",id:"matrix",level:4},{value:"Your rights under the GDPR",id:"your-rights-under-the-gdpr",level:2},{value:"Privacy contact",id:"privacy-contact",level:2}];function d(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"privacy-policy",children:"Privacy Policy"})}),"\n",(0,r.jsx)(s.h2,{id:"solus-installations",children:"Solus installations"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Solus does not collect or store data from user's machines."}),"\n",(0,r.jsx)(s.li,{children:"Solus does not use telemetry or automatic error reporting."}),"\n",(0,r.jsx)(s.li,{children:"Some packages may include their own built-in telemetry (examples: Firefox, Steam). Solus cannot control data collected in this way. These packages may allow you to disable this telemetry."}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"solus-forum-discussgetsolus",children:"Solus forum (discuss.getsol.us)"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"You may view the forum without providing personal data"}),"\n",(0,r.jsx)(s.li,{children:"Cookies are used to store login information"}),"\n",(0,r.jsxs)(s.li,{children:["We collect personal information when you register for an account:","\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.em,{children:"Username"})," and (optional) ",(0,r.jsx)(s.em,{children:"password"})," for account identification and authorization."]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.em,{children:"Email address"})," for account recovery and notifications."]}),"\n",(0,r.jsxs)(s.li,{children:["(optional) ",(0,r.jsx)(s.em,{children:"Third party login information"})," to allow signing in using an SSO provider like ",(0,r.jsx)(s.em,{children:"GitHub"}),"."]}),"\n",(0,r.jsx)(s.li,{children:"This information will be retained and processed to authenticate logins. The information will be retained until you delete your account."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(s.h3,{id:"third-party-hosts",children:"Third party hosts"}),"\n",(0,r.jsx)(s.p,{children:"Solus cannot control how data is collected and processed on the third party hosts we use. We use the following hosts:"}),"\n",(0,r.jsx)(s.h4,{id:"cloudflare",children:"Cloudflare"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["The Solus package mirror ",(0,r.jsx)(s.code,{children:"cdn.getsol.us"})," is hosted by Cloudflare"]}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"https://www.cloudflare.com/privacypolicy/",children:"Cloudflare Privacy Policy"})}),"\n"]}),"\n",(0,r.jsx)(s.h4,{id:"github",children:"GitHub"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["The Solus homepage ",(0,r.jsx)(s.code,{children:"getsol.us"}),", and the help center ",(0,r.jsx)(s.code,{children:"help.getsol.us"})," are hosted by GitHub Pages"]}),"\n",(0,r.jsxs)(s.li,{children:["Solus repositories are hosted on GitHub under the ",(0,r.jsxs)(s.a,{href:"https://github.com/getsolus/",children:[(0,r.jsx)(s.code,{children:"getsolus"})," organization"]})]}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"https://docs.github.com/en/site-policy/privacy-policies/github-general-privacy-statement",children:"GitHub Privacy Policy"})}),"\n"]}),"\n",(0,r.jsx)(s.h4,{id:"matrix",children:"Matrix"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"The Solus Matrix rooms are hosted by the Matrix.org homeserver"}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"https://matrix.org/legal/privacy-notice",children:"Matrix.org Homeserver Privacy Notice"})}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"your-rights-under-the-gdpr",children:"Your rights under the GDPR"}),"\n",(0,r.jsxs)(s.p,{children:["If you are covered by the ",(0,r.jsx)(s.a,{href:"https://gdpr.eu/",children:"GDPR"})," you have rights as a data subject. Your rights are detailed under ",(0,r.jsx)(s.a,{href:"https://gdpr.eu/article-12-how-controllers-should-provide-personal-data-to-the-subject/",children:"Chapter 3 of the GDPR"}),". Additionally, you have the right to lodge a complaint with your national ",(0,r.jsx)(s.a,{href:"https://www.edpb.europa.eu/about-edpb/about-edpb/members_en",children:"Data Protection Authority"}),"."]}),"\n",(0,r.jsx)(s.h2,{id:"privacy-contact",children:"Privacy contact"}),"\n",(0,r.jsxs)(s.p,{children:["Any concerns or requests about personal data should be sent to ",(0,r.jsx)(s.a,{href:"mailto:privacy@getsol.us",children:"privacy@getsol.us"})]})]})}function h(e={}){const{wrapper:s}={...(0,i.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>l,a:()=>n});var r=t(67294);const i={},o=r.createContext(i);function n(e){const s=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:n(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/09dbd43b.476a700a.js b/assets/js/09dbd43b.6760537d.js similarity index 99% rename from assets/js/09dbd43b.476a700a.js rename to assets/js/09dbd43b.6760537d.js index 48dafe640..bd2cf3107 100644 --- a/assets/js/09dbd43b.476a700a.js +++ b/assets/js/09dbd43b.6760537d.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9397],{78118:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>a});var o=t(85893),n=t(11151);const i={title:"Boot Rescue",summary:"Troubleshooting the boot process for Solus"},r="Boot Rescue",l={id:"user/troubleshooting/boot-rescue",title:"Boot Rescue",description:"In this document, we will walk through restoring the ability to boot Solus.",source:"@site/docs/user/troubleshooting/boot-rescue.md",sourceDirName:"user/troubleshooting",slug:"/user/troubleshooting/boot-rescue",permalink:"/docs/user/troubleshooting/boot-rescue",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/troubleshooting/boot-rescue.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Boot Rescue",summary:"Troubleshooting the boot process for Solus"},sidebar:"userSidebar",previous:{title:"Troubleshooting",permalink:"/docs/user/troubleshooting/"},next:{title:"Installation Issues",permalink:"/docs/user/troubleshooting/installation"}},d={},a=[{value:"Multi-booting",id:"multi-booting",level:2},{value:"An entry is present in /etc/fstab that is not present at boot time",id:"an-entry-is-present-in-etcfstab-that-is-not-present-at-boot-time",level:2},{value:"Incorrectly applied updates / disk changes",id:"incorrectly-applied-updates--disk-changes",level:2},{value:"Mounting your system",id:"mounting-your-system",level:3},{value:"Encrypted systems / LVM systems",id:"encrypted-systems--lvm-systems",level:4},{value:"UEFI",id:"uefi",level:4},{value:"Other partitions",id:"other-partitions",level:4},{value:"Chrooting to your Solus system",id:"chrooting-to-your-solus-system",level:3},{value:"Networking",id:"networking",level:3},{value:"Repairing packages",id:"repairing-packages",level:3},{value:"Correcting disks",id:"correcting-disks",level:3},{value:"Re-run system-wide configuration triggers",id:"re-run-system-wide-configuration-triggers",level:3},{value:"Regenerate UEFI boot entries",id:"regenerate-uefi-boot-entries",level:3},{value:"Unmounting your system",id:"unmounting-your-system",level:3}];function c(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,n.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"boot-rescue",children:"Boot Rescue"})}),"\n",(0,o.jsx)(s.p,{children:"In this document, we will walk through restoring the ability to boot Solus."}),"\n",(0,o.jsx)(s.p,{children:"The inability to boot Solus can be attributed to various issues, such as:"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsx)(s.li,{children:'Multi-booting with an other operating system that "owns" GRUB and fails to show Solus after an upgrade of Solus is performed.'}),"\n",(0,o.jsx)(s.li,{children:'Upgrades, such as to the kernel, that may not have applied correctly. In which case this could affect "legacy boot" (non-UEFI) or UEFI systems.'}),"\n",(0,o.jsx)(s.li,{children:"If a disk is added, removed or had its UUID / mount point change."}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:'NOTE: Most examples below use sdX as the drive name. If your system has nvme drives, substitute the appropriate name, for example "nvme0n1".'}),"\n",(0,o.jsx)(s.h2,{id:"multi-booting",children:"Multi-booting"}),"\n",(0,o.jsx)(s.p,{children:'Multi-booting is when you have multiple operating systems on the same device. Also referred to as "dual-booting" when only having two operating systems on the same device.'}),"\n",(0,o.jsxs)(s.p,{children:['The inability to access Solus in a multi-boot scenario typically applies to "legacy boot" (non-UEFI), where the other operating system owns GRUB, which is used booting itself and Solus. This can be resolved by accessing the other operating system and running ',(0,o.jsx)(s.code,{children:"sudo update-grub"}),"."]}),"\n",(0,o.jsxs)(s.h2,{id:"an-entry-is-present-in-etcfstab-that-is-not-present-at-boot-time",children:["An entry is present in ",(0,o.jsx)(s.code,{children:"/etc/fstab"})," that is not present at boot time"]}),"\n",(0,o.jsxs)(s.p,{children:["If you get to an emergency prompt when the system tries to boot, check ",(0,o.jsx)(s.code,{children:"/etc/fstab"}),'. Look for any entries that might refer to disks not present at boot, such as a USB drive or NFS mount. Try adding "noauto" and rebooting. A USB drive entry might look like:']}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"UUID=XXXXXX /mnt/mydisk exfat noauto,uid=1000,gid=1000,umask=0022 0 0\n"})}),"\n",(0,o.jsx)(s.h2,{id:"incorrectly-applied-updates--disk-changes",children:"Incorrectly applied updates / disk changes"}),"\n",(0,o.jsx)(s.p,{children:"In the case that updates have not been applied correctly by the system, the updates were interrupted, or the disks have changed, it may be possible to boot rescue the Solus system. To do so, you will need:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsx)(s.li,{children:"A Live ISO of Solus booted on your system"}),"\n",(0,o.jsx)(s.li,{children:"A terminal in that Live ISO opened"}),"\n"]}),"\n",(0,o.jsx)(s.h3,{id:"mounting-your-system",children:"Mounting your system"}),"\n",(0,o.jsxs)(s.p,{children:["Whether you're using GRUB or UEFI, you will need to mount your Solus root (",(0,o.jsx)(s.code,{children:"/"}),") partition as the first step of performing a boot rescue. This is typically your primary partition, formatted as the filesystem type ",(0,o.jsx)(s.code,{children:"ext4"}),"."]}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["First we need to be the root user. Type: ",(0,o.jsx)(s.code,{children:"sudo su"})]}),"\n",(0,o.jsxs)(s.li,{children:["Next we make a directory where we will mount our local Solus system: ",(0,o.jsx)(s.code,{children:"mkdir /target"})]}),"\n",(0,o.jsxs)(s.li,{children:["Now, using ",(0,o.jsx)(s.code,{children:"lsblk"}),", determine the partition of the Solus system. We recommend checking the size of the partition listed and if it matches the size of your Solus install, use that. It will likely be something along the lines of ",(0,o.jsx)(s.code,{children:"sda#"})," or ",(0,o.jsx)(s.code,{children:"sdb#"}),". For NVMe drives, the name will look like ",(0,o.jsx)(s.code,{children:"nvme0n1px"}),'\nNote: If you see "lvm" as the type, the system has LVM partitions. See the next section for how to mount them.']}),"\n",(0,o.jsxs)(s.li,{children:['If your root partition is of type sdX / nvme0n1x, replace the "sdX#" in the following command with the partition and mount to the target directory we created: ',(0,o.jsx)(s.code,{children:"mount /dev/sdX# /target"})]}),"\n"]}),"\n",(0,o.jsx)(s.h4,{id:"encrypted-systems--lvm-systems",children:"Encrypted systems / LVM systems"}),"\n",(0,o.jsx)(s.p,{children:"If you use LVM volumes on your system, the process for mounting the system is a little different.\nIf you use LUKS-based encryption, the process will involve decrypting your LUKS partition before mounting it to the correct location. To do this, note the sda / sdb device from the prior steps and follow the steps below:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["If the disk is encrypted, decrypt it by running ",(0,o.jsx)(s.code,{children:"cryptsetup luksOpen /dev/sdX# decrypted"}),", replacing ",(0,o.jsx)(s.code,{children:"X#"})," with the partition you identified, and enter your password when prompted."]}),"\n",(0,o.jsxs)(s.li,{children:["Next check the output of ",(0,o.jsx)(s.code,{children:"lsblk"}),". This will show you any LVM volumes. You should now see ",(0,o.jsx)(s.code,{children:"SolusSystem-Swap"})," and ",(0,o.jsx)(s.code,{children:"SolusSystem-Root"}),".\nFor non-encrypted volumes, you may see something like this. In this example, ",(0,o.jsx)(s.code,{children:"SolusSystem-Swap"})," and ",(0,o.jsx)(s.code,{children:"SolusSystem-Root"}),' are under "sda2":']}),"\n"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nloop0 7:0 0 1.3G 1 loop /run/initramfs/squashfs\nloop1 7:1 0 6.2G 1 loop /run/rootfsbase\nsr0 11:0 1 2.7G 0 rom /run/initramfs/live\nzram0 251:0 0 7.8G 0 disk [SWAP]\nsda 252:0 0 96G 0 disk\n\u251c\u2500sda1 252:1 0 287M 0 part\n\u2514\u2500sda2 252:2 0 69.7G 0 part\n \u251c\u2500SolusSystem-Swap 253:0 0 3.7G 0 lvm\n \u2514\u2500SolusSystem-Root 253:1 0 46G 0 lvm\n...\n"})}),"\n",(0,o.jsxs)(s.p,{children:["For decrypted volumes, the output should look similar to this, with ",(0,o.jsx)(s.code,{children:"SolusSystem-Swap"})," and ",(0,o.jsx)(s.code,{children:"SolusSystem-Root"}),' being under "decrypted":']}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nloop0 7:0 0 1.3G 1 loop /run/initramfs/squashfs\nloop1 7:1 0 6.2G 1 loop /run/rootfsbase\nloop2 7:2 0 6.2G 1 loop\n\u2514\u2500live-base 253:0 0 6.2G 1 dm\nsda 8:0 0 238.5G 0 disk\n\u251c\u2500sda1 8:1 0 488.3M 0 part\n\u2514\u2500sda2 8:2 0 238G 0 part\n \u2514\u2500decrypted 253:1 0 238G 0 crypt\n \u251c\u2500SolusSystem-Swap 253:2 0 3.7G 0 lvm\n \u2514\u2500SolusSystem-Root 253:3 0 234.3G 0 lvm\nsdb 8:16 1 7.3G 0 disk\n\u251c\u2500sdb1 8:17 1 1.4G 0 part /run/initramfs/live\n\u2514\u2500sdb2 8:18 1 40M 0 part\n"})}),"\n",(0,o.jsxs)(s.ol,{start:"3",children:["\n",(0,o.jsxs)(s.li,{children:["Mount ",(0,o.jsx)(s.code,{children:"SolusSystem-Root"})," by running ",(0,o.jsx)(s.code,{children:"mount /dev/mapper/SolusSystem-Root /target"})]}),"\n"]}),"\n",(0,o.jsx)(s.h4,{id:"uefi",children:"UEFI"}),"\n",(0,o.jsxs)(s.p,{children:["If your system uses UEFI as opposed to GRUB, you will also need to mount your EFI System Partition, otherwise referred to as ESP. If you followed our ",(0,o.jsx)(s.a,{href:"/docs/user/quick-start/installation/disks#uefi",children:"UEFI guide"}),' during installation of Solus, then in all likelihood your ESP will be about 1GB in size. For an older installation, it may be around 512MB. If you\'re unsure of the partition, run the following, replacing "X" with the same letter used during your mounting of your root file system, minus the number:']}),"\n",(0,o.jsx)(s.p,{children:"For HDD / SDD drives:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"fdisk -o Device,Size,Type -l /dev/sdX\n"})}),"\n",(0,o.jsx)(s.p,{children:"For nvme drives:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"fdisk -o Device,Size,Type -l /dev/nvme0nX\n"})}),"\n",(0,o.jsx)(s.p,{children:"Your output may look something similar to:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"Device Size Type\n/dev/sda1 512M EFI System\n/dev/sda2 111.3G Linux filesystem\n"})}),"\n",(0,o.jsxs)(s.p,{children:["Notice we have ",(0,o.jsx)(s.code,{children:"/dev/sda1"})," as the Device with the ",(0,o.jsx)(s.code,{children:"EFI System"})," type and roughly 500MB in size. This is the partition we will be mounting."]}),"\n",(0,o.jsxs)(s.p,{children:["With our ESP device known, let's go ahead and mount it, replacing ",(0,o.jsx)(s.code,{children:"sdX#"})," in the case below with our partition."]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"mount /dev/sdX# /target/boot\n"})}),"\n",(0,o.jsx)(s.h4,{id:"other-partitions",children:"Other partitions"}),"\n",(0,o.jsxs)(s.p,{children:["If your system has other specific partitions, such as a separate ",(0,o.jsx)(s.code,{children:"/home"})," partition, they will also need to be mounted."]}),"\n",(0,o.jsx)(s.h3,{id:"chrooting-to-your-solus-system",children:"Chrooting to your Solus system"}),"\n",(0,o.jsx)(s.p,{children:"To access your system and perform boot rescue, you will need to mount specific directories from the host system (in this case, our Live ISO), to our Solus system, and then chroot (change root) to the Solus system."}),"\n",(0,o.jsx)(s.p,{children:"First run the following commands:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"mount --types proc /proc /target/proc\nmount --rbind /dev /target/dev\nmount --rbind /sys /target/sys\nmount --make-rslave /target/dev\nmount --make-rslave /target/sys\n"})}),"\n",(0,o.jsxs)(s.p,{children:["Assuming all goes well, you should now be able to chroot into your Solus system by doing ",(0,o.jsx)(s.code,{children:"chroot /target"}),"."]}),"\n",(0,o.jsx)(s.h3,{id:"networking",children:"Networking"}),"\n",(0,o.jsxs)(s.p,{children:["To validate a working network connection (assuming a network connection is available in your live image), you can run ",(0,o.jsx)(s.code,{children:"ping google.com"})," in the chrooted environment. If you get responses from ",(0,o.jsx)(s.code,{children:"google.com"}),", you have a successful connection to the Internet. If you do not, try the following:"]}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["Exit the chroot by typing ",(0,o.jsx)(s.code,{children:"exit"})]}),"\n",(0,o.jsx)(s.li,{children:"Run:"}),"\n"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"cp /run/systemd/resolve/stub-resolv.conf /target/run/systemd/resolve/\ncd /target/etc\nln -s ../run/systemd/resolve/stub-resolv.conf /target/etc/resolv.conf\n"})}),"\n",(0,o.jsxs)(s.ol,{start:"3",children:["\n",(0,o.jsxs)(s.li,{children:["Chroot back into ",(0,o.jsx)(s.code,{children:"/target"})," by running ",(0,o.jsx)(s.code,{children:"chroot /target"})," again."]}),"\n",(0,o.jsx)(s.li,{children:"Retry networking."}),"\n"]}),"\n",(0,o.jsx)(s.h3,{id:"repairing-packages",children:"Repairing packages"}),"\n",(0,o.jsx)(s.p,{children:"In the event you had an incomplete upgrade, try the following commands:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsx)(s.li,{children:(0,o.jsx)(s.code,{children:"sudo eopkg rebuild-db"})}),"\n",(0,o.jsx)(s.li,{children:(0,o.jsx)(s.code,{children:"sudo eopkg up"})}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"sudo eopkg check | grep Broken | awk '{print $4}' | xargs sudo eopkg it --reinstall"}),'\nIf you see output that starts with "Usage", this means the system has no broken packages.']}),"\n",(0,o.jsxs)(s.li,{children:['Try reverting the latest package transaction (this should only be done if the first two steps, followed by the "Re-run System-Wide Configuration Triggers", failed to produce a successful bootup). See ',(0,o.jsx)(s.a,{href:"/docs/user/package-management/history-and-rollback",children:"our documentation on history and rollback"})," for more information, followed by re-applying your updates by running ",(0,o.jsx)(s.code,{children:"sudo eopkg up"}),"."]}),"\n"]}),"\n",(0,o.jsx)(s.h3,{id:"correcting-disks",children:"Correcting disks"}),"\n",(0,o.jsx)(s.p,{children:"In the event that disk changes had caused the system to fail to boot, try the following in the chroot environment:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["Get the UUIDs of your partitions the system expects from ",(0,o.jsx)(s.code,{children:"/etc/fstab"}),"."]}),"\n",(0,o.jsxs)(s.li,{children:["Compare this to the output of ",(0,o.jsx)(s.code,{children:"ls -lah /dev/disk/by-uuid"})]}),"\n"]}),"\n",(0,o.jsx)(s.h3,{id:"re-run-system-wide-configuration-triggers",children:"Re-run system-wide configuration triggers"}),"\n",(0,o.jsx)(s.p,{children:"In the chroot environment, run the following command which will perform various configuration triggers to update your icon cache, update GRUB and EFI configuration, re-compile settings, and more:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"sudo usysconf run -f\n"})}),"\n",(0,o.jsx)(s.h3,{id:"regenerate-uefi-boot-entries",children:"Regenerate UEFI boot entries"}),"\n",(0,o.jsx)(s.p,{children:"Run the following command, which will update the boot entries for your EFI menu:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"sudo clr-boot-manager update\n"})}),"\n",(0,o.jsxs)(s.p,{children:["After this, you should exit your chroot with ",(0,o.jsx)(s.code,{children:"exit"})," then reboot your system. In the event you are still unable to access Solus, please ",(0,o.jsx)(s.a,{href:"/docs/user/contributing/getting-involved",children:"contact us"}),"."]}),"\n",(0,o.jsx)(s.h3,{id:"unmounting-your-system",children:"Unmounting your system"}),"\n",(0,o.jsx)(s.p,{children:"In case further partition modifications are required, there's a series of steps that must be followed."}),"\n",(0,o.jsxs)(s.p,{children:["If you are still chrooted you have to exit the chroot environment by pressing ",(0,o.jsx)(s.code,{children:"Ctrl"})," + ",(0,o.jsx)(s.code,{children:"D"}),"."]}),"\n",(0,o.jsx)(s.p,{children:"Then proceed with unmounting the filesystem."}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"umount -R /target\n"})}),"\n",(0,o.jsx)(s.p,{children:"In case of having a LUKS-based encryption you'll have to deactivate your logical volumes plus volume groups and then close your LUKS partition."}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"lvchange -a n /dev/SolusSystem/Swap # `-a n` means `active: no`\nlvchange -a n /dev/SolusSystem/Root\nvgchange -a n SolusSystem\ncryptsetup luksClose decrypted\n"})})]})}function h(e={}){const{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>l,a:()=>r});var o=t(67294);const n={},i=o.createContext(n);function r(e){const s=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),o.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9397],{78118:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>a});var o=t(85893),n=t(11151);const i={title:"Boot Rescue",summary:"Troubleshooting the boot process for Solus"},r="Boot Rescue",l={id:"user/troubleshooting/boot-rescue",title:"Boot Rescue",description:"In this document, we will walk through restoring the ability to boot Solus.",source:"@site/docs/user/troubleshooting/boot-rescue.md",sourceDirName:"user/troubleshooting",slug:"/user/troubleshooting/boot-rescue",permalink:"/docs/user/troubleshooting/boot-rescue",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/troubleshooting/boot-rescue.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Boot Rescue",summary:"Troubleshooting the boot process for Solus"},sidebar:"userSidebar",previous:{title:"Troubleshooting",permalink:"/docs/user/troubleshooting/"},next:{title:"Installation Issues",permalink:"/docs/user/troubleshooting/installation"}},d={},a=[{value:"Multi-booting",id:"multi-booting",level:2},{value:"An entry is present in /etc/fstab that is not present at boot time",id:"an-entry-is-present-in-etcfstab-that-is-not-present-at-boot-time",level:2},{value:"Incorrectly applied updates / disk changes",id:"incorrectly-applied-updates--disk-changes",level:2},{value:"Mounting your system",id:"mounting-your-system",level:3},{value:"Encrypted systems / LVM systems",id:"encrypted-systems--lvm-systems",level:4},{value:"UEFI",id:"uefi",level:4},{value:"Other partitions",id:"other-partitions",level:4},{value:"Chrooting to your Solus system",id:"chrooting-to-your-solus-system",level:3},{value:"Networking",id:"networking",level:3},{value:"Repairing packages",id:"repairing-packages",level:3},{value:"Correcting disks",id:"correcting-disks",level:3},{value:"Re-run system-wide configuration triggers",id:"re-run-system-wide-configuration-triggers",level:3},{value:"Regenerate UEFI boot entries",id:"regenerate-uefi-boot-entries",level:3},{value:"Unmounting your system",id:"unmounting-your-system",level:3}];function c(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,n.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"boot-rescue",children:"Boot Rescue"})}),"\n",(0,o.jsx)(s.p,{children:"In this document, we will walk through restoring the ability to boot Solus."}),"\n",(0,o.jsx)(s.p,{children:"The inability to boot Solus can be attributed to various issues, such as:"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsx)(s.li,{children:'Multi-booting with an other operating system that "owns" GRUB and fails to show Solus after an upgrade of Solus is performed.'}),"\n",(0,o.jsx)(s.li,{children:'Upgrades, such as to the kernel, that may not have applied correctly. In which case this could affect "legacy boot" (non-UEFI) or UEFI systems.'}),"\n",(0,o.jsx)(s.li,{children:"If a disk is added, removed or had its UUID / mount point change."}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:'NOTE: Most examples below use sdX as the drive name. If your system has nvme drives, substitute the appropriate name, for example "nvme0n1".'}),"\n",(0,o.jsx)(s.h2,{id:"multi-booting",children:"Multi-booting"}),"\n",(0,o.jsx)(s.p,{children:'Multi-booting is when you have multiple operating systems on the same device. Also referred to as "dual-booting" when only having two operating systems on the same device.'}),"\n",(0,o.jsxs)(s.p,{children:['The inability to access Solus in a multi-boot scenario typically applies to "legacy boot" (non-UEFI), where the other operating system owns GRUB, which is used booting itself and Solus. This can be resolved by accessing the other operating system and running ',(0,o.jsx)(s.code,{children:"sudo update-grub"}),"."]}),"\n",(0,o.jsxs)(s.h2,{id:"an-entry-is-present-in-etcfstab-that-is-not-present-at-boot-time",children:["An entry is present in ",(0,o.jsx)(s.code,{children:"/etc/fstab"})," that is not present at boot time"]}),"\n",(0,o.jsxs)(s.p,{children:["If you get to an emergency prompt when the system tries to boot, check ",(0,o.jsx)(s.code,{children:"/etc/fstab"}),'. Look for any entries that might refer to disks not present at boot, such as a USB drive or NFS mount. Try adding "noauto" and rebooting. A USB drive entry might look like:']}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"UUID=XXXXXX /mnt/mydisk exfat noauto,uid=1000,gid=1000,umask=0022 0 0\n"})}),"\n",(0,o.jsx)(s.h2,{id:"incorrectly-applied-updates--disk-changes",children:"Incorrectly applied updates / disk changes"}),"\n",(0,o.jsx)(s.p,{children:"In the case that updates have not been applied correctly by the system, the updates were interrupted, or the disks have changed, it may be possible to boot rescue the Solus system. To do so, you will need:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsx)(s.li,{children:"A Live ISO of Solus booted on your system"}),"\n",(0,o.jsx)(s.li,{children:"A terminal in that Live ISO opened"}),"\n"]}),"\n",(0,o.jsx)(s.h3,{id:"mounting-your-system",children:"Mounting your system"}),"\n",(0,o.jsxs)(s.p,{children:["Whether you're using GRUB or UEFI, you will need to mount your Solus root (",(0,o.jsx)(s.code,{children:"/"}),") partition as the first step of performing a boot rescue. This is typically your primary partition, formatted as the filesystem type ",(0,o.jsx)(s.code,{children:"ext4"}),"."]}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["First we need to be the root user. Type: ",(0,o.jsx)(s.code,{children:"sudo su"})]}),"\n",(0,o.jsxs)(s.li,{children:["Next we make a directory where we will mount our local Solus system: ",(0,o.jsx)(s.code,{children:"mkdir /target"})]}),"\n",(0,o.jsxs)(s.li,{children:["Now, using ",(0,o.jsx)(s.code,{children:"lsblk"}),", determine the partition of the Solus system. We recommend checking the size of the partition listed and if it matches the size of your Solus install, use that. It will likely be something along the lines of ",(0,o.jsx)(s.code,{children:"sda#"})," or ",(0,o.jsx)(s.code,{children:"sdb#"}),". For NVMe drives, the name will look like ",(0,o.jsx)(s.code,{children:"nvme0n1px"}),'\nNote: If you see "lvm" as the type, the system has LVM partitions. See the next section for how to mount them.']}),"\n",(0,o.jsxs)(s.li,{children:['If your root partition is of type sdX / nvme0n1x, replace the "sdX#" in the following command with the partition and mount to the target directory we created: ',(0,o.jsx)(s.code,{children:"mount /dev/sdX# /target"})]}),"\n"]}),"\n",(0,o.jsx)(s.h4,{id:"encrypted-systems--lvm-systems",children:"Encrypted systems / LVM systems"}),"\n",(0,o.jsx)(s.p,{children:"If you use LVM volumes on your system, the process for mounting the system is a little different.\nIf you use LUKS-based encryption, the process will involve decrypting your LUKS partition before mounting it to the correct location. To do this, note the sda / sdb device from the prior steps and follow the steps below:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["If the disk is encrypted, decrypt it by running ",(0,o.jsx)(s.code,{children:"cryptsetup luksOpen /dev/sdX# decrypted"}),", replacing ",(0,o.jsx)(s.code,{children:"X#"})," with the partition you identified, and enter your password when prompted."]}),"\n",(0,o.jsxs)(s.li,{children:["Next check the output of ",(0,o.jsx)(s.code,{children:"lsblk"}),". This will show you any LVM volumes. You should now see ",(0,o.jsx)(s.code,{children:"SolusSystem-Swap"})," and ",(0,o.jsx)(s.code,{children:"SolusSystem-Root"}),".\nFor non-encrypted volumes, you may see something like this. In this example, ",(0,o.jsx)(s.code,{children:"SolusSystem-Swap"})," and ",(0,o.jsx)(s.code,{children:"SolusSystem-Root"}),' are under "sda2":']}),"\n"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nloop0 7:0 0 1.3G 1 loop /run/initramfs/squashfs\nloop1 7:1 0 6.2G 1 loop /run/rootfsbase\nsr0 11:0 1 2.7G 0 rom /run/initramfs/live\nzram0 251:0 0 7.8G 0 disk [SWAP]\nsda 252:0 0 96G 0 disk\n\u251c\u2500sda1 252:1 0 287M 0 part\n\u2514\u2500sda2 252:2 0 69.7G 0 part\n \u251c\u2500SolusSystem-Swap 253:0 0 3.7G 0 lvm\n \u2514\u2500SolusSystem-Root 253:1 0 46G 0 lvm\n...\n"})}),"\n",(0,o.jsxs)(s.p,{children:["For decrypted volumes, the output should look similar to this, with ",(0,o.jsx)(s.code,{children:"SolusSystem-Swap"})," and ",(0,o.jsx)(s.code,{children:"SolusSystem-Root"}),' being under "decrypted":']}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nloop0 7:0 0 1.3G 1 loop /run/initramfs/squashfs\nloop1 7:1 0 6.2G 1 loop /run/rootfsbase\nloop2 7:2 0 6.2G 1 loop\n\u2514\u2500live-base 253:0 0 6.2G 1 dm\nsda 8:0 0 238.5G 0 disk\n\u251c\u2500sda1 8:1 0 488.3M 0 part\n\u2514\u2500sda2 8:2 0 238G 0 part\n \u2514\u2500decrypted 253:1 0 238G 0 crypt\n \u251c\u2500SolusSystem-Swap 253:2 0 3.7G 0 lvm\n \u2514\u2500SolusSystem-Root 253:3 0 234.3G 0 lvm\nsdb 8:16 1 7.3G 0 disk\n\u251c\u2500sdb1 8:17 1 1.4G 0 part /run/initramfs/live\n\u2514\u2500sdb2 8:18 1 40M 0 part\n"})}),"\n",(0,o.jsxs)(s.ol,{start:"3",children:["\n",(0,o.jsxs)(s.li,{children:["Mount ",(0,o.jsx)(s.code,{children:"SolusSystem-Root"})," by running ",(0,o.jsx)(s.code,{children:"mount /dev/mapper/SolusSystem-Root /target"})]}),"\n"]}),"\n",(0,o.jsx)(s.h4,{id:"uefi",children:"UEFI"}),"\n",(0,o.jsxs)(s.p,{children:["If your system uses UEFI as opposed to GRUB, you will also need to mount your EFI System Partition, otherwise referred to as ESP. If you followed our ",(0,o.jsx)(s.a,{href:"/docs/user/quick-start/installation/disks#uefi",children:"UEFI guide"}),' during installation of Solus, then in all likelihood your ESP will be about 1GB in size. For an older installation, it may be around 512MB. If you\'re unsure of the partition, run the following, replacing "X" with the same letter used during your mounting of your root file system, minus the number:']}),"\n",(0,o.jsx)(s.p,{children:"For HDD / SDD drives:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"fdisk -o Device,Size,Type -l /dev/sdX\n"})}),"\n",(0,o.jsx)(s.p,{children:"For nvme drives:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"fdisk -o Device,Size,Type -l /dev/nvme0nX\n"})}),"\n",(0,o.jsx)(s.p,{children:"Your output may look something similar to:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"Device Size Type\n/dev/sda1 512M EFI System\n/dev/sda2 111.3G Linux filesystem\n"})}),"\n",(0,o.jsxs)(s.p,{children:["Notice we have ",(0,o.jsx)(s.code,{children:"/dev/sda1"})," as the Device with the ",(0,o.jsx)(s.code,{children:"EFI System"})," type and roughly 500MB in size. This is the partition we will be mounting."]}),"\n",(0,o.jsxs)(s.p,{children:["With our ESP device known, let's go ahead and mount it, replacing ",(0,o.jsx)(s.code,{children:"sdX#"})," in the case below with our partition."]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"mount /dev/sdX# /target/boot\n"})}),"\n",(0,o.jsx)(s.h4,{id:"other-partitions",children:"Other partitions"}),"\n",(0,o.jsxs)(s.p,{children:["If your system has other specific partitions, such as a separate ",(0,o.jsx)(s.code,{children:"/home"})," partition, they will also need to be mounted."]}),"\n",(0,o.jsx)(s.h3,{id:"chrooting-to-your-solus-system",children:"Chrooting to your Solus system"}),"\n",(0,o.jsx)(s.p,{children:"To access your system and perform boot rescue, you will need to mount specific directories from the host system (in this case, our Live ISO), to our Solus system, and then chroot (change root) to the Solus system."}),"\n",(0,o.jsx)(s.p,{children:"First run the following commands:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"mount --types proc /proc /target/proc\nmount --rbind /dev /target/dev\nmount --rbind /sys /target/sys\nmount --make-rslave /target/dev\nmount --make-rslave /target/sys\n"})}),"\n",(0,o.jsxs)(s.p,{children:["Assuming all goes well, you should now be able to chroot into your Solus system by doing ",(0,o.jsx)(s.code,{children:"chroot /target"}),"."]}),"\n",(0,o.jsx)(s.h3,{id:"networking",children:"Networking"}),"\n",(0,o.jsxs)(s.p,{children:["To validate a working network connection (assuming a network connection is available in your live image), you can run ",(0,o.jsx)(s.code,{children:"ping google.com"})," in the chrooted environment. If you get responses from ",(0,o.jsx)(s.code,{children:"google.com"}),", you have a successful connection to the Internet. If you do not, try the following:"]}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["Exit the chroot by typing ",(0,o.jsx)(s.code,{children:"exit"})]}),"\n",(0,o.jsx)(s.li,{children:"Run:"}),"\n"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"cp /run/systemd/resolve/stub-resolv.conf /target/run/systemd/resolve/\ncd /target/etc\nln -s ../run/systemd/resolve/stub-resolv.conf /target/etc/resolv.conf\n"})}),"\n",(0,o.jsxs)(s.ol,{start:"3",children:["\n",(0,o.jsxs)(s.li,{children:["Chroot back into ",(0,o.jsx)(s.code,{children:"/target"})," by running ",(0,o.jsx)(s.code,{children:"chroot /target"})," again."]}),"\n",(0,o.jsx)(s.li,{children:"Retry networking."}),"\n"]}),"\n",(0,o.jsx)(s.h3,{id:"repairing-packages",children:"Repairing packages"}),"\n",(0,o.jsx)(s.p,{children:"In the event you had an incomplete upgrade, try the following commands:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsx)(s.li,{children:(0,o.jsx)(s.code,{children:"sudo eopkg rebuild-db"})}),"\n",(0,o.jsx)(s.li,{children:(0,o.jsx)(s.code,{children:"sudo eopkg up"})}),"\n",(0,o.jsxs)(s.li,{children:[(0,o.jsx)(s.code,{children:"sudo eopkg check | grep Broken | awk '{print $4}' | xargs sudo eopkg it --reinstall"}),'\nIf you see output that starts with "Usage", this means the system has no broken packages.']}),"\n",(0,o.jsxs)(s.li,{children:['Try reverting the latest package transaction (this should only be done if the first two steps, followed by the "Re-run System-Wide Configuration Triggers", failed to produce a successful bootup). See ',(0,o.jsx)(s.a,{href:"/docs/user/package-management/history-and-rollback",children:"our documentation on history and rollback"})," for more information, followed by re-applying your updates by running ",(0,o.jsx)(s.code,{children:"sudo eopkg up"}),"."]}),"\n"]}),"\n",(0,o.jsx)(s.h3,{id:"correcting-disks",children:"Correcting disks"}),"\n",(0,o.jsx)(s.p,{children:"In the event that disk changes had caused the system to fail to boot, try the following in the chroot environment:"}),"\n",(0,o.jsxs)(s.ol,{children:["\n",(0,o.jsxs)(s.li,{children:["Get the UUIDs of your partitions the system expects from ",(0,o.jsx)(s.code,{children:"/etc/fstab"}),"."]}),"\n",(0,o.jsxs)(s.li,{children:["Compare this to the output of ",(0,o.jsx)(s.code,{children:"ls -lah /dev/disk/by-uuid"})]}),"\n"]}),"\n",(0,o.jsx)(s.h3,{id:"re-run-system-wide-configuration-triggers",children:"Re-run system-wide configuration triggers"}),"\n",(0,o.jsx)(s.p,{children:"In the chroot environment, run the following command which will perform various configuration triggers to update your icon cache, update GRUB and EFI configuration, re-compile settings, and more:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"sudo usysconf run -f\n"})}),"\n",(0,o.jsx)(s.h3,{id:"regenerate-uefi-boot-entries",children:"Regenerate UEFI boot entries"}),"\n",(0,o.jsx)(s.p,{children:"Run the following command, which will update the boot entries for your EFI menu:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"sudo clr-boot-manager update\n"})}),"\n",(0,o.jsxs)(s.p,{children:["After this, you should exit your chroot with ",(0,o.jsx)(s.code,{children:"exit"})," then reboot your system. In the event you are still unable to access Solus, please ",(0,o.jsx)(s.a,{href:"/docs/user/contributing/getting-involved",children:"contact us"}),"."]}),"\n",(0,o.jsx)(s.h3,{id:"unmounting-your-system",children:"Unmounting your system"}),"\n",(0,o.jsx)(s.p,{children:"In case further partition modifications are required, there's a series of steps that must be followed."}),"\n",(0,o.jsxs)(s.p,{children:["If you are still chrooted you have to exit the chroot environment by pressing ",(0,o.jsx)(s.code,{children:"Ctrl"})," + ",(0,o.jsx)(s.code,{children:"D"}),"."]}),"\n",(0,o.jsx)(s.p,{children:"Then proceed with unmounting the filesystem."}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"umount -R /target\n"})}),"\n",(0,o.jsx)(s.p,{children:"In case of having a LUKS-based encryption you'll have to deactivate your logical volumes plus volume groups and then close your LUKS partition."}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-bash",children:"lvchange -a n /dev/SolusSystem/Swap # `-a n` means `active: no`\nlvchange -a n /dev/SolusSystem/Root\nvgchange -a n SolusSystem\ncryptsetup luksClose decrypted\n"})})]})}function h(e={}){const{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>l,a:()=>r});var o=t(67294);const n={},i=o.createContext(n);function r(e){const s=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),o.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0b254e3a.b3f72544.js b/assets/js/0b254e3a.bda17182.js similarity index 99% rename from assets/js/0b254e3a.b3f72544.js rename to assets/js/0b254e3a.bda17182.js index 9fdc430b7..290c183b0 100644 --- a/assets/js/0b254e3a.b3f72544.js +++ b/assets/js/0b254e3a.bda17182.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6726],{99528:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>o,toc:()=>l});var i=a(85893),s=a(11151);const t={title:"Updating an Existing Package",summary:"Updating an Existing Package",sidebar_position:4},r="Updating an Existing Package",o={id:"packaging/updating-an-existing-package",title:"Updating an Existing Package",description:"This article will go over updating a package that is already in the Solus package repositories.",source:"@site/docs/packaging/updating-an-existing-package.md",sourceDirName:"packaging",slug:"/packaging/updating-an-existing-package",permalink:"/docs/packaging/updating-an-existing-package",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/updating-an-existing-package.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,sidebarPosition:4,frontMatter:{title:"Updating an Existing Package",summary:"Updating an Existing Package",sidebar_position:4},sidebar:"packagingSidebar",previous:{title:"Creating a New Package",permalink:"/docs/packaging/creating-a-new-package"},next:{title:"Testing a Package",permalink:"/docs/packaging/testing-a-package"}},c={},l=[{value:"Update your clone of the packages repository",id:"update-your-clone-of-the-packages-repository",level:3},{value:"Switch to a new git branch",id:"switch-to-a-new-git-branch",level:2},{value:"Updating a package",id:"updating-a-package",level:2},{value:"Bumping a package",id:"bumping-a-package",level:3},{value:"Using a different version",id:"using-a-different-version",level:3},{value:"The MAINTAINERS.md file",id:"the-maintainersmd-file",level:2},{value:"Build the package",id:"build-the-package",level:2},{value:"Commit your changes",id:"commit-your-changes",level:2},{value:"Commit message format",id:"commit-message-format",level:2},{value:"Package update",id:"package-update",level:3},{value:"Other commit message format examples",id:"other-commit-message-format-examples",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"updating-an-existing-package",children:"Updating an Existing Package"})}),"\n",(0,i.jsx)(n.p,{children:"This article will go over updating a package that is already in the Solus package repositories."}),"\n",(0,i.jsxs)(n.admonition,{type:"note",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsxs)(n.strong,{children:["Please ",(0,i.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues?q=label%3A%22Package+Request%22",children:"look to see if an issue has been filed"})," for the software update"]}),".\nIf there is an existing request, please add a link to it in your pull request. Ex:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"This PR resolves software update request https://github.com/getsolus/packages/issues/123\n"})})]}),"\n",(0,i.jsx)(n.h3,{id:"update-your-clone-of-the-packages-repository",children:"Update your clone of the packages repository"}),"\n",(0,i.jsxs)(n.p,{children:["If you do not have a local clone set up yet, see ",(0,i.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#fork-the-getsoluspackages-repository",children:"Prepare for Packaging"})]}),"\n",(0,i.jsx)(n.p,{children:"Bring your local clone up to date. Run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd ~/solus-packages/packages/n/nano\ngit switch main\ngit pull\n"})}),"\n",(0,i.jsx)(n.h2,{id:"switch-to-a-new-git-branch",children:"Switch to a new git branch"}),"\n",(0,i.jsx)(n.p,{children:"It's always a good idea to switch to a new git branch before beginning packaging work. This helps to separate your work from any new changes made to the package repository, which will allow you to more easily rebase any changes if needed. To do so run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git switch -c update_nano\n"})}),"\n",(0,i.jsx)(n.h2,{id:"updating-a-package",children:"Updating a package"}),"\n",(0,i.jsx)(n.p,{children:"There are two types of package updates: a package bump, and moving a package to a different version."}),"\n",(0,i.jsxs)(n.p,{children:["Bumping a package is typically done when rebuilding against a changed dependency, such as ",(0,i.jsx)(n.code,{children:"imagemagick"})," needing to be rebuilt if ",(0,i.jsx)(n.code,{children:"libwebp"})," changes. It is also done if changes are being made to the package, such as adding new dependencies or other modifications which aren't a version update."]}),"\n",(0,i.jsx)(n.h3,{id:"bumping-a-package",children:"Bumping a package"}),"\n",(0,i.jsxs)(n.p,{children:["Bumping can be achieved by running the ",(0,i.jsx)(n.code,{children:"bump"})," task, which increments the release number by 1."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task bump\n"})}),"\n",(0,i.jsx)(n.p,{children:"Check to make sure that the result is as expected."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git diff package.yml\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"Certain packages with long descriptions might have their description messed up when this is run. Check if this happened, and fix it if necessary."})}),"\n",(0,i.jsx)(n.h3,{id:"using-a-different-version",children:"Using a different version"}),"\n",(0,i.jsxs)(n.p,{children:["To update the package to a newer version, use the ",(0,i.jsx)(n.code,{children:"update"})," task."]}),"\n",(0,i.jsx)(n.p,{children:"This task takes two arguments, in the following order:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Version"}),"\n",(0,i.jsx)(n.li,{children:"Source URL"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"If you're updating the package to a newer version, naturally you would change both the version and source. If you're merely changing the source URL for the existing version, just pass the same version number and the new source URL."}),"\n",(0,i.jsx)(n.p,{children:"Example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task update -- 1.0 https://example.com/example-1.0.tar.xz\n"})}),"\n",(0,i.jsxs)(n.h2,{id:"the-maintainersmd-file",children:["The ",(0,i.jsx)(n.code,{children:"MAINTAINERS.md"})," file"]}),"\n",(0,i.jsxs)(n.p,{children:["There must be a file called ",(0,i.jsx)(n.code,{children:"MAINTAINERS.md"})," using the template in ",(0,i.jsx)(n.a,{href:"/docs/packaging/procedures/maintainership",children:"Maintainership"}),". Add it if it does not already exist. It should name the current maintainer(s) of the package."]}),"\n",(0,i.jsx)(n.h2,{id:"build-the-package",children:"Build the package"}),"\n",(0,i.jsxs)(n.p,{children:["Build the package using ",(0,i.jsx)(n.code,{children:"go-task"}),". The default task will build the package against the Unstable repository, so you don't have to specify a task here."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Once your package has built successfully, you will need to ",(0,i.jsx)(n.a,{href:"testing-a-package",children:"test it"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"commit-your-changes",children:"Commit your changes"}),"\n",(0,i.jsxs)(n.p,{children:["Check the ",(0,i.jsx)(n.a,{href:"git-basics#check-the-changes-in-your-files",children:"changes in your files"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"/docs/packaging/git-basics",children:"Add / remove files as necessary to the commit"}),". Then, ",(0,i.jsx)(n.strong,{children:"check your branch"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Double-check that everything looks correct and all of the files have been staged before committing."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git status\n"})}),"\n",(0,i.jsx)(n.p,{children:"If all looks well, commit your changes."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git commit\n"})}),"\n",(0,i.jsx)(n.h2,{id:"commit-message-format",children:"Commit message format"}),"\n",(0,i.jsx)(n.p,{children:'With the switch to a single large package git repository, having a regular, easy-to-read, and standardized commit message format helps enable quick and efficient "at-a-glance" reading of git commit messages for packagers and Staff alike.'}),"\n",(0,i.jsx)(n.p,{children:"Each commit message should consist of a meaningful summary line (which starts with the package name), a blank line, and then the rest of the commit message body."}),"\n",(0,i.jsxs)(n.p,{children:["Note that ",(0,i.jsx)(n.code,{children:"[NFC]"}),' (listed in an example below) is an abbreviation for "No Functional Change".']}),"\n",(0,i.jsx)(n.h3,{id:"package-update",children:"Package update"}),"\n",(0,i.jsx)(n.p,{children:"The following guidelines apply to the commit message body:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Bullet point lists should start with a dash."}),"\n",(0,i.jsx)(n.li,{children:"Include a changelog with a brief list of updates from the upstream release notes, with no links or issue numbers."}),"\n",(0,i.jsx)(n.li,{children:"There may also be a section for Solus specific work (e.g. rebuild against x / rework to remove dependency)."}),"\n",(0,i.jsx)(n.li,{children:"Optional: A link to the upstream release notes page."}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"git commit"})," on ",(0,i.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#initialize-git-hooks",children:"an initialized repository"})," will automatically open your editor with the correct template.\nNote that lines starting with a ",(0,i.jsx)(n.code,{children:"#"})," will be ignored by Git and do not need to be removed."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.em,{children:"Important"}),": Do not include issue numbers in changelogs. This will incorrectly link your issue to another one in our repository."]}),"\n",(0,i.jsx)(n.p,{children:"Example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"- #123 fixed a thing\n"})}),"\n",(0,i.jsx)(n.p,{children:"If you want to intentionally link to another issue in this repository, the right way is to use our repository name:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"Fixes getsolus/packages#issuenumber\n"})}),"\n",(0,i.jsx)(n.p,{children:"Here is an example in our standard format:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"foo: Update to 1.2.3\n\n**Summary**\n\nBugfixes:\n\n- Fixed a crash\n- Something else\n\nEnhancements:\n\n- Implemented a feature\n- Error when encountering a thing\n\nFull release notes:\n\n- [1.2.3](https://github.com/foo/foo/releases/tag/v1.2.3)\n"})}),"\n",(0,i.jsx)(n.h3,{id:"other-commit-message-format-examples",children:"Other commit message format examples"}),"\n",(0,i.jsx)(n.p,{children:"In the cases where you are not updating a package to a new version, but simply applying a patch or fixing an existing version, the following commit messages are considered suitable:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Add the ",(0,i.jsx)(n.code,{children:"homepage"})," metadata key:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"package: Add homepage"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Fix a packaging issue (including adding a patch to fix the package)","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"package: Fix (...)"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Updating a README, ",(0,i.jsx)(n.a,{href:"/docs/packaging/monitoring.yml",children:"monitoring.yml file"})," or other stuff that does not directly ",(0,i.jsx)(n.em,{children:"change"})," the package, meaning the package release number didn't need a bump:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"package: [NFC] Add README.md and monitoring.yml"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["As stated previously, ",(0,i.jsx)(n.code,{children:"[NFC]"}),' is an abbreviation of "No Functional Change".']}),"\n",(0,i.jsxs)(n.p,{children:["For more information on suitable commit messages, please check the ",(0,i.jsx)(n.a,{href:"https://github.com/solus-project/tooling-central/blob/master/README.rst#using-git",children:"tooling central documentation"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Next, you'll ",(0,i.jsx)(n.a,{href:"/docs/packaging/submitting-a-pull-request",children:"submit a pull request for review"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,n,a)=>{a.d(n,{Z:()=>o,a:()=>r});var i=a(67294);const s={},t=i.createContext(s);function r(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6726],{99528:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>o,toc:()=>l});var i=a(85893),s=a(11151);const t={title:"Updating an Existing Package",summary:"Updating an Existing Package",sidebar_position:4},r="Updating an Existing Package",o={id:"packaging/updating-an-existing-package",title:"Updating an Existing Package",description:"This article will go over updating a package that is already in the Solus package repositories.",source:"@site/docs/packaging/updating-an-existing-package.md",sourceDirName:"packaging",slug:"/packaging/updating-an-existing-package",permalink:"/docs/packaging/updating-an-existing-package",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/updating-an-existing-package.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,sidebarPosition:4,frontMatter:{title:"Updating an Existing Package",summary:"Updating an Existing Package",sidebar_position:4},sidebar:"packagingSidebar",previous:{title:"Creating a New Package",permalink:"/docs/packaging/creating-a-new-package"},next:{title:"Testing a Package",permalink:"/docs/packaging/testing-a-package"}},c={},l=[{value:"Update your clone of the packages repository",id:"update-your-clone-of-the-packages-repository",level:3},{value:"Switch to a new git branch",id:"switch-to-a-new-git-branch",level:2},{value:"Updating a package",id:"updating-a-package",level:2},{value:"Bumping a package",id:"bumping-a-package",level:3},{value:"Using a different version",id:"using-a-different-version",level:3},{value:"The MAINTAINERS.md file",id:"the-maintainersmd-file",level:2},{value:"Build the package",id:"build-the-package",level:2},{value:"Commit your changes",id:"commit-your-changes",level:2},{value:"Commit message format",id:"commit-message-format",level:2},{value:"Package update",id:"package-update",level:3},{value:"Other commit message format examples",id:"other-commit-message-format-examples",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"updating-an-existing-package",children:"Updating an Existing Package"})}),"\n",(0,i.jsx)(n.p,{children:"This article will go over updating a package that is already in the Solus package repositories."}),"\n",(0,i.jsxs)(n.admonition,{type:"note",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsxs)(n.strong,{children:["Please ",(0,i.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues?q=label%3A%22Package+Request%22",children:"look to see if an issue has been filed"})," for the software update"]}),".\nIf there is an existing request, please add a link to it in your pull request. Ex:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"This PR resolves software update request https://github.com/getsolus/packages/issues/123\n"})})]}),"\n",(0,i.jsx)(n.h3,{id:"update-your-clone-of-the-packages-repository",children:"Update your clone of the packages repository"}),"\n",(0,i.jsxs)(n.p,{children:["If you do not have a local clone set up yet, see ",(0,i.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#fork-the-getsoluspackages-repository",children:"Prepare for Packaging"})]}),"\n",(0,i.jsx)(n.p,{children:"Bring your local clone up to date. Run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd ~/solus-packages/packages/n/nano\ngit switch main\ngit pull\n"})}),"\n",(0,i.jsx)(n.h2,{id:"switch-to-a-new-git-branch",children:"Switch to a new git branch"}),"\n",(0,i.jsx)(n.p,{children:"It's always a good idea to switch to a new git branch before beginning packaging work. This helps to separate your work from any new changes made to the package repository, which will allow you to more easily rebase any changes if needed. To do so run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git switch -c update_nano\n"})}),"\n",(0,i.jsx)(n.h2,{id:"updating-a-package",children:"Updating a package"}),"\n",(0,i.jsx)(n.p,{children:"There are two types of package updates: a package bump, and moving a package to a different version."}),"\n",(0,i.jsxs)(n.p,{children:["Bumping a package is typically done when rebuilding against a changed dependency, such as ",(0,i.jsx)(n.code,{children:"imagemagick"})," needing to be rebuilt if ",(0,i.jsx)(n.code,{children:"libwebp"})," changes. It is also done if changes are being made to the package, such as adding new dependencies or other modifications which aren't a version update."]}),"\n",(0,i.jsx)(n.h3,{id:"bumping-a-package",children:"Bumping a package"}),"\n",(0,i.jsxs)(n.p,{children:["Bumping can be achieved by running the ",(0,i.jsx)(n.code,{children:"bump"})," task, which increments the release number by 1."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task bump\n"})}),"\n",(0,i.jsx)(n.p,{children:"Check to make sure that the result is as expected."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git diff package.yml\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"Certain packages with long descriptions might have their description messed up when this is run. Check if this happened, and fix it if necessary."})}),"\n",(0,i.jsx)(n.h3,{id:"using-a-different-version",children:"Using a different version"}),"\n",(0,i.jsxs)(n.p,{children:["To update the package to a newer version, use the ",(0,i.jsx)(n.code,{children:"update"})," task."]}),"\n",(0,i.jsx)(n.p,{children:"This task takes two arguments, in the following order:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Version"}),"\n",(0,i.jsx)(n.li,{children:"Source URL"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"If you're updating the package to a newer version, naturally you would change both the version and source. If you're merely changing the source URL for the existing version, just pass the same version number and the new source URL."}),"\n",(0,i.jsx)(n.p,{children:"Example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task update -- 1.0 https://example.com/example-1.0.tar.xz\n"})}),"\n",(0,i.jsxs)(n.h2,{id:"the-maintainersmd-file",children:["The ",(0,i.jsx)(n.code,{children:"MAINTAINERS.md"})," file"]}),"\n",(0,i.jsxs)(n.p,{children:["There must be a file called ",(0,i.jsx)(n.code,{children:"MAINTAINERS.md"})," using the template in ",(0,i.jsx)(n.a,{href:"/docs/packaging/procedures/maintainership",children:"Maintainership"}),". Add it if it does not already exist. It should name the current maintainer(s) of the package."]}),"\n",(0,i.jsx)(n.h2,{id:"build-the-package",children:"Build the package"}),"\n",(0,i.jsxs)(n.p,{children:["Build the package using ",(0,i.jsx)(n.code,{children:"go-task"}),". The default task will build the package against the Unstable repository, so you don't have to specify a task here."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Once your package has built successfully, you will need to ",(0,i.jsx)(n.a,{href:"testing-a-package",children:"test it"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"commit-your-changes",children:"Commit your changes"}),"\n",(0,i.jsxs)(n.p,{children:["Check the ",(0,i.jsx)(n.a,{href:"git-basics#check-the-changes-in-your-files",children:"changes in your files"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"/docs/packaging/git-basics",children:"Add / remove files as necessary to the commit"}),". Then, ",(0,i.jsx)(n.strong,{children:"check your branch"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Double-check that everything looks correct and all of the files have been staged before committing."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git status\n"})}),"\n",(0,i.jsx)(n.p,{children:"If all looks well, commit your changes."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git commit\n"})}),"\n",(0,i.jsx)(n.h2,{id:"commit-message-format",children:"Commit message format"}),"\n",(0,i.jsx)(n.p,{children:'With the switch to a single large package git repository, having a regular, easy-to-read, and standardized commit message format helps enable quick and efficient "at-a-glance" reading of git commit messages for packagers and Staff alike.'}),"\n",(0,i.jsx)(n.p,{children:"Each commit message should consist of a meaningful summary line (which starts with the package name), a blank line, and then the rest of the commit message body."}),"\n",(0,i.jsxs)(n.p,{children:["Note that ",(0,i.jsx)(n.code,{children:"[NFC]"}),' (listed in an example below) is an abbreviation for "No Functional Change".']}),"\n",(0,i.jsx)(n.h3,{id:"package-update",children:"Package update"}),"\n",(0,i.jsx)(n.p,{children:"The following guidelines apply to the commit message body:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Bullet point lists should start with a dash."}),"\n",(0,i.jsx)(n.li,{children:"Include a changelog with a brief list of updates from the upstream release notes, with no links or issue numbers."}),"\n",(0,i.jsx)(n.li,{children:"There may also be a section for Solus specific work (e.g. rebuild against x / rework to remove dependency)."}),"\n",(0,i.jsx)(n.li,{children:"Optional: A link to the upstream release notes page."}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"git commit"})," on ",(0,i.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#initialize-git-hooks",children:"an initialized repository"})," will automatically open your editor with the correct template.\nNote that lines starting with a ",(0,i.jsx)(n.code,{children:"#"})," will be ignored by Git and do not need to be removed."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.em,{children:"Important"}),": Do not include issue numbers in changelogs. This will incorrectly link your issue to another one in our repository."]}),"\n",(0,i.jsx)(n.p,{children:"Example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"- #123 fixed a thing\n"})}),"\n",(0,i.jsx)(n.p,{children:"If you want to intentionally link to another issue in this repository, the right way is to use our repository name:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"Fixes getsolus/packages#issuenumber\n"})}),"\n",(0,i.jsx)(n.p,{children:"Here is an example in our standard format:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"foo: Update to 1.2.3\n\n**Summary**\n\nBugfixes:\n\n- Fixed a crash\n- Something else\n\nEnhancements:\n\n- Implemented a feature\n- Error when encountering a thing\n\nFull release notes:\n\n- [1.2.3](https://github.com/foo/foo/releases/tag/v1.2.3)\n"})}),"\n",(0,i.jsx)(n.h3,{id:"other-commit-message-format-examples",children:"Other commit message format examples"}),"\n",(0,i.jsx)(n.p,{children:"In the cases where you are not updating a package to a new version, but simply applying a patch or fixing an existing version, the following commit messages are considered suitable:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Add the ",(0,i.jsx)(n.code,{children:"homepage"})," metadata key:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"package: Add homepage"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Fix a packaging issue (including adding a patch to fix the package)","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"package: Fix (...)"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Updating a README, ",(0,i.jsx)(n.a,{href:"/docs/packaging/monitoring.yml",children:"monitoring.yml file"})," or other stuff that does not directly ",(0,i.jsx)(n.em,{children:"change"})," the package, meaning the package release number didn't need a bump:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"package: [NFC] Add README.md and monitoring.yml"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["As stated previously, ",(0,i.jsx)(n.code,{children:"[NFC]"}),' is an abbreviation of "No Functional Change".']}),"\n",(0,i.jsxs)(n.p,{children:["For more information on suitable commit messages, please check the ",(0,i.jsx)(n.a,{href:"https://github.com/solus-project/tooling-central/blob/master/README.rst#using-git",children:"tooling central documentation"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Next, you'll ",(0,i.jsx)(n.a,{href:"/docs/packaging/submitting-a-pull-request",children:"submit a pull request for review"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,n,a)=>{a.d(n,{Z:()=>o,a:()=>r});var i=a(67294);const s={},t=i.createContext(s);function r(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0e3c5e6b.1a55516f.js b/assets/js/0e3c5e6b.b2b6a196.js similarity index 98% rename from assets/js/0e3c5e6b.1a55516f.js rename to assets/js/0e3c5e6b.b2b6a196.js index 738e9cf74..f841e27e4 100644 --- a/assets/js/0e3c5e6b.1a55516f.js +++ b/assets/js/0e3c5e6b.b2b6a196.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4859],{5166:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var n=t(85893),i=t(11151);const r={title:"Plasma",summary:"A quick introduction to the Plasma edition of Solus"},a="Plasma",o={id:"user/editions/plasma/index",title:"Plasma",description:"Solus Plasma",source:"@site/docs/user/editions/plasma/index.md",sourceDirName:"user/editions/plasma",slug:"/user/editions/plasma/",permalink:"/docs/user/editions/plasma/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/plasma/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Plasma",summary:"A quick introduction to the Plasma edition of Solus"},sidebar:"userSidebar",previous:{title:"Tips and Tricks",permalink:"/docs/user/editions/mate/tips-and-tricks"},next:{title:"Configuration",permalink:"/docs/user/editions/plasma/configuration"}},l={},d=[];function c(e){const s={a:"a",em:"em",h1:"h1",header:"header",hr:"hr",img:"img",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"plasma",children:"Plasma"})}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Solus Plasma",src:t(52603).Z+"",width:"1920",height:"1080"})}),"\n",(0,n.jsxs)(s.p,{children:["The ",(0,n.jsx)(s.em,{children:"Plasma"})," desktop is a graphical user interface for Linux distributions that aims to offer users an intuitive and customizable user interface to interact with their devices. The Plasma desktop is developed by KDE."]}),"\n",(0,n.jsx)(s.p,{children:"To learn more about the Plasma desktop and KDE, refer to the following pages:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://kde.org/plasma-desktop/",children:"https://kde.org/plasma-desktop/"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://kde.org/announcements/",children:"https://kde.org/announcements/"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://kde.org/support/",children:"https://kde.org/support/"})}),"\n"]}),"\n",(0,n.jsx)(s.hr,{}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.a,{href:"configuration",children:"Configuration"})}),"\n",(0,n.jsx)(s.p,{children:"Learn how to customize and configure the Plasma Desktop on Solus."}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.a,{href:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,n.jsx)(s.p,{children:"Helpful tips and tricks for using Plasma on Solus."})]})}function u(e={}){const{wrapper:s}={...(0,i.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},52603:(e,s,t)=>{t.d(s,{Z:()=>n});const n=t.p+"assets/images/plasma-32bee314c05b57e65e0b26b6bf23f14f.jpg"},11151:(e,s,t)=>{t.d(s,{Z:()=>o,a:()=>a});var n=t(67294);const i={},r=n.createContext(i);function a(e){const s=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4859],{5166:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var n=t(85893),i=t(11151);const r={title:"Plasma",summary:"A quick introduction to the Plasma edition of Solus"},a="Plasma",o={id:"user/editions/plasma/index",title:"Plasma",description:"Solus Plasma",source:"@site/docs/user/editions/plasma/index.md",sourceDirName:"user/editions/plasma",slug:"/user/editions/plasma/",permalink:"/docs/user/editions/plasma/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/plasma/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Plasma",summary:"A quick introduction to the Plasma edition of Solus"},sidebar:"userSidebar",previous:{title:"Tips and Tricks",permalink:"/docs/user/editions/mate/tips-and-tricks"},next:{title:"Configuration",permalink:"/docs/user/editions/plasma/configuration"}},l={},d=[];function c(e){const s={a:"a",em:"em",h1:"h1",header:"header",hr:"hr",img:"img",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"plasma",children:"Plasma"})}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Solus Plasma",src:t(52603).Z+"",width:"1920",height:"1080"})}),"\n",(0,n.jsxs)(s.p,{children:["The ",(0,n.jsx)(s.em,{children:"Plasma"})," desktop is a graphical user interface for Linux distributions that aims to offer users an intuitive and customizable user interface to interact with their devices. The Plasma desktop is developed by KDE."]}),"\n",(0,n.jsx)(s.p,{children:"To learn more about the Plasma desktop and KDE, refer to the following pages:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://kde.org/plasma-desktop/",children:"https://kde.org/plasma-desktop/"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://kde.org/announcements/",children:"https://kde.org/announcements/"})}),"\n",(0,n.jsx)(s.li,{children:(0,n.jsx)(s.a,{href:"https://kde.org/support/",children:"https://kde.org/support/"})}),"\n"]}),"\n",(0,n.jsx)(s.hr,{}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.a,{href:"configuration",children:"Configuration"})}),"\n",(0,n.jsx)(s.p,{children:"Learn how to customize and configure the Plasma Desktop on Solus."}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.a,{href:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,n.jsx)(s.p,{children:"Helpful tips and tricks for using Plasma on Solus."})]})}function u(e={}){const{wrapper:s}={...(0,i.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},52603:(e,s,t)=>{t.d(s,{Z:()=>n});const n=t.p+"assets/images/plasma-32bee314c05b57e65e0b26b6bf23f14f.jpg"},11151:(e,s,t)=>{t.d(s,{Z:()=>o,a:()=>a});var n=t(67294);const i={},r=n.createContext(i);function a(e){const s=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0e862883.e57e73d4.js b/assets/js/0e862883.c6b8fd5f.js similarity index 97% rename from assets/js/0e862883.e57e73d4.js rename to assets/js/0e862883.c6b8fd5f.js index 53ec71944..76d989d4d 100644 --- a/assets/js/0e862883.e57e73d4.js +++ b/assets/js/0e862883.c6b8fd5f.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[172],{24673:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var s=t(85893),i=t(11151);const r={},o="Testing an ISO",a={id:"user/contributing/testing-an-iso",title:"Testing an ISO",description:"A handy checklist anyone can use for testing an ISO.",source:"@site/docs/user/contributing/testing-an-iso.md",sourceDirName:"user/contributing",slug:"/user/contributing/testing-an-iso",permalink:"/docs/user/contributing/testing-an-iso",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/contributing/testing-an-iso.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{},sidebar:"userSidebar",previous:{title:"Solus Style Guide",permalink:"/docs/user/contributing/style"},next:{title:"Editions",permalink:"/docs/user/editions/"}},l={},c=[{value:"For any release",id:"for-any-release",level:2},{value:"Laptops",id:"laptops",level:3},{value:"VMs",id:"vms",level:3},{value:"For the specific release",id:"for-the-specific-release",level:2}];function d(e){const n={a:"a",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"testing-an-iso",children:"Testing an ISO"})}),"\n",(0,s.jsx)(n.p,{children:"A handy checklist anyone can use for testing an ISO."}),"\n",(0,s.jsx)(n.p,{children:"This is a list of some general things to check. It is not meant to be exhaustive, just enough to hit major points and hopefully uncover obvious problems. Testers are certainly not prohibited from doing more, at their discretion. Not all points will be testable by everyone (ex: docking / undocking). That is fine; this is just a reference."}),"\n",(0,s.jsx)(n.p,{children:"When testing, try to keep different types of users in mind. For instance, would a general / new user be comfortable with the experience? Would a technical user be put off by a limitation?"}),"\n",(0,s.jsx)(n.h2,{id:"for-any-release",children:"For any release"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"ISO can be written to a USB, used to boot a system and install"}),"\n",(0,s.jsx)(n.li,{children:"Can unlock the device if the live ISO lock screen engages"}),"\n",(0,s.jsx)(n.li,{children:"Installer is easy to follow"}),"\n",(0,s.jsx)(n.li,{children:"Installer detects location, time and time zone properly. Bonus points if the correct timezone is shown in the picker and you don't have to manually select one."}),"\n",(0,s.jsx)(n.li,{children:"Start menu works, has search"}),"\n",(0,s.jsx)(n.li,{children:"Can scan / print / use your peripherals"}),"\n",(0,s.jsx)(n.li,{children:"Sound over speakers"}),"\n",(0,s.jsx)(n.li,{children:"Bluetooth device connects, has high fidelity and headphone modes, you can hear sound"}),"\n",(0,s.jsx)(n.li,{children:"Install your usual software and just make sure basic functionality works"}),"\n",(0,s.jsx)(n.li,{children:"Plugging in a USB drive allows user to mount the drive and access files"}),"\n",(0,s.jsx)(n.li,{children:"System can be put to sleep and woken, things still work after waking (display, keyboard, mouse, sound, network)"}),"\n",(0,s.jsxs)(n.li,{children:["Able to create and use samba shares via file manager (you must ",(0,s.jsx)(n.a,{href:"/docs/user/software/networking/samba#samba-on-solus",children:"enable smb after installation"}),")"]}),"\n",(0,s.jsx)(n.li,{children:"Anything that's been flaky in your experience (LVM, for instance)"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"laptops",children:"Laptops"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Multi-monitor display behaves properly with docking and undocking."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"vms",children:"VMs"}),"\n",(0,s.jsx)(n.p,{children:"This functionality might be affected by the settings of the VM."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Copy and paste works from host to guest ",(0,s.jsx)(n.em,{children:"before"})," install, while booted into the live ISO"]}),"\n",(0,s.jsxs)(n.li,{children:["Copy and paste works ",(0,s.jsx)(n.em,{children:"after"})," installation and rebooting the VM"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"for-the-specific-release",children:"For the specific release"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Any issues that have been recently fixed, or are known to be recently flaky."}),"\n",(0,s.jsx)(n.li,{children:"Check the ISO task in the tracker for other potential areas of interest."}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>o});var s=t(67294);const i={},r=s.createContext(i);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[172],{24673:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var s=t(85893),i=t(11151);const r={},o="Testing an ISO",a={id:"user/contributing/testing-an-iso",title:"Testing an ISO",description:"A handy checklist anyone can use for testing an ISO.",source:"@site/docs/user/contributing/testing-an-iso.md",sourceDirName:"user/contributing",slug:"/user/contributing/testing-an-iso",permalink:"/docs/user/contributing/testing-an-iso",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/contributing/testing-an-iso.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{},sidebar:"userSidebar",previous:{title:"Solus Style Guide",permalink:"/docs/user/contributing/style"},next:{title:"Editions",permalink:"/docs/user/editions/"}},l={},c=[{value:"For any release",id:"for-any-release",level:2},{value:"Laptops",id:"laptops",level:3},{value:"VMs",id:"vms",level:3},{value:"For the specific release",id:"for-the-specific-release",level:2}];function d(e){const n={a:"a",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"testing-an-iso",children:"Testing an ISO"})}),"\n",(0,s.jsx)(n.p,{children:"A handy checklist anyone can use for testing an ISO."}),"\n",(0,s.jsx)(n.p,{children:"This is a list of some general things to check. It is not meant to be exhaustive, just enough to hit major points and hopefully uncover obvious problems. Testers are certainly not prohibited from doing more, at their discretion. Not all points will be testable by everyone (ex: docking / undocking). That is fine; this is just a reference."}),"\n",(0,s.jsx)(n.p,{children:"When testing, try to keep different types of users in mind. For instance, would a general / new user be comfortable with the experience? Would a technical user be put off by a limitation?"}),"\n",(0,s.jsx)(n.h2,{id:"for-any-release",children:"For any release"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"ISO can be written to a USB, used to boot a system and install"}),"\n",(0,s.jsx)(n.li,{children:"Can unlock the device if the live ISO lock screen engages"}),"\n",(0,s.jsx)(n.li,{children:"Installer is easy to follow"}),"\n",(0,s.jsx)(n.li,{children:"Installer detects location, time and time zone properly. Bonus points if the correct timezone is shown in the picker and you don't have to manually select one."}),"\n",(0,s.jsx)(n.li,{children:"Start menu works, has search"}),"\n",(0,s.jsx)(n.li,{children:"Can scan / print / use your peripherals"}),"\n",(0,s.jsx)(n.li,{children:"Sound over speakers"}),"\n",(0,s.jsx)(n.li,{children:"Bluetooth device connects, has high fidelity and headphone modes, you can hear sound"}),"\n",(0,s.jsx)(n.li,{children:"Install your usual software and just make sure basic functionality works"}),"\n",(0,s.jsx)(n.li,{children:"Plugging in a USB drive allows user to mount the drive and access files"}),"\n",(0,s.jsx)(n.li,{children:"System can be put to sleep and woken, things still work after waking (display, keyboard, mouse, sound, network)"}),"\n",(0,s.jsxs)(n.li,{children:["Able to create and use samba shares via file manager (you must ",(0,s.jsx)(n.a,{href:"/docs/user/software/networking/samba#samba-on-solus",children:"enable smb after installation"}),")"]}),"\n",(0,s.jsx)(n.li,{children:"Anything that's been flaky in your experience (LVM, for instance)"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"laptops",children:"Laptops"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Multi-monitor display behaves properly with docking and undocking."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"vms",children:"VMs"}),"\n",(0,s.jsx)(n.p,{children:"This functionality might be affected by the settings of the VM."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Copy and paste works from host to guest ",(0,s.jsx)(n.em,{children:"before"})," install, while booted into the live ISO"]}),"\n",(0,s.jsxs)(n.li,{children:["Copy and paste works ",(0,s.jsx)(n.em,{children:"after"})," installation and rebooting the VM"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"for-the-specific-release",children:"For the specific release"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Any issues that have been recently fixed, or are known to be recently flaky."}),"\n",(0,s.jsx)(n.li,{children:"Check the ISO task in the tracker for other potential areas of interest."}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>o});var s=t(67294);const i={},r=s.createContext(i);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/14488e92.5b7975e1.js b/assets/js/14488e92.1f235025.js similarity index 99% rename from assets/js/14488e92.5b7975e1.js rename to assets/js/14488e92.1f235025.js index e259fa0f0..2e7afc350 100644 --- a/assets/js/14488e92.5b7975e1.js +++ b/assets/js/14488e92.1f235025.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4815],{93980:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>l,contentTitle:()=>A,default:()=>o,frontMatter:()=>n,metadata:()=>r,toc:()=>d});var t=s(85893),c=s(11151);const n={title:"Default Applications",summary:"A guide to the default applications included with Solus."},A="Default applications",r={id:"user/quick-start/default-applications",title:"Default Applications",description:"Each version of Solus comes with a pre-installed collection of desktop applications that can help you perform common tasks.",source:"@site/docs/user/quick-start/default-applications.md",sourceDirName:"user/quick-start",slug:"/user/quick-start/default-applications",permalink:"/docs/user/quick-start/default-applications",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/default-applications.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Default Applications",summary:"A guide to the default applications included with Solus."},sidebar:"userSidebar",previous:{title:"Boot Management",permalink:"/docs/user/quick-start/boot-management"},next:{title:"Preparing to Install",permalink:"/docs/user/quick-start/installation/"}},l={},d=[{value:"Web browser",id:"web-browser",level:2},{value:"Email client",id:"email-client",level:2},{value:"Managing your files",id:"managing-your-files",level:2},{value:"Nemo",id:"nemo",level:3},{value:"GNOME Files",id:"gnome-files",level:3},{value:"Dolphin",id:"dolphin",level:3},{value:"Office suite",id:"office-suite",level:2},{value:"Calc",id:"calc",level:3},{value:"Draw",id:"draw",level:3},{value:"Impress",id:"impress",level:3},{value:"Math",id:"math",level:3},{value:"Writer",id:"writer",level:3},{value:"Spell-checking",id:"spell-checking",level:3},{value:"Finnish",id:"finnish",level:4},{value:"Music",id:"music",level:2},{value:"Rhythmbox",id:"rhythmbox",level:3},{value:"Elisa",id:"elisa",level:3},{value:"Video",id:"video",level:2},{value:"Celluloid",id:"celluloid",level:3},{value:"Haruna",id:"haruna",level:3},{value:"Parole",id:"parole",level:3}];function a(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",ol:"ol",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,c.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"default-applications",children:"Default applications"})}),"\n",(0,t.jsx)(i.p,{children:"Each version of Solus comes with a pre-installed collection of desktop applications that can help you perform common tasks."}),"\n",(0,t.jsx)(i.h2,{id:"web-browser",children:"Web browser"}),"\n",(0,t.jsxs)(i.p,{children:["Solus comes pre-installed with Firefox, a secure and trustworthy web browser provided by the non-profit organization ",(0,t.jsx)(i.a,{href:"https://www.mozilla.org/",children:"Mozilla"}),"."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Firefox Screenshot",src:s(34133).Z+"",width:"1920",height:"1046"})}),"\n",(0,t.jsx)(i.h2,{id:"email-client",children:"Email client"}),"\n",(0,t.jsxs)(i.p,{children:["Solus comes pre-installed with the powerful ",(0,t.jsx)(i.a,{href:"https://www.thunderbird.net/",children:"Thunderbird"})," email, newsgroup, and feeds client."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Thunderbird Screenshot",src:s(80649).Z+"",width:"982",height:"822"})}),"\n",(0,t.jsx)(i.h2,{id:"managing-your-files",children:"Managing your files"}),"\n",(0,t.jsx)(i.p,{children:"Each Linux desktop environment has its own graphical application for managing files:"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Desktop"}),(0,t.jsx)(i.th,{children:"Application"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Budgie"}),(0,t.jsx)(i.td,{children:"Nemo"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"GNOME"}),(0,t.jsx)(i.td,{children:"GNOME Files (formerly Nautilus)"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Plasma"}),(0,t.jsx)(i.td,{children:"Dolphin"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"XFCE"}),(0,t.jsx)(i.td,{children:"Nemo"})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"nemo",children:"Nemo"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Nemo Screenshot",src:s(80274).Z+"",width:"800",height:"586"})}),"\n",(0,t.jsx)(i.h3,{id:"gnome-files",children:"GNOME Files"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"GNOME Files Screenshot",src:s(51055).Z+"",width:"886",height:"548"})}),"\n",(0,t.jsx)(i.h3,{id:"dolphin",children:"Dolphin"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Dolphin Screenshot",src:s(3638).Z+"",width:"1022",height:"721"})}),"\n",(0,t.jsx)(i.h2,{id:"office-suite",children:"Office suite"}),"\n",(0,t.jsxs)(i.p,{children:["Solus comes pre-installed with ",(0,t.jsx)(i.a,{href:"https://www.libreoffice.org",children:"LibreOffice"}),", an office suite that is capable of replacing Microsoft",(0,t.jsx)("sup",{children:"TM"})," Office for the most common tasks."]}),"\n",(0,t.jsx)(i.p,{children:"By default, Solus provides Writer (document editor), Calc (spreadsheet editor), and Impress (presentation editor). Other applications such as Math or Draw can be installed from the Software Center."}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"LibreOffice"}),(0,t.jsx)(i.th,{children:"Microsoft Office Equivalent"}),(0,t.jsx)(i.th,{children:"Apple Equivalent"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Writer"}),(0,t.jsx)(i.td,{children:"Word"}),(0,t.jsx)(i.td,{children:"Pages"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Calc"}),(0,t.jsx)(i.td,{children:"Excel"}),(0,t.jsx)(i.td,{children:"Numbers"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Impress"}),(0,t.jsx)(i.td,{children:"PowerPoint"}),(0,t.jsx)(i.td,{children:"Keynote"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Draw"}),(0,t.jsx)(i.td,{children:"Visio"}),(0,t.jsx)(i.td,{})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Math"}),(0,t.jsx)(i.td,{}),(0,t.jsx)(i.td,{})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"calc",children:"Calc"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Calc Screenshot",src:s(85353).Z+"",width:"1068",height:"607"})}),"\n",(0,t.jsxs)(i.p,{children:["Calc is a spreadsheet editor. You can view, create, and edit spreadsheets as well as leverage a comprehensive range of advanced functions. Calc supports a variety of common open formats and Microsoft",(0,t.jsx)("sup",{children:"TM"})," Office compatible document formats such as (but not limited to): ",(0,t.jsx)(i.code,{children:"xls"}),", ",(0,t.jsx)(i.code,{children:"xlsx"}),", and ",(0,t.jsx)(i.code,{children:"ods"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"draw",children:"Draw"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Draw Screenshot",src:s(91955).Z+"",width:"1068",height:"637"})}),"\n",(0,t.jsxs)(i.p,{children:["Draw is a graphical editor that allows you to sketch diagrams, workflows and any kind of other simple to complex drawing you can imagine. You can install Draw from the Software Center by searching for the package ",(0,t.jsx)(i.code,{children:"libreoffice-draw"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"impress",children:"Impress"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Impress Screenshot",src:s(8017).Z+"",width:"1068",height:"605"})}),"\n",(0,t.jsxs)(i.p,{children:["Impress is a presentation viewer and editor. You can view, create, edit, and export presentations in common open formats or Microsoft",(0,t.jsx)("sup",{children:"TM"})," Office compatible document formats such as (but not limited to): ",(0,t.jsx)(i.code,{children:"ppt"}),", ",(0,t.jsx)(i.code,{children:"pptx"}),", and ",(0,t.jsx)(i.code,{children:"odp"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"math",children:"Math"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Math Screenshot",src:s(56243).Z+"",width:"1068",height:"598"})}),"\n",(0,t.jsxs)(i.p,{children:["Math is a formula editor. Create your mathematical and scientific expressions and insert them with the correct formatting into your text documents, spreadsheets, presentations, or drawings. Math can be installed from the Software Center by searching for the package ",(0,t.jsx)(i.code,{children:"libreoffice-math"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"writer",children:"Writer"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Writer Screenshot",src:s(51304).Z+"",width:"1068",height:"748"})}),"\n",(0,t.jsxs)(i.p,{children:["Writer is a document editor. You can view, create, edit, and export documents in common open formats or Microsoft",(0,t.jsx)("sup",{children:"TM"})," Office compatible document formats such as (but not limited to): ",(0,t.jsx)(i.code,{children:"doc"}),", ",(0,t.jsx)(i.code,{children:"docx"}),", and ",(0,t.jsx)(i.code,{children:"odt"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"spell-checking",children:"Spell-checking"}),"\n",(0,t.jsxs)(i.p,{children:["LibreOffice Writer users may want to install the package ",(0,t.jsx)(i.code,{children:"libreoffice-common-dictionaries"})," from Software Center to automatically enable spell-checking support."]}),"\n",(0,t.jsx)(i.h4,{id:"finnish",children:"Finnish"}),"\n",(0,t.jsxs)(i.p,{children:["Finnish language support is provided by installing ",(0,t.jsx)(i.code,{children:"libreoffice-voikko"}),". After installation of this package, there is further configuration required to properly leverage the Voikko spell-checking and Finnish dictionary support."]}),"\n",(0,t.jsxs)(i.ol,{children:["\n",(0,t.jsx)(i.li,{children:"Open up LibreOffice Writer"}),"\n",(0,t.jsxs)(i.li,{children:["In the menubar, go to ",(0,t.jsx)(i.code,{children:"Tools"})," then ",(0,t.jsx)(i.code,{children:"Options"}),". This will open up the Options dialog."]}),"\n",(0,t.jsx)(i.li,{children:"Go to the Language Settings, listed on the left of Options."}),"\n",(0,t.jsx)(i.li,{children:'Under Language Settings, click Writing Aids and ensure the "Spellchecker (Voikko)", "Grammar checker (Voikko)", and "Hyphenator (Voikko)" are under the "Available language modules" section.'}),"\n",(0,t.jsx)(i.li,{children:'Under Language Settings, click Voikko and ensure "standard: suomi (perussanasto)" is selected under the "Vocabulary" section.'}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"music",children:"Music"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Desktop"}),(0,t.jsx)(i.th,{children:"Application"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Budgie"}),(0,t.jsx)(i.td,{children:"Rhythmbox"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"GNOME"}),(0,t.jsx)(i.td,{children:"Rhythmbox"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Plasma"}),(0,t.jsx)(i.td,{children:"Elisa"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"XFCE"}),(0,t.jsx)(i.td,{children:"Rhythmbox"})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"rhythmbox",children:"Rhythmbox"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Rhythmbox Screenshot",src:s(48392).Z+"",width:"789",height:"606"})}),"\n",(0,t.jsx)(i.h3,{id:"elisa",children:"Elisa"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Elisa Screenshot",src:s(92304).Z+"",width:"1020",height:"720"})}),"\n",(0,t.jsx)(i.h2,{id:"video",children:"Video"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Desktop"}),(0,t.jsx)(i.th,{children:"Application"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Budgie"}),(0,t.jsx)(i.td,{children:"Celluloid (formerly GNOME MPV)"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"GNOME"}),(0,t.jsx)(i.td,{children:"Celluloid (formerly GNOME MPV)"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Plasma"}),(0,t.jsx)(i.td,{children:"Haruna"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"XFCE"}),(0,t.jsx)(i.td,{children:"Parole"})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"celluloid",children:"Celluloid"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Celluloid Screenshot",src:s(18646).Z+"",width:"651",height:"491"})}),"\n",(0,t.jsx)(i.h3,{id:"haruna",children:"Haruna"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Haruna Screenshot",src:s(13289).Z+"",width:"1190",height:"749"})}),"\n",(0,t.jsx)(i.h3,{id:"parole",children:"Parole"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Parole Screenshot",src:s(22407).Z+"",width:"764",height:"450"})})]})}function o(e={}){const{wrapper:i}={...(0,c.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},18646:(e,i,s)=>{s.d(i,{Z:()=>t});const t="data:image/webp;base64,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"},3638:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/dolphin-06132e0261dad073f7f27bbee6bcbfba.jpg"},92304:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/elisa-63e84725c74e3606d527b80a49234bdf.jpg"},34133:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/firefox-0510dce504768afbd216c0fd00abe580.jpg"},13289:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/haruna-aee9cd480cd936456de187af2cb0ecfb.jpg"},85353:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-calc-d000f05dad58cf8e0877111b52108ecb.jpg"},91955:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-draw-46b341512a31da6fdf6505368197b96e.jpg"},8017:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-impress-8851e5e8a47c676d011846d7a919f95d.jpg"},56243:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-math-0fb2b8bfd4c3f8736d107cb81b546a13.jpg"},51304:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-writer-aeca166c3f0379a027c3d34f7d2c5d2c.jpg"},51055:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/nautilus-33ea265420bee017f2cdad24b84e912d.jpg"},80274:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/nemo-b369a1bfe8c00fd1e524e56bd0369e0c.jpg"},22407:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/parole-06df9f8c261a82dbfa968ee1482b4ec0.png"},48392:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/rhythmbox-eb6d0894497e065d9512c2c8454f25e6.jpg"},80649:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/thunderbird-95db449fb1a8d3241f691334bf0b2eb3.jpg"},11151:(e,i,s)=>{s.d(i,{Z:()=>r,a:()=>A});var t=s(67294);const c={},n=t.createContext(c);function A(e){const i=t.useContext(n);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:A(e.components),t.createElement(n.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4815],{93980:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>l,contentTitle:()=>A,default:()=>o,frontMatter:()=>n,metadata:()=>r,toc:()=>d});var t=s(85893),c=s(11151);const n={title:"Default Applications",summary:"A guide to the default applications included with Solus."},A="Default applications",r={id:"user/quick-start/default-applications",title:"Default Applications",description:"Each version of Solus comes with a pre-installed collection of desktop applications that can help you perform common tasks.",source:"@site/docs/user/quick-start/default-applications.md",sourceDirName:"user/quick-start",slug:"/user/quick-start/default-applications",permalink:"/docs/user/quick-start/default-applications",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/default-applications.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Default Applications",summary:"A guide to the default applications included with Solus."},sidebar:"userSidebar",previous:{title:"Boot Management",permalink:"/docs/user/quick-start/boot-management"},next:{title:"Preparing to Install",permalink:"/docs/user/quick-start/installation/"}},l={},d=[{value:"Web browser",id:"web-browser",level:2},{value:"Email client",id:"email-client",level:2},{value:"Managing your files",id:"managing-your-files",level:2},{value:"Nemo",id:"nemo",level:3},{value:"GNOME Files",id:"gnome-files",level:3},{value:"Dolphin",id:"dolphin",level:3},{value:"Office suite",id:"office-suite",level:2},{value:"Calc",id:"calc",level:3},{value:"Draw",id:"draw",level:3},{value:"Impress",id:"impress",level:3},{value:"Math",id:"math",level:3},{value:"Writer",id:"writer",level:3},{value:"Spell-checking",id:"spell-checking",level:3},{value:"Finnish",id:"finnish",level:4},{value:"Music",id:"music",level:2},{value:"Rhythmbox",id:"rhythmbox",level:3},{value:"Elisa",id:"elisa",level:3},{value:"Video",id:"video",level:2},{value:"Celluloid",id:"celluloid",level:3},{value:"Haruna",id:"haruna",level:3},{value:"Parole",id:"parole",level:3}];function a(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",ol:"ol",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,c.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"default-applications",children:"Default applications"})}),"\n",(0,t.jsx)(i.p,{children:"Each version of Solus comes with a pre-installed collection of desktop applications that can help you perform common tasks."}),"\n",(0,t.jsx)(i.h2,{id:"web-browser",children:"Web browser"}),"\n",(0,t.jsxs)(i.p,{children:["Solus comes pre-installed with Firefox, a secure and trustworthy web browser provided by the non-profit organization ",(0,t.jsx)(i.a,{href:"https://www.mozilla.org/",children:"Mozilla"}),"."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Firefox Screenshot",src:s(34133).Z+"",width:"1920",height:"1046"})}),"\n",(0,t.jsx)(i.h2,{id:"email-client",children:"Email client"}),"\n",(0,t.jsxs)(i.p,{children:["Solus comes pre-installed with the powerful ",(0,t.jsx)(i.a,{href:"https://www.thunderbird.net/",children:"Thunderbird"})," email, newsgroup, and feeds client."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Thunderbird Screenshot",src:s(80649).Z+"",width:"982",height:"822"})}),"\n",(0,t.jsx)(i.h2,{id:"managing-your-files",children:"Managing your files"}),"\n",(0,t.jsx)(i.p,{children:"Each Linux desktop environment has its own graphical application for managing files:"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Desktop"}),(0,t.jsx)(i.th,{children:"Application"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Budgie"}),(0,t.jsx)(i.td,{children:"Nemo"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"GNOME"}),(0,t.jsx)(i.td,{children:"GNOME Files (formerly Nautilus)"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Plasma"}),(0,t.jsx)(i.td,{children:"Dolphin"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"XFCE"}),(0,t.jsx)(i.td,{children:"Nemo"})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"nemo",children:"Nemo"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Nemo Screenshot",src:s(80274).Z+"",width:"800",height:"586"})}),"\n",(0,t.jsx)(i.h3,{id:"gnome-files",children:"GNOME Files"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"GNOME Files Screenshot",src:s(51055).Z+"",width:"886",height:"548"})}),"\n",(0,t.jsx)(i.h3,{id:"dolphin",children:"Dolphin"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Dolphin Screenshot",src:s(3638).Z+"",width:"1022",height:"721"})}),"\n",(0,t.jsx)(i.h2,{id:"office-suite",children:"Office suite"}),"\n",(0,t.jsxs)(i.p,{children:["Solus comes pre-installed with ",(0,t.jsx)(i.a,{href:"https://www.libreoffice.org",children:"LibreOffice"}),", an office suite that is capable of replacing Microsoft",(0,t.jsx)("sup",{children:"TM"})," Office for the most common tasks."]}),"\n",(0,t.jsx)(i.p,{children:"By default, Solus provides Writer (document editor), Calc (spreadsheet editor), and Impress (presentation editor). Other applications such as Math or Draw can be installed from the Software Center."}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"LibreOffice"}),(0,t.jsx)(i.th,{children:"Microsoft Office Equivalent"}),(0,t.jsx)(i.th,{children:"Apple Equivalent"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Writer"}),(0,t.jsx)(i.td,{children:"Word"}),(0,t.jsx)(i.td,{children:"Pages"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Calc"}),(0,t.jsx)(i.td,{children:"Excel"}),(0,t.jsx)(i.td,{children:"Numbers"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Impress"}),(0,t.jsx)(i.td,{children:"PowerPoint"}),(0,t.jsx)(i.td,{children:"Keynote"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Draw"}),(0,t.jsx)(i.td,{children:"Visio"}),(0,t.jsx)(i.td,{})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Math"}),(0,t.jsx)(i.td,{}),(0,t.jsx)(i.td,{})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"calc",children:"Calc"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Calc Screenshot",src:s(85353).Z+"",width:"1068",height:"607"})}),"\n",(0,t.jsxs)(i.p,{children:["Calc is a spreadsheet editor. You can view, create, and edit spreadsheets as well as leverage a comprehensive range of advanced functions. Calc supports a variety of common open formats and Microsoft",(0,t.jsx)("sup",{children:"TM"})," Office compatible document formats such as (but not limited to): ",(0,t.jsx)(i.code,{children:"xls"}),", ",(0,t.jsx)(i.code,{children:"xlsx"}),", and ",(0,t.jsx)(i.code,{children:"ods"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"draw",children:"Draw"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Draw Screenshot",src:s(91955).Z+"",width:"1068",height:"637"})}),"\n",(0,t.jsxs)(i.p,{children:["Draw is a graphical editor that allows you to sketch diagrams, workflows and any kind of other simple to complex drawing you can imagine. You can install Draw from the Software Center by searching for the package ",(0,t.jsx)(i.code,{children:"libreoffice-draw"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"impress",children:"Impress"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Impress Screenshot",src:s(8017).Z+"",width:"1068",height:"605"})}),"\n",(0,t.jsxs)(i.p,{children:["Impress is a presentation viewer and editor. You can view, create, edit, and export presentations in common open formats or Microsoft",(0,t.jsx)("sup",{children:"TM"})," Office compatible document formats such as (but not limited to): ",(0,t.jsx)(i.code,{children:"ppt"}),", ",(0,t.jsx)(i.code,{children:"pptx"}),", and ",(0,t.jsx)(i.code,{children:"odp"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"math",children:"Math"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Math Screenshot",src:s(56243).Z+"",width:"1068",height:"598"})}),"\n",(0,t.jsxs)(i.p,{children:["Math is a formula editor. Create your mathematical and scientific expressions and insert them with the correct formatting into your text documents, spreadsheets, presentations, or drawings. Math can be installed from the Software Center by searching for the package ",(0,t.jsx)(i.code,{children:"libreoffice-math"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"writer",children:"Writer"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"LibreOffice Writer Screenshot",src:s(51304).Z+"",width:"1068",height:"748"})}),"\n",(0,t.jsxs)(i.p,{children:["Writer is a document editor. You can view, create, edit, and export documents in common open formats or Microsoft",(0,t.jsx)("sup",{children:"TM"})," Office compatible document formats such as (but not limited to): ",(0,t.jsx)(i.code,{children:"doc"}),", ",(0,t.jsx)(i.code,{children:"docx"}),", and ",(0,t.jsx)(i.code,{children:"odt"}),"."]}),"\n",(0,t.jsx)(i.h3,{id:"spell-checking",children:"Spell-checking"}),"\n",(0,t.jsxs)(i.p,{children:["LibreOffice Writer users may want to install the package ",(0,t.jsx)(i.code,{children:"libreoffice-common-dictionaries"})," from Software Center to automatically enable spell-checking support."]}),"\n",(0,t.jsx)(i.h4,{id:"finnish",children:"Finnish"}),"\n",(0,t.jsxs)(i.p,{children:["Finnish language support is provided by installing ",(0,t.jsx)(i.code,{children:"libreoffice-voikko"}),". After installation of this package, there is further configuration required to properly leverage the Voikko spell-checking and Finnish dictionary support."]}),"\n",(0,t.jsxs)(i.ol,{children:["\n",(0,t.jsx)(i.li,{children:"Open up LibreOffice Writer"}),"\n",(0,t.jsxs)(i.li,{children:["In the menubar, go to ",(0,t.jsx)(i.code,{children:"Tools"})," then ",(0,t.jsx)(i.code,{children:"Options"}),". This will open up the Options dialog."]}),"\n",(0,t.jsx)(i.li,{children:"Go to the Language Settings, listed on the left of Options."}),"\n",(0,t.jsx)(i.li,{children:'Under Language Settings, click Writing Aids and ensure the "Spellchecker (Voikko)", "Grammar checker (Voikko)", and "Hyphenator (Voikko)" are under the "Available language modules" section.'}),"\n",(0,t.jsx)(i.li,{children:'Under Language Settings, click Voikko and ensure "standard: suomi (perussanasto)" is selected under the "Vocabulary" section.'}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"music",children:"Music"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Desktop"}),(0,t.jsx)(i.th,{children:"Application"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Budgie"}),(0,t.jsx)(i.td,{children:"Rhythmbox"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"GNOME"}),(0,t.jsx)(i.td,{children:"Rhythmbox"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Plasma"}),(0,t.jsx)(i.td,{children:"Elisa"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"XFCE"}),(0,t.jsx)(i.td,{children:"Rhythmbox"})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"rhythmbox",children:"Rhythmbox"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Rhythmbox Screenshot",src:s(48392).Z+"",width:"789",height:"606"})}),"\n",(0,t.jsx)(i.h3,{id:"elisa",children:"Elisa"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Elisa Screenshot",src:s(92304).Z+"",width:"1020",height:"720"})}),"\n",(0,t.jsx)(i.h2,{id:"video",children:"Video"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Desktop"}),(0,t.jsx)(i.th,{children:"Application"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Budgie"}),(0,t.jsx)(i.td,{children:"Celluloid (formerly GNOME MPV)"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"GNOME"}),(0,t.jsx)(i.td,{children:"Celluloid (formerly GNOME MPV)"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"Plasma"}),(0,t.jsx)(i.td,{children:"Haruna"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"XFCE"}),(0,t.jsx)(i.td,{children:"Parole"})]})]})]}),"\n",(0,t.jsx)(i.h3,{id:"celluloid",children:"Celluloid"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Celluloid Screenshot",src:s(18646).Z+"",width:"651",height:"491"})}),"\n",(0,t.jsx)(i.h3,{id:"haruna",children:"Haruna"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Haruna Screenshot",src:s(13289).Z+"",width:"1190",height:"749"})}),"\n",(0,t.jsx)(i.h3,{id:"parole",children:"Parole"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"Parole Screenshot",src:s(22407).Z+"",width:"764",height:"450"})})]})}function o(e={}){const{wrapper:i}={...(0,c.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},18646:(e,i,s)=>{s.d(i,{Z:()=>t});const t="data:image/webp;base64,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"},3638:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/dolphin-06132e0261dad073f7f27bbee6bcbfba.jpg"},92304:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/elisa-63e84725c74e3606d527b80a49234bdf.jpg"},34133:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/firefox-0510dce504768afbd216c0fd00abe580.jpg"},13289:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/haruna-aee9cd480cd936456de187af2cb0ecfb.jpg"},85353:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-calc-d000f05dad58cf8e0877111b52108ecb.jpg"},91955:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-draw-46b341512a31da6fdf6505368197b96e.jpg"},8017:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-impress-8851e5e8a47c676d011846d7a919f95d.jpg"},56243:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-math-0fb2b8bfd4c3f8736d107cb81b546a13.jpg"},51304:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/libreoffice-writer-aeca166c3f0379a027c3d34f7d2c5d2c.jpg"},51055:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/nautilus-33ea265420bee017f2cdad24b84e912d.jpg"},80274:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/nemo-b369a1bfe8c00fd1e524e56bd0369e0c.jpg"},22407:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/parole-06df9f8c261a82dbfa968ee1482b4ec0.png"},48392:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/rhythmbox-eb6d0894497e065d9512c2c8454f25e6.jpg"},80649:(e,i,s)=>{s.d(i,{Z:()=>t});const t=s.p+"assets/images/thunderbird-95db449fb1a8d3241f691334bf0b2eb3.jpg"},11151:(e,i,s)=>{s.d(i,{Z:()=>r,a:()=>A});var t=s(67294);const c={},n=t.createContext(c);function A(e){const i=t.useContext(n);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:A(e.components),t.createElement(n.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1a698c37.ed861371.js b/assets/js/1a698c37.611eff98.js similarity index 98% rename from assets/js/1a698c37.ed861371.js rename to assets/js/1a698c37.611eff98.js index 5d2cad819..8dd9310c3 100644 --- a/assets/js/1a698c37.ed861371.js +++ b/assets/js/1a698c37.611eff98.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6126],{99870:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>y,contentTitle:()=>I,default:()=>R,frontMatter:()=>E,metadata:()=>N,toc:()=>M});var n=s(85893),r=s(11151),t=s(22430),d=(s(67294),s(86010)),o=s(55361),a=s(38208),c=s(63186),l=s(42704),u=s(2734),p=s(98396),h=s(51233),m=s(56863),x=s(78146),g=s(27400),f=s(94229),j=s(39217),Z=s(23466);const k=[{name:"Budgie",url:"budgie",urlConfig:"budgie/configuration",urlTips:"budgie/tips-and-tricks",description:(0,n.jsx)(o.Z,{id:"edition.budgie.description",children:"A feature-rich, luxurious desktop using the most modern technologies."})},{name:"Plasma",url:"plasma",urlConfig:"plasma/configuration",urlTips:"plasma/tips-and-tricks",description:(0,n.jsx)(o.Z,{id:"edition.plasma.description",children:"A sophisticated desktop experience for the tinkerers. Simple by default, powerful when needed."})},{name:"GNOME",url:"gnome",urlConfig:"gnome/configuration",urlTips:"gnome/tips-and-tricks",description:(0,n.jsx)(o.Z,{id:"edition.gnome.description",children:"A simple, streamlined desktop for more modern hardware."})},{name:"MATE",url:"mate",urlConfig:"mate/configuration",urlTips:"mate/tips-and-tricks",description:(0,n.jsx)(o.Z,{id:"edition.mate.description",children:"A traditional desktop for advanced users and older hardware."})},{name:"XFCE",url:"xfce",urlConfig:"xfce/configuration",urlTips:"xfce/tips-and-tricks",description:(0,n.jsx)(o.Z,{id:"edition.xfce.description",children:"A lightweight desktop that aims to be fast while still being friendly."})}],b=e=>{let{name:i,url:s,urlConfig:r,urlTips:t,description:k}=e;const b=(0,u.Z)(),A=(0,p.Z)(b.breakpoints.down("xl")),T=(0,Z.ZP)(`/img/${i}.jpg`);return(0,n.jsx)(g.Z,{xs:6,children:(0,n.jsxs)(h.Z,{className:(0,d.Z)("card"),height:1,children:[(0,n.jsx)(h.Z,{className:(0,d.Z)("card__image"),children:(0,n.jsx)(a.Z,{to:s,children:(0,n.jsx)(c.Z,{img:T,alt:(0,o.I)({message:"Screenshot of {name} edition",id:"edition.card.image",description:"Alt text for images of editions"})})})}),(0,n.jsxs)(h.Z,{className:"card__body",children:[(0,n.jsx)(l.Z,{as:"h3",children:(0,n.jsx)("a",{href:i,children:i})}),(0,n.jsx)("p",{children:k})]}),(0,n.jsx)(h.Z,{className:"card__footer",children:(0,n.jsxs)(m.Z,{"aria-label":"contained card button group",fullWidth:!0,sx:{borderRadius:"10px"},variant:"contained",children:[(0,n.jsx)(x.Z,{href:r,startIcon:A?void 0:(0,n.jsx)(f.Z,{}),sx:{borderRadius:"10px",paddingInline:2},children:(0,n.jsx)(o.Z,{id:"edition.card.configuration",children:"Configuration"})}),(0,n.jsx)(x.Z,{href:t,startIcon:A?void 0:(0,n.jsx)(j.Z,{}),sx:{borderRadius:"10px",paddingInline:2},children:(0,n.jsx)(o.Z,{id:"edition.card.tipsntricks",children:"Tips & Tricks"})})]})})]})})},A=()=>(0,n.jsx)(g.Z,{container:!0,columns:{xs:6,sm:6,md:6,lg:12},spacing:2,children:k.map((e=>(0,n.jsx)(b,{...e},e.name)))});var T=s(96189),w=s(21265),C=s(98391);const _=(0,w.Z)({breakpoints:{values:{xs:0,sm:600,md:900,lg:1200,xl:1536,subfullhd:1800,fullhd:1920}},palette:{primary:{light:T.Z.A700,main:T.Z.A700,dark:T.Z.A100}}}),v=(0,C.Z)(_,{breakpoints:_.breakpoints.keys,factor:2}),E={},I="Editions",N={id:"user/editions/index",title:"Editions",description:"",source:"@site/docs/user/editions/index.mdx",sourceDirName:"user/editions",slug:"/user/editions/",permalink:"/docs/user/editions/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/index.mdx",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{},sidebar:"userSidebar",previous:{title:"Testing an ISO",permalink:"/docs/user/contributing/testing-an-iso"},next:{title:"Budgie",permalink:"/docs/user/editions/budgie/"}},y={},M=[];function S(e){const i={h1:"h1",header:"header",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"editions",children:"Editions"})}),"\n","\n",(0,n.jsx)(t.Z,{theme:v,children:(0,n.jsx)(A,{})})]})}function R(e={}){const{wrapper:i}={...(0,r.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(S,{...e})}):S(e)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6126],{99870:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>y,contentTitle:()=>I,default:()=>R,frontMatter:()=>E,metadata:()=>N,toc:()=>M});var n=s(85893),r=s(11151),t=s(22430),d=(s(67294),s(86010)),o=s(55361),a=s(38208),c=s(63186),l=s(42704),u=s(2734),p=s(98396),h=s(51233),m=s(56863),x=s(78146),g=s(27400),f=s(94229),j=s(39217),Z=s(23466);const k=[{name:"Budgie",url:"budgie",urlConfig:"budgie/configuration",urlTips:"budgie/tips-and-tricks",description:(0,n.jsx)(o.Z,{id:"edition.budgie.description",children:"A feature-rich, luxurious desktop using the most modern technologies."})},{name:"Plasma",url:"plasma",urlConfig:"plasma/configuration",urlTips:"plasma/tips-and-tricks",description:(0,n.jsx)(o.Z,{id:"edition.plasma.description",children:"A sophisticated desktop experience for the tinkerers. Simple by default, powerful when needed."})},{name:"GNOME",url:"gnome",urlConfig:"gnome/configuration",urlTips:"gnome/tips-and-tricks",description:(0,n.jsx)(o.Z,{id:"edition.gnome.description",children:"A simple, streamlined desktop for more modern hardware."})},{name:"MATE",url:"mate",urlConfig:"mate/configuration",urlTips:"mate/tips-and-tricks",description:(0,n.jsx)(o.Z,{id:"edition.mate.description",children:"A traditional desktop for advanced users and older hardware."})},{name:"XFCE",url:"xfce",urlConfig:"xfce/configuration",urlTips:"xfce/tips-and-tricks",description:(0,n.jsx)(o.Z,{id:"edition.xfce.description",children:"A lightweight desktop that aims to be fast while still being friendly."})}],b=e=>{let{name:i,url:s,urlConfig:r,urlTips:t,description:k}=e;const b=(0,u.Z)(),A=(0,p.Z)(b.breakpoints.down("xl")),T=(0,Z.ZP)(`/img/${i}.jpg`);return(0,n.jsx)(g.Z,{xs:6,children:(0,n.jsxs)(h.Z,{className:(0,d.Z)("card"),height:1,children:[(0,n.jsx)(h.Z,{className:(0,d.Z)("card__image"),children:(0,n.jsx)(a.Z,{to:s,children:(0,n.jsx)(c.Z,{img:T,alt:(0,o.I)({message:"Screenshot of {name} edition",id:"edition.card.image",description:"Alt text for images of editions"})})})}),(0,n.jsxs)(h.Z,{className:"card__body",children:[(0,n.jsx)(l.Z,{as:"h3",children:(0,n.jsx)("a",{href:i,children:i})}),(0,n.jsx)("p",{children:k})]}),(0,n.jsx)(h.Z,{className:"card__footer",children:(0,n.jsxs)(m.Z,{"aria-label":"contained card button group",fullWidth:!0,sx:{borderRadius:"10px"},variant:"contained",children:[(0,n.jsx)(x.Z,{href:r,startIcon:A?void 0:(0,n.jsx)(f.Z,{}),sx:{borderRadius:"10px",paddingInline:2},children:(0,n.jsx)(o.Z,{id:"edition.card.configuration",children:"Configuration"})}),(0,n.jsx)(x.Z,{href:t,startIcon:A?void 0:(0,n.jsx)(j.Z,{}),sx:{borderRadius:"10px",paddingInline:2},children:(0,n.jsx)(o.Z,{id:"edition.card.tipsntricks",children:"Tips & Tricks"})})]})})]})})},A=()=>(0,n.jsx)(g.Z,{container:!0,columns:{xs:6,sm:6,md:6,lg:12},spacing:2,children:k.map((e=>(0,n.jsx)(b,{...e},e.name)))});var T=s(96189),w=s(21265),C=s(98391);const _=(0,w.Z)({breakpoints:{values:{xs:0,sm:600,md:900,lg:1200,xl:1536,subfullhd:1800,fullhd:1920}},palette:{primary:{light:T.Z.A700,main:T.Z.A700,dark:T.Z.A100}}}),v=(0,C.Z)(_,{breakpoints:_.breakpoints.keys,factor:2}),E={},I="Editions",N={id:"user/editions/index",title:"Editions",description:"",source:"@site/docs/user/editions/index.mdx",sourceDirName:"user/editions",slug:"/user/editions/",permalink:"/docs/user/editions/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/index.mdx",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{},sidebar:"userSidebar",previous:{title:"Testing an ISO",permalink:"/docs/user/contributing/testing-an-iso"},next:{title:"Budgie",permalink:"/docs/user/editions/budgie/"}},y={},M=[];function S(e){const i={h1:"h1",header:"header",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"editions",children:"Editions"})}),"\n","\n",(0,n.jsx)(t.Z,{theme:v,children:(0,n.jsx)(A,{})})]})}function R(e={}){const{wrapper:i}={...(0,r.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(S,{...e})}):S(e)}}}]); \ No newline at end of file diff --git a/assets/js/1ae709a2.86ed44e0.js b/assets/js/1ae709a2.44927e04.js similarity index 98% rename from assets/js/1ae709a2.86ed44e0.js rename to assets/js/1ae709a2.44927e04.js index 047348812..019a5ec19 100644 --- a/assets/js/1ae709a2.86ed44e0.js +++ b/assets/js/1ae709a2.44927e04.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[355],{49332:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var t=n(85893),r=n(11151);const a={title:"History and Software Rollback",summary:"History and Software Rollback"},o="History and software rollback in Solus",i={id:"user/package-management/history-and-rollback",title:"History and Software Rollback",description:"Solus offers a feature to view your history of software changes and revert your system to previous versions.",source:"@site/docs/user/package-management/history-and-rollback.md",sourceDirName:"user/package-management",slug:"/user/package-management/history-and-rollback",permalink:"/docs/user/package-management/history-and-rollback",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/package-management/history-and-rollback.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"History and Software Rollback",summary:"History and Software Rollback"},sidebar:"userSidebar",previous:{title:"Basics to Package Management",permalink:"/docs/user/package-management/basics"},next:{title:"Repository Management",permalink:"/docs/user/package-management/repo-management"}},l={},c=[{value:"History of software changes",id:"history-of-software-changes",level:2},{value:"Rollback",id:"rollback",level:2}];function h(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"history-and-software-rollback-in-solus",children:"History and software rollback in Solus"})}),"\n",(0,t.jsx)(s.p,{children:"Solus offers a feature to view your history of software changes and revert your system to previous versions."}),"\n",(0,t.jsx)(s.p,{children:"You can use this feature if you have issues after installing packages or system updates, and you need to return to a working state."}),"\n",(0,t.jsx)(s.h2,{id:"history-of-software-changes",children:"History of software changes"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"To see your history of software changes, open a terminal and execute:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"eopkg history\n"})}),"\n",(0,t.jsx)(s.p,{children:"The terminal displays a list of all the software changes in your system."}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"eopkg history output",src:n(66082).Z+"",width:"523",height:"617"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"rollback",children:"Rollback"}),"\n",(0,t.jsxs)(s.admonition,{title:"Important",type:"warning",children:[(0,t.jsx)(s.p,{children:"Reverting software changes works if either:"}),(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"The Solus repository has the version of the package you need, or"}),"\n",(0,t.jsx)(s.li,{children:"You have a local copy of the package."}),"\n"]})]}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Disable any ",(0,t.jsx)(s.a,{href:"https://help.getsol.us/docs/packaging/advanced-config/local-repository#disabling-the-local-solbuild-repository-in-eopkg",children:"local repository"})," you have."]}),"\n",(0,t.jsx)(s.p,{children:"Local repositories can cause errors during rollbacks."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Open a terminal."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"View the history of software changes:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"eopkg history\n"})}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Note the number of the most recent software change."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Go back to the desired state:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"sudo eopkg history -t NUMBER\n"})}),"\n",(0,t.jsxs)(s.p,{children:["Replace ",(0,t.jsx)(s.code,{children:"NUMBER"})," with a number lower than the latest software change."]}),"\n",(0,t.jsx)(s.p,{children:"For example, if you want to revert operation 100, use 99 as the number."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.p,{children:"After reverting to the desired state, verify your system status. You might need to restart your system to see some of the changes."})]})}function d(e={}){const{wrapper:s}={...(0,r.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},66082:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/eopkg-history-output-628a9b5bff409bebd31bec29c3d94e37.png"},11151:(e,s,n)=>{n.d(s,{Z:()=>i,a:()=>o});var t=n(67294);const r={},a=t.createContext(r);function o(e){const s=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[355],{49332:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var t=n(85893),r=n(11151);const a={title:"History and Software Rollback",summary:"History and Software Rollback"},o="History and software rollback in Solus",i={id:"user/package-management/history-and-rollback",title:"History and Software Rollback",description:"Solus offers a feature to view your history of software changes and revert your system to previous versions.",source:"@site/docs/user/package-management/history-and-rollback.md",sourceDirName:"user/package-management",slug:"/user/package-management/history-and-rollback",permalink:"/docs/user/package-management/history-and-rollback",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/package-management/history-and-rollback.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"History and Software Rollback",summary:"History and Software Rollback"},sidebar:"userSidebar",previous:{title:"Basics to Package Management",permalink:"/docs/user/package-management/basics"},next:{title:"Repository Management",permalink:"/docs/user/package-management/repo-management"}},l={},c=[{value:"History of software changes",id:"history-of-software-changes",level:2},{value:"Rollback",id:"rollback",level:2}];function h(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"history-and-software-rollback-in-solus",children:"History and software rollback in Solus"})}),"\n",(0,t.jsx)(s.p,{children:"Solus offers a feature to view your history of software changes and revert your system to previous versions."}),"\n",(0,t.jsx)(s.p,{children:"You can use this feature if you have issues after installing packages or system updates, and you need to return to a working state."}),"\n",(0,t.jsx)(s.h2,{id:"history-of-software-changes",children:"History of software changes"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"To see your history of software changes, open a terminal and execute:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"eopkg history\n"})}),"\n",(0,t.jsx)(s.p,{children:"The terminal displays a list of all the software changes in your system."}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"eopkg history output",src:n(66082).Z+"",width:"523",height:"617"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"rollback",children:"Rollback"}),"\n",(0,t.jsxs)(s.admonition,{title:"Important",type:"warning",children:[(0,t.jsx)(s.p,{children:"Reverting software changes works if either:"}),(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"The Solus repository has the version of the package you need, or"}),"\n",(0,t.jsx)(s.li,{children:"You have a local copy of the package."}),"\n"]})]}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Disable any ",(0,t.jsx)(s.a,{href:"https://help.getsol.us/docs/packaging/advanced-config/local-repository#disabling-the-local-solbuild-repository-in-eopkg",children:"local repository"})," you have."]}),"\n",(0,t.jsx)(s.p,{children:"Local repositories can cause errors during rollbacks."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Open a terminal."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"View the history of software changes:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"eopkg history\n"})}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Note the number of the most recent software change."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Go back to the desired state:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"sudo eopkg history -t NUMBER\n"})}),"\n",(0,t.jsxs)(s.p,{children:["Replace ",(0,t.jsx)(s.code,{children:"NUMBER"})," with a number lower than the latest software change."]}),"\n",(0,t.jsx)(s.p,{children:"For example, if you want to revert operation 100, use 99 as the number."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.p,{children:"After reverting to the desired state, verify your system status. You might need to restart your system to see some of the changes."})]})}function d(e={}){const{wrapper:s}={...(0,r.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},66082:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/eopkg-history-output-628a9b5bff409bebd31bec29c3d94e37.png"},11151:(e,s,n)=>{n.d(s,{Z:()=>i,a:()=>o});var t=n(67294);const r={},a=t.createContext(r);function o(e){const s=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/21944812.6adc0d53.js b/assets/js/21944812.a0a566e2.js similarity index 99% rename from assets/js/21944812.6adc0d53.js rename to assets/js/21944812.a0a566e2.js index a8ef9802f..fc481783b 100644 --- a/assets/js/21944812.6adc0d53.js +++ b/assets/js/21944812.a0a566e2.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9873],{43042:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>d});var o=i(85893),s=i(11151);const t={title:"Desktops",summary:"Quick guides on switching between or installing additional Desktop Environments on Solus"},a="Desktop Environments",r={id:"user/software/desktops/index",title:"Desktops",description:"Solus offers a multitude of desktop environments, ranging from the feature-rich and modern Budgie to the traditional XFCE experience. It is recommended to use the ISO for a specific desktop environment but it is possible to install them afterwards if you wish to do try one out.",source:"@site/docs/user/software/desktops/index.md",sourceDirName:"user/software/desktops",slug:"/user/software/desktops/",permalink:"/docs/user/software/desktops/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/desktops/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Desktops",summary:"Quick guides on switching between or installing additional Desktop Environments on Solus"},sidebar:"userSidebar",previous:{title:"Configuration File Locations",permalink:"/docs/user/software/configuration_files"},next:{title:"Development",permalink:"/docs/user/software/development/"}},l={},d=[{value:"Budgie",id:"budgie",level:2},{value:"GNOME Shell",id:"gnome-shell",level:2},{value:"MATE",id:"mate",level:2},{value:"XFCE",id:"xfce",level:2},{value:"Tiling window managers",id:"tiling-window-managers",level:2},{value:"i3",id:"i3",level:3},{value:"Sway",id:"sway",level:3},{value:"Stacking window manager",id:"stacking-window-manager",level:2},{value:"Labwc",id:"labwc",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"desktop-environments",children:"Desktop Environments"})}),"\n",(0,o.jsxs)(n.p,{children:["Solus offers a ",(0,o.jsx)(n.a,{href:"https://getsol.us/solus/experiences/",children:"multitude of desktop environments"}),", ranging from the feature-rich and modern Budgie to the traditional XFCE experience. It is recommended to use the ISO for a specific desktop environment but it is possible to install them afterwards if you wish to do try one out."]}),"\n",(0,o.jsx)(n.p,{children:"WARNING: Do NOT attempt to install ANY other desktop environments next to KDE Plasma Desktop. This scenario is NOT supported and you will be told so in no uncertain terms if asking for support."}),"\n",(0,o.jsx)(n.h2,{id:"budgie",children:"Budgie"}),"\n",(0,o.jsx)(n.p,{children:"The flagship desktop environment / experience of Solus is Budgie. If you have installed either our GNOME or XFCE editions, you can try out and install Budgie by running the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Do NOT attempt to do this if you are running the KDE Plasma Desktop version of Solus!\nsudo eopkg install -c desktop.budgie\n"})}),"\n",(0,o.jsx)(n.h2,{id:"gnome-shell",children:"GNOME Shell"}),"\n",(0,o.jsx)(n.p,{children:"Solus offers a GNOME Shell experience that ships out-of-the-box with a variety of extensions. If you have installed either our Budgie or XFCE editions, you can try out and install GNOME Shell by running the following commands:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Do NOT attempt to do this if you are running the KDE Plasma Desktop version of Solus!\nsudo eopkg install gdm gnome-shell gnome-desktop-branding\n"})}),"\n",(0,o.jsx)(n.h2,{id:"mate",children:"MATE"}),"\n",(0,o.jsx)(n.admonition,{type:"caution",children:(0,o.jsx)(n.p,{children:"We plan to deprecate the MATE Desktop, for a similar experience, consider XFCE."})}),"\n",(0,o.jsxs)(n.p,{children:["Solus offers the MATE desktop environment / experience, tailored to advanced users and older hardware, as well as shipping with our modern menu called ",(0,o.jsx)(n.a,{href:"https://github.com/getsolus/brisk-menu",children:"Brisk Menu"}),". If you have installed either our Budgie or GNOME editions, you can try out and install MATE by running the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Do NOT attempt to do this if you are running the KDE Plasma Desktop version of Solus!\nsudo eopkg install -c desktop.mate\n"})}),"\n",(0,o.jsx)(n.h2,{id:"xfce",children:"XFCE"}),"\n",(0,o.jsx)(n.p,{children:"Solus offers the XFCE desktop environment for users preferring a more lightweight experience. It is recommended for existing MATE users. You can install XFCE with the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Do NOT attempt to do this if you are running the KDE Plasma Desktop version of Solus!\nsudo eopkg install -c desktop.xfce\n"})}),"\n",(0,o.jsx)(n.h2,{id:"tiling-window-managers",children:"Tiling window managers"}),"\n",(0,o.jsx)(n.h3,{id:"i3",children:"i3"}),"\n",(0,o.jsx)(n.p,{children:"Solus offers i3 as a tiling window manager. Users wanting to try i3 can install it by running the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Do NOT attempt to do this if you are running the KDE Plasma Desktop version of Solus!\nsudo eopkg install i3\n"})}),"\n",(0,o.jsx)(n.p,{children:"If you want to use i3 with support for GNOME Settings Daemon and other GNOME functionality, follow the instructions for installation of GNOME Shell, then choose GNOME+i3 at the login screen to use it."}),"\n",(0,o.jsx)(n.h3,{id:"sway",children:"Sway"}),"\n",(0,o.jsx)(n.p,{children:"Solus offers Sway as a Wayland-only tiling window manager. You can install it with the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install sway\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Sway expects users to do some configuration, refer to the ",(0,o.jsx)(n.a,{href:"https://github.com/swaywm/sway/wiki",children:"Sway Wiki"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["For more information about tiling window managers, click ",(0,o.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Tiling_window_manager",children:"here"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"stacking-window-manager",children:"Stacking window manager"}),"\n",(0,o.jsx)(n.h3,{id:"labwc",children:"Labwc"}),"\n",(0,o.jsx)(n.p,{children:"Solus offers Labwc as a Wayland-only stacking window manager. You can install it with the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install labwc\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Labwc expects users to do some configuration, refer to the ",(0,o.jsx)(n.a,{href:"https://labwc.github.io/",children:"Labwc wiki"})]}),"\n",(0,o.jsxs)(n.p,{children:["For more information about stacking window managers, click ",(0,o.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Stacking_window_manager",children:"here"})]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},11151:(e,n,i)=>{i.d(n,{Z:()=>r,a:()=>a});var o=i(67294);const s={},t=o.createContext(s);function a(e){const n=o.useContext(t);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),o.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9873],{43042:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>d});var o=i(85893),s=i(11151);const t={title:"Desktops",summary:"Quick guides on switching between or installing additional Desktop Environments on Solus"},a="Desktop Environments",r={id:"user/software/desktops/index",title:"Desktops",description:"Solus offers a multitude of desktop environments, ranging from the feature-rich and modern Budgie to the traditional XFCE experience. It is recommended to use the ISO for a specific desktop environment but it is possible to install them afterwards if you wish to do try one out.",source:"@site/docs/user/software/desktops/index.md",sourceDirName:"user/software/desktops",slug:"/user/software/desktops/",permalink:"/docs/user/software/desktops/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/desktops/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Desktops",summary:"Quick guides on switching between or installing additional Desktop Environments on Solus"},sidebar:"userSidebar",previous:{title:"Configuration File Locations",permalink:"/docs/user/software/configuration_files"},next:{title:"Development",permalink:"/docs/user/software/development/"}},l={},d=[{value:"Budgie",id:"budgie",level:2},{value:"GNOME Shell",id:"gnome-shell",level:2},{value:"MATE",id:"mate",level:2},{value:"XFCE",id:"xfce",level:2},{value:"Tiling window managers",id:"tiling-window-managers",level:2},{value:"i3",id:"i3",level:3},{value:"Sway",id:"sway",level:3},{value:"Stacking window manager",id:"stacking-window-manager",level:2},{value:"Labwc",id:"labwc",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"desktop-environments",children:"Desktop Environments"})}),"\n",(0,o.jsxs)(n.p,{children:["Solus offers a ",(0,o.jsx)(n.a,{href:"https://getsol.us/solus/experiences/",children:"multitude of desktop environments"}),", ranging from the feature-rich and modern Budgie to the traditional XFCE experience. It is recommended to use the ISO for a specific desktop environment but it is possible to install them afterwards if you wish to do try one out."]}),"\n",(0,o.jsx)(n.p,{children:"WARNING: Do NOT attempt to install ANY other desktop environments next to KDE Plasma Desktop. This scenario is NOT supported and you will be told so in no uncertain terms if asking for support."}),"\n",(0,o.jsx)(n.h2,{id:"budgie",children:"Budgie"}),"\n",(0,o.jsx)(n.p,{children:"The flagship desktop environment / experience of Solus is Budgie. If you have installed either our GNOME or XFCE editions, you can try out and install Budgie by running the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Do NOT attempt to do this if you are running the KDE Plasma Desktop version of Solus!\nsudo eopkg install -c desktop.budgie\n"})}),"\n",(0,o.jsx)(n.h2,{id:"gnome-shell",children:"GNOME Shell"}),"\n",(0,o.jsx)(n.p,{children:"Solus offers a GNOME Shell experience that ships out-of-the-box with a variety of extensions. If you have installed either our Budgie or XFCE editions, you can try out and install GNOME Shell by running the following commands:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Do NOT attempt to do this if you are running the KDE Plasma Desktop version of Solus!\nsudo eopkg install gdm gnome-shell gnome-desktop-branding\n"})}),"\n",(0,o.jsx)(n.h2,{id:"mate",children:"MATE"}),"\n",(0,o.jsx)(n.admonition,{type:"caution",children:(0,o.jsx)(n.p,{children:"We plan to deprecate the MATE Desktop, for a similar experience, consider XFCE."})}),"\n",(0,o.jsxs)(n.p,{children:["Solus offers the MATE desktop environment / experience, tailored to advanced users and older hardware, as well as shipping with our modern menu called ",(0,o.jsx)(n.a,{href:"https://github.com/getsolus/brisk-menu",children:"Brisk Menu"}),". If you have installed either our Budgie or GNOME editions, you can try out and install MATE by running the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Do NOT attempt to do this if you are running the KDE Plasma Desktop version of Solus!\nsudo eopkg install -c desktop.mate\n"})}),"\n",(0,o.jsx)(n.h2,{id:"xfce",children:"XFCE"}),"\n",(0,o.jsx)(n.p,{children:"Solus offers the XFCE desktop environment for users preferring a more lightweight experience. It is recommended for existing MATE users. You can install XFCE with the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Do NOT attempt to do this if you are running the KDE Plasma Desktop version of Solus!\nsudo eopkg install -c desktop.xfce\n"})}),"\n",(0,o.jsx)(n.h2,{id:"tiling-window-managers",children:"Tiling window managers"}),"\n",(0,o.jsx)(n.h3,{id:"i3",children:"i3"}),"\n",(0,o.jsx)(n.p,{children:"Solus offers i3 as a tiling window manager. Users wanting to try i3 can install it by running the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# Do NOT attempt to do this if you are running the KDE Plasma Desktop version of Solus!\nsudo eopkg install i3\n"})}),"\n",(0,o.jsx)(n.p,{children:"If you want to use i3 with support for GNOME Settings Daemon and other GNOME functionality, follow the instructions for installation of GNOME Shell, then choose GNOME+i3 at the login screen to use it."}),"\n",(0,o.jsx)(n.h3,{id:"sway",children:"Sway"}),"\n",(0,o.jsx)(n.p,{children:"Solus offers Sway as a Wayland-only tiling window manager. You can install it with the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install sway\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Sway expects users to do some configuration, refer to the ",(0,o.jsx)(n.a,{href:"https://github.com/swaywm/sway/wiki",children:"Sway Wiki"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["For more information about tiling window managers, click ",(0,o.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Tiling_window_manager",children:"here"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"stacking-window-manager",children:"Stacking window manager"}),"\n",(0,o.jsx)(n.h3,{id:"labwc",children:"Labwc"}),"\n",(0,o.jsx)(n.p,{children:"Solus offers Labwc as a Wayland-only stacking window manager. You can install it with the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install labwc\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Labwc expects users to do some configuration, refer to the ",(0,o.jsx)(n.a,{href:"https://labwc.github.io/",children:"Labwc wiki"})]}),"\n",(0,o.jsxs)(n.p,{children:["For more information about stacking window managers, click ",(0,o.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Stacking_window_manager",children:"here"})]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},11151:(e,n,i)=>{i.d(n,{Z:()=>r,a:()=>a});var o=i(67294);const s={},t=o.createContext(s);function a(e){const n=o.useContext(t);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),o.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/257b9082.64a94637.js b/assets/js/257b9082.2e7b10e9.js similarity index 98% rename from assets/js/257b9082.64a94637.js rename to assets/js/257b9082.2e7b10e9.js index 6cc7159ea..5554a7bc4 100644 --- a/assets/js/257b9082.64a94637.js +++ b/assets/js/257b9082.2e7b10e9.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3192],{31874:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var t=o(85893),r=o(11151);const s={},i="Containers",a={id:"user/software/development/containers",title:"Containers",description:"Containers are a popular method to run and configure applications in a confined environment without directly installing the application and all its dependencies. Solus provides the following container technologies:",source:"@site/docs/user/software/development/containers.md",sourceDirName:"user/software/development",slug:"/user/software/development/containers",permalink:"/docs/user/software/development/containers",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/containers.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{},sidebar:"userSidebar",previous:{title:"Development",permalink:"/docs/user/software/development/"},next:{title:"Java",permalink:"/docs/user/software/development/java"}},c={},l=[{value:"Docker",id:"docker",level:2},{value:"Podman",id:"podman",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"containers",children:"Containers"})}),"\n",(0,t.jsx)(n.p,{children:"Containers are a popular method to run and configure applications in a confined environment without directly installing the application and all its dependencies. Solus provides the following container technologies:"}),"\n",(0,t.jsx)(n.h2,{id:"docker",children:"Docker"}),"\n",(0,t.jsxs)(n.p,{children:["Docker is a container engine developed by Docker Inc. Solus provides the command line utility ",(0,t.jsx)(n.code,{children:"docker"})," to run and manage docker containers."]}),"\n",(0,t.jsxs)(n.p,{children:["A wide variety of applications are available through the official container registry ",(0,t.jsx)(n.a,{href:"https://hub.docker.com/search?q=",children:"Docker Hub"})]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Install the docker engine by running ",(0,t.jsx)(n.code,{children:"sudo eopkg it docker"})," (you may also want to install ",(0,t.jsx)(n.code,{children:"docker-compose"}),")"]}),"\n",(0,t.jsxs)(n.li,{children:["Test your installation with ",(0,t.jsx)(n.code,{children:"sudo docker run hello-world"})]}),"\n",(0,t.jsxs)(n.li,{children:["Optional: For sudo-less docker, run ",(0,t.jsx)(n.code,{children:"sudo usermod -aG docker $USER"}),". You must restart for this change to take effect"]}),"\n",(0,t.jsxs)(n.li,{children:["Optional: Allow the docker daemon to start automatically at system startup ",(0,t.jsx)(n.code,{children:"sudo systemctl enable docker"})]}),"\n",(0,t.jsxs)(n.li,{children:["Refer to the official ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/",children:"Docker Docs"})," for further topics"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"podman",children:"Podman"}),"\n",(0,t.jsx)(n.p,{children:"Podman is a container manager by Red Hat. Podman's main advantage is the capability of running containers without root permissions, thus limiting the attack surface of the host system. Assuming an attacker will be able to escape a compromised container, they won't have full control of the machine."}),"\n",(0,t.jsxs)(n.p,{children:["Podman's command line interface is 100% compatible with Docker, to the point it's possible to replace the ",(0,t.jsx)(n.code,{children:"docker"})," command with ",(0,t.jsx)(n.code,{children:"podman"})," without any subsequent errors."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Install Podman by running ",(0,t.jsx)(n.code,{children:"sudo eopkg it podman"})]}),"\n",(0,t.jsxs)(n.li,{children:["Optionally, add ",(0,t.jsx)(n.code,{children:"alias docker=podman"})," to your initial shell script, should you want to replace Docker with Podman while retaining your typing habits"]}),"\n",(0,t.jsxs)(n.li,{children:["Refer to the official ",(0,t.jsx)(n.a,{href:"https://podman.io/",children:"Podman website"})," for more documentation"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},11151:(e,n,o)=>{o.d(n,{Z:()=>a,a:()=>i});var t=o(67294);const r={},s=t.createContext(r);function i(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3192],{31874:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var t=o(85893),r=o(11151);const s={},i="Containers",a={id:"user/software/development/containers",title:"Containers",description:"Containers are a popular method to run and configure applications in a confined environment without directly installing the application and all its dependencies. Solus provides the following container technologies:",source:"@site/docs/user/software/development/containers.md",sourceDirName:"user/software/development",slug:"/user/software/development/containers",permalink:"/docs/user/software/development/containers",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/containers.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{},sidebar:"userSidebar",previous:{title:"Development",permalink:"/docs/user/software/development/"},next:{title:"Java",permalink:"/docs/user/software/development/java"}},c={},l=[{value:"Docker",id:"docker",level:2},{value:"Podman",id:"podman",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"containers",children:"Containers"})}),"\n",(0,t.jsx)(n.p,{children:"Containers are a popular method to run and configure applications in a confined environment without directly installing the application and all its dependencies. Solus provides the following container technologies:"}),"\n",(0,t.jsx)(n.h2,{id:"docker",children:"Docker"}),"\n",(0,t.jsxs)(n.p,{children:["Docker is a container engine developed by Docker Inc. Solus provides the command line utility ",(0,t.jsx)(n.code,{children:"docker"})," to run and manage docker containers."]}),"\n",(0,t.jsxs)(n.p,{children:["A wide variety of applications are available through the official container registry ",(0,t.jsx)(n.a,{href:"https://hub.docker.com/search?q=",children:"Docker Hub"})]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Install the docker engine by running ",(0,t.jsx)(n.code,{children:"sudo eopkg it docker"})," (you may also want to install ",(0,t.jsx)(n.code,{children:"docker-compose"}),")"]}),"\n",(0,t.jsxs)(n.li,{children:["Test your installation with ",(0,t.jsx)(n.code,{children:"sudo docker run hello-world"})]}),"\n",(0,t.jsxs)(n.li,{children:["Optional: For sudo-less docker, run ",(0,t.jsx)(n.code,{children:"sudo usermod -aG docker $USER"}),". You must restart for this change to take effect"]}),"\n",(0,t.jsxs)(n.li,{children:["Optional: Allow the docker daemon to start automatically at system startup ",(0,t.jsx)(n.code,{children:"sudo systemctl enable docker"})]}),"\n",(0,t.jsxs)(n.li,{children:["Refer to the official ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/",children:"Docker Docs"})," for further topics"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"podman",children:"Podman"}),"\n",(0,t.jsx)(n.p,{children:"Podman is a container manager by Red Hat. Podman's main advantage is the capability of running containers without root permissions, thus limiting the attack surface of the host system. Assuming an attacker will be able to escape a compromised container, they won't have full control of the machine."}),"\n",(0,t.jsxs)(n.p,{children:["Podman's command line interface is 100% compatible with Docker, to the point it's possible to replace the ",(0,t.jsx)(n.code,{children:"docker"})," command with ",(0,t.jsx)(n.code,{children:"podman"})," without any subsequent errors."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Install Podman by running ",(0,t.jsx)(n.code,{children:"sudo eopkg it podman"})]}),"\n",(0,t.jsxs)(n.li,{children:["Optionally, add ",(0,t.jsx)(n.code,{children:"alias docker=podman"})," to your initial shell script, should you want to replace Docker with Podman while retaining your typing habits"]}),"\n",(0,t.jsxs)(n.li,{children:["Refer to the official ",(0,t.jsx)(n.a,{href:"https://podman.io/",children:"Podman website"})," for more documentation"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},11151:(e,n,o)=>{o.d(n,{Z:()=>a,a:()=>i});var t=o(67294);const r={},s=t.createContext(r);function i(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2598a3a5.91df6f56.js b/assets/js/2598a3a5.c3208c71.js similarity index 99% rename from assets/js/2598a3a5.91df6f56.js rename to assets/js/2598a3a5.c3208c71.js index 9f773cc9f..46a17a9d4 100644 --- a/assets/js/2598a3a5.91df6f56.js +++ b/assets/js/2598a3a5.c3208c71.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[5951],{70197:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>d});var i=n(85893),s=n(11151);const o={title:"Configuration",summary:"Help for configuring MATE Desktop on Solus"},a="Configuration",r={id:"user/editions/mate/configuration",title:"Configuration",description:"System",source:"@site/docs/user/editions/mate/configuration.md",sourceDirName:"user/editions/mate",slug:"/user/editions/mate/configuration",permalink:"/docs/user/editions/mate/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/mate/configuration.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Configuration",summary:"Help for configuring MATE Desktop on Solus"},sidebar:"userSidebar",previous:{title:"MATE",permalink:"/docs/user/editions/mate/"},next:{title:"Tips and Tricks",permalink:"/docs/user/editions/mate/tips-and-tricks"}},c={},d=[{value:"System",id:"system",level:2},{value:"Date and time",id:"date-and-time",level:3},{value:"Default applications",id:"default-applications",level:3},{value:"Displays",id:"displays",level:2},{value:"Keyboard layout",id:"keyboard-layout",level:2},{value:"IBus",id:"ibus",level:3},{value:"Mouse and touchpad",id:"mouse-and-touchpad",level:2},{value:"Mouse",id:"mouse",level:3},{value:"Touchpad",id:"touchpad",level:3},{value:"Networking",id:"networking",level:2},{value:"Non-hidden network",id:"non-hidden-network",level:3},{value:"Hidden network",id:"hidden-network",level:3},{value:"Sound and sound devices",id:"sound-and-sound-devices",level:2},{value:"Settings",id:"settings",level:3},{value:"Users",id:"users",level:2},{value:"Adding a user",id:"adding-a-user",level:3},{value:"Removing a user",id:"removing-a-user",level:3},{value:"User interface",id:"user-interface",level:2},{value:"Desktop background",id:"desktop-background",level:3},{value:"Desktop icons",id:"desktop-icons",level:3},{value:"Workspaces",id:"workspaces",level:2},{value:"Keyboard shortcuts",id:"keyboard-shortcuts",level:3},{value:"Workspaces configuration",id:"workspaces-configuration",level:3}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,i.jsx)(t.h2,{id:"system",children:"System"}),"\n",(0,i.jsx)(t.h3,{id:"date-and-time",children:"Date and time"}),"\n",(0,i.jsx)(t.p,{children:'Using MATE, there are a couple of different ways to change the date and time. You can right click on the time in the bottom panel and click on "Preferences".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Date and Time Right-Click Menu",src:n(14205).Z+"",width:"195",height:"298"})}),"\n",(0,i.jsx)(t.p,{children:"This opens the Clock Preferences window and allows you to show the date, seconds or use 24 hour time."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Clock Preferences",src:n(87653).Z+"",width:"375",height:"367"})}),"\n",(0,i.jsx)(t.p,{children:'To change the time, click on "Time Settings" at the bottom of this window.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Time Settings",src:n(11410).Z+"",width:"459",height:"355"})}),"\n",(0,i.jsx)(t.p,{children:'Once you have the correct time, you can click on "Set System Time".'}),"\n",(0,i.jsx)(t.p,{children:'Alternatively, if you wish to change your timezone, open the Brisk Menu and then click on "Administration" followed by "Time and Date". Click on "Unlock" and input your user password so that you can alter the time zone.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Timezone Settings",src:n(89206).Z+"",width:"496",height:"380"})}),"\n",(0,i.jsx)(t.h3,{id:"default-applications",children:"Default applications"}),"\n",(0,i.jsx)(t.p,{children:'Using MATE, open the Brisk Menu and click on "Preferences" and then on "Preferred Applications".'}),"\n",(0,i.jsx)(t.p,{children:"In this section you will need to click one of the five tabs at the top to find the category you wish to change. For most categories, you will need to have installed alternative applications before you can change the default settings. For instance, if you wish to change the default image viewer from Eye of MATE to GIMP then you must first install GIMP (available in the Software Center)."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Preferred Applications",src:n(33340).Z+"",width:"399",height:"355"})}),"\n",(0,i.jsx)(t.p,{children:'You can specify default applications for individual file types by right clicking on a file and then clicking on "Open with other Application...".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE File Context Menu",src:n(32077).Z+"",width:"302",height:"384"})}),"\n",(0,i.jsx)(t.p,{children:'Next, select the application you wish to use and make sure "Remember this application for "your file type" files" is ticked. Finish by clicking "Open". In the future, all files with the same file type will open with the same application.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Application Selection",src:n(48197).Z+"",width:"426",height:"501"})}),"\n",(0,i.jsx)(t.h2,{id:"displays",children:"Displays"}),"\n",(0,i.jsx)(t.p,{children:'With MATE, open the Brisk Menu and click on "Preferences" and then on "Displays".'}),"\n",(0,i.jsx)(t.p,{children:'This opens the Monitor Preferences window and your display(s) will be represented by 1 or more colored boxes. Click on the individual display you wish to configure. You will now be able to select if you wish to set this monitor as the primary display, mirror all displays by turning on "Same image in all monitors", or turn it off. This window also gives you the ability to change the aspect ratio, rotate the display, and to change the resolution.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Monitor Preferences",src:n(95067).Z+"",width:"556",height:"363"})}),"\n",(0,i.jsx)(t.p,{children:"You can arrange your displays by dragging the colored boxes to your preferred positions, as shown below."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Monitor Arrangement",src:n(5229).Z+"",width:"556",height:"363"})}),"\n",(0,i.jsx)(t.p,{children:'Click "Apply" once you are happy with your changes. If you would like to apply the changes to all the user accounts on your system, click on "Apply system-wide". You will be shown a message asking if the display looks OK, if it does, click on "Keep This Configuration" within 30 seconds.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Confirm Monitor Preferences",src:n(572).Z+"",width:"483",height:"146"})}),"\n",(0,i.jsx)(t.h2,{id:"keyboard-layout",children:"Keyboard layout"}),"\n",(0,i.jsx)(t.p,{children:'To change your keyboard layout in MATE, open the Brisk Menu and click on "Preferences" and then on "Keyboard". This will open the Keyboard Preferences window, now click on the "Layouts" tab.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Keyboard Preferences",src:n(91066).Z+"",width:"452",height:"527"})}),"\n",(0,i.jsx)(t.p,{children:'To add a layout, click on the "+ Add..." button. The 2 tabs at the top of the chooser window give you the option to find your layout by country or by language. The preview gives you a graphical representation of each layout. Once you are happy with your selection, click on "+ Add".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Choose Keyboard Layout",src:n(46721).Z+"",width:"800",height:"509"})}),"\n",(0,i.jsx)(t.p,{children:'You can remove a keyboard layout by selecting one of the items in your layouts list and then clicking the "- Remove" button.'}),"\n",(0,i.jsx)(t.p,{children:"If you wish to use multiple keyboard layouts, you can switch between them by left clicking on the keyboard layout icon shown in the system tray. The icon will automatically appear when you have 2 or more keyboard layouts selected. A right click allows you to open the keyboard preferences window and to see the graphical view of your current layout."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Keyboard Indicator",src:n(89990).Z+"",width:"370",height:"141"})}),"\n",(0,i.jsx)(t.p,{children:'To enable keyboard shortcuts for easy switching, re-open the Keyboard Preferences window and open the "Layouts" tab again. Now click on the "Options..." button. This will open a detailed options list, look for and click on "Switching to another layout". Select one or more of the available keyboard shortcuts and then finish by clicking "X Close".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Keyboard Layout Shortcuts",src:n(19720).Z+"",width:"552",height:"425"})}),"\n",(0,i.jsx)(t.h3,{id:"ibus",children:"IBus"}),"\n",(0,i.jsx)(t.p,{children:'By default, IBus needs to be started in MATE before it can be used. Open the Brisk Menu, click on "Preferences" and then on "IBus Preferences". You will be asked if you wish to start the IBus daemon, click "Yes".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE IBus Starting Daemon",src:n(29608).Z+"",width:"419",height:"111"})}),"\n",(0,i.jsx)(t.p,{children:'If you wish to have the IBus daemon start automatically every time you start Solus MATE, Open the Brisk Menu, click on "Preferences" and then on "Startup Applications". Under the Startup Programs tab, click on "+ Add".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Startup Applications",src:n(61690).Z+"",width:"468",height:"379"})}),"\n",(0,i.jsxs)(t.p,{children:["In the Command box, you will need to write ",(0,i.jsx)(t.code,{children:"ibus-daemon --xim"}),'. If you wish, you can also fill in a Name and Comment but these are not compulsory. Once you are happy with your inputs, click the "+ Add" button. IBus will now run each time you boot your computer.']}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Add IBus Startup Entry",src:n(88955).Z+"",width:"372",height:"177"})}),"\n",(0,i.jsxs)(t.p,{children:["If you need an additional IBus IME for your language see: ",(0,i.jsx)(t.a,{href:"/docs/user/software/localization/ibus/",children:"IBus"})]}),"\n",(0,i.jsxs)(t.p,{children:["Finish by closing the IBus Preferences window. You can now switch between your layouts by using the keyboard shortcut ",(0,i.jsx)(t.code,{children:"Super + Space"}),"."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE IBus Keyboard Shortcut",src:n(57540).Z+"",width:"142",height:"101"})}),"\n",(0,i.jsx)(t.p,{children:"Or by left clicking on the keyboard layout icon shown in the system tray and selecting the layout you wish to use."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Bottom Panel IBus",src:n(31132).Z+"",width:"239",height:"207"})}),"\n",(0,i.jsx)(t.h2,{id:"mouse-and-touchpad",children:"Mouse and touchpad"}),"\n",(0,i.jsx)(t.p,{children:'With MATE, open the Brisk Menu and click on "Preferences" and then on "Mouse". You can toggle between the mouse and touchpad settings using the tabs at the top of the Mouse Preferences window. Click "Close" once you have finished making changes.'}),"\n",(0,i.jsx)(t.h3,{id:"mouse",children:"Mouse"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Mouse Settings",src:n(39667).Z+"",width:"502",height:"611"})}),"\n",(0,i.jsx)(t.p,{children:"For mice, you can set:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Left-handed or right-handed. This will change your primary button."}),"\n",(0,i.jsx)(t.li,{children:"Locate the pointer when the Control key is pressed."}),"\n",(0,i.jsx)(t.li,{children:"Mouse speed and sensitivity."}),"\n",(0,i.jsx)(t.li,{children:"Drag and Drop threshold. This is designed to prevent accidental dragging and dropping by setting the distance required to initiate a drag."}),"\n",(0,i.jsx)(t.li,{children:"Double click timeout. The length of time between 2 mouse clicks for it to register as a double click."}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"touchpad",children:"Touchpad"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Touchpad Settings",src:n(92324).Z+"",width:"502",height:"605"})}),"\n",(0,i.jsx)(t.p,{children:"For touchpads, you can set:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Enabling / disabling of the touchpad."}),"\n",(0,i.jsx)(t.li,{children:"Enabling / disabling of the touchpad whilst typing."}),"\n",(0,i.jsx)(t.li,{children:"Enabling / disabling of mouse clicks with the touchpad."}),"\n",(0,i.jsx)(t.li,{children:"Two and three finger click emulation."}),"\n",(0,i.jsx)(t.li,{children:"Various edge and two finger scrolling options."}),"\n",(0,i.jsx)(t.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n",(0,i.jsx)(t.li,{children:"Touchpad speed and sensitivity."}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"networking",children:"Networking"}),"\n",(0,i.jsx)(t.p,{children:'With MATE, you can manage your network settings by left or right clicking on the network icon in the bottom panel system tray. A left click will bring up any wireless or wired connections currently available whilst a right click allows you to disable networking, view your current connection information and to create new connections and networks by clicking "Edit Connections...".'}),"\n",(0,i.jsx)(t.h3,{id:"non-hidden-network",children:"Non-hidden network"}),"\n",(0,i.jsx)(t.p,{children:'To connect to a network, left click on the network icon in the system tray. This will show you a selection of the networks currently available and you may need to click on "More networks" to find the one you want.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Networking Applet",src:n(35811).Z+"",width:"520",height:"475"})}),"\n",(0,i.jsx)(t.p,{children:'You may now be prompted to authenticate with the network. Type in your password and then click "Connect".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Network Authentication",src:n(21908).Z+"",width:"490",height:"254"})}),"\n",(0,i.jsx)(t.p,{children:"If your password is correct, you will now be authenticated with the network."}),"\n",(0,i.jsx)(t.p,{children:'Should you wish to disconnect from a network, left click on the network icon again and then click on "Disconnect" underneath the network you wish to leave.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Disconnect from Network",src:n(56120).Z+"",width:"283",height:"169"})}),"\n",(0,i.jsx)(t.h3,{id:"hidden-network",children:"Hidden network"}),"\n",(0,i.jsx)(t.p,{children:'To connect to a hidden network, left click on the network icon in the system tray and then on "Connect to Hidden Wi-Fi Network...". You will now be asked for the network name and type of security (if any).'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Hidden Network",src:n(225).Z+"",width:"490",height:"247"})}),"\n",(0,i.jsx)(t.p,{children:"If the network is found and has a password, you will be prompted to authenticate with the network."}),"\n",(0,i.jsx)(t.h2,{id:"sound-and-sound-devices",children:"Sound and sound devices"}),"\n",(0,i.jsx)(t.p,{children:"To alter the volume in MATE, left click on the speaker icon in the bottom panel system tray and then drag the volume slider with your mouse."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Volume Control",src:n(68146).Z+"",width:"71",height:"193"})}),"\n",(0,i.jsx)(t.h3,{id:"settings",children:"Settings"}),"\n",(0,i.jsx)(t.p,{children:'You can access sound settings, including individual application volume controls, and a simple speaker test by right clicking on the speaker icon in the bottom panel system tray and then clicking on "Sound Preferences". Alternatively, you can open the Brisk Menu and then click on "Preferences" followed by "Sound".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Sound Applet",src:n(13815).Z+"",width:"219",height:"113"})}),"\n",(0,i.jsx)(t.p,{children:"This will open the Sound Preferences window as shown below."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Sound Preferences",src:n(90751).Z+"",width:"550",height:"423"})}),"\n",(0,i.jsx)(t.h2,{id:"users",children:"Users"}),"\n",(0,i.jsx)(t.p,{children:'To add and remove users with MATE, open the Brisk Menu and click on "Administration" and then on "Users and Groups".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Users and Groups",src:n(92617).Z+"",width:"652",height:"431"})}),"\n",(0,i.jsx)(t.h3,{id:"adding-a-user",children:"Adding a user"}),"\n",(0,i.jsx)(t.p,{children:'To add a user, click the "+ Add" button underneath the list of users. You will be asked to input your password before you can make changes.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE New User",src:n(65545).Z+"",width:"307",height:"540"})}),"\n",(0,i.jsx)(t.p,{children:'Fill in the required items and then finish adding the new user by clicking "OK" in the bottom right corner.'}),"\n",(0,i.jsx)(t.h3,{id:"removing-a-user",children:"Removing a user"}),"\n",(0,i.jsx)(t.p,{children:'To remove a user, open the User Settings window and then click on the user you wish to remove. Now click on the "- Delete" button underneath the list of users.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE User List",src:n(43845).Z+"",width:"652",height:"431"})}),"\n",(0,i.jsx)(t.p,{children:"Upon clicking to remove the user, you will be given the option to keep their files, delete their files, or cancel the removal of the user\u2019s account."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Keep Files Prompt",src:n(2390).Z+"",width:"540",height:"203"})}),"\n",(0,i.jsx)(t.h2,{id:"user-interface",children:"User interface"}),"\n",(0,i.jsx)(t.h3,{id:"desktop-background",children:"Desktop background"}),"\n",(0,i.jsx)(t.p,{children:'If you wish to change the MATE desktop background, simply right click anywhere on the desktop and select "Change Desktop Background".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Background Right Click Menu",src:n(25408).Z+"",width:"261",height:"254"})}),"\n",(0,i.jsx)(t.p,{children:'Alternatively, open the Brisk Menu and click on "Preferences" and then on "Appearance". Click on the "Background" tab at the top if it isn\'t already selected.'}),"\n",(0,i.jsx)(t.p,{children:'In this section, you can choose between Solus wallpapers, solid colors, gradients or using your own pictures by clicking "Add". After choosing, click "Close".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Desktop Background Selection",src:n(46964).Z+"",width:"785",height:"536"})}),"\n",(0,i.jsx)(t.h3,{id:"desktop-icons",children:"Desktop icons"}),"\n",(0,i.jsx)(t.p,{children:'MATE has desktop icons enabled by default. If you wish to disable or re-enable them, open the Brisk Menu, click on "Preferences" and then on "MATE Tweak". You can then toggle them on and off by clicking "Show Desktop Icons" under the Desktop section.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Tweak Tool",src:n(88409).Z+"",width:"626",height:"599"})}),"\n",(0,i.jsx)(t.p,{children:"You may now add things to your Desktop. This can be done by dragging an item onto the Desktop, right clicking an icon and selecting Copy to / Move to Desktop or by opening the Caja file manager and then moving the files you want to the Desktop folder (as shown in the image below)."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Desktop Folder",src:n(67887).Z+"",width:"803",height:"581"})}),"\n",(0,i.jsx)(t.h2,{id:"workspaces",children:"Workspaces"}),"\n",(0,i.jsxs)(t.p,{children:["In MATE, workspaces are enabled by default. You can move between workspaces by using the keyboard shortcuts ",(0,i.jsx)(t.code,{children:"Ctrl + Alt + Left"})," and ",(0,i.jsx)(t.code,{children:"Ctrl + Alt + Right"}),"."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Workspace Switching",src:n(43433).Z+"",width:"242",height:"93"})}),"\n",(0,i.jsx)(t.p,{children:'To send an application to a different workspace, right click on the applications titlebar and then use the "Move to Another Workspace" option or "Move to Workspace Right".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Workspace Menu",src:n(86624).Z+"",width:"411",height:"385"})}),"\n",(0,i.jsx)(t.p,{children:'One of the easiest ways to view and manage your workspaces is by using the Workspace Switcher. Right click inside the bottom panel and then click on "+ Add to Panel...".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Open Panel Configuration",src:n(23084).Z+"",width:"177",height:"228"})}),"\n",(0,i.jsx)(t.p,{children:'Towards the bottom of the list you will find the Workspace Switcher. Click on it and then finish by clicking "+ Add".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Add Applet to Panel",src:n(87666).Z+"",width:"512",height:"351"})}),"\n",(0,i.jsx)(t.p,{children:"You should now be able to see 4 slightly darker boxes to the left of your MATE system tray in the bottom panel. The workspace you are currently viewing will be highlighted in blue."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Workspace Switcher",src:n(77967).Z+"",width:"265",height:"48"})}),"\n",(0,i.jsx)(t.p,{children:"In addition to using keyboard shortcuts, you will now be able to switch workspaces by clicking on them in the bottom panel. You can also drag one workspace onto another in the bottom panel which will move the current active application to the new workspace."}),"\n",(0,i.jsx)(t.h3,{id:"keyboard-shortcuts",children:"Keyboard shortcuts"}),"\n",(0,i.jsx)(t.p,{children:"MATE provides a variety of keyboard shortcuts for workspaces. By default, the keyboard shortcuts for switching directly to a certain workspace are disabled."}),"\n",(0,i.jsx)(t.p,{children:'To enable these and to also view all other available shortcuts open the Brisk Menu and click on "Preferences" and then on "Keyboard Shortcuts". The workspace shortcuts are listed under Windows Management.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Workspace Keyboard Shortcuts",src:n(63008).Z+"",width:"626",height:"408"})}),"\n",(0,i.jsx)(t.h3,{id:"workspaces-configuration",children:"Workspaces configuration"}),"\n",(0,i.jsx)(t.p,{children:'By default, MATE provides you with 4 workspaces. If you would like to have more, less or change their names you must first add the Workspace Switcher to your bottom panel, as detailed above. You\'ll then be able to right click on the Workspace Switcher and select "Preferences".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Open Switcher Preferences",src:n(5070).Z+"",width:"203",height:"228"})}),"\n",(0,i.jsx)(t.p,{children:'Use the plus and minus icons to add or remove workspaces. You can rename workspaces by double clicking on the current names and typing in an alternative. Click "X Close" once you are happy with your changes.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Workspace Switcher Preferences",src:n(3466).Z+"",width:"367",height:"409"})})]})}function h(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},67887:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/caja-desktop-folder-4165fea2b0afc876931a10dbeb707384.jpg"},25408:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-background-right-click-0edaca8eb885eb54466e0a358d0f06ea.jpg"},46964:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-background-selection-fefc0656871c76fa23c620d99521a0ef.jpg"},31132:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-bottom-panel-ibus-left-click-016e725ce808036efb8bc77bd7fb47d8.jpg"},89990:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-bottom-panel-keyboard-22cf218bfdf946e6c10250af144d2166.jpg"},35811:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-bottom-panel-network-left-click-d3520a23fb573b5b52700f97306190a9.jpg"},23084:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-bottom-panel-right-click-83df358e1390b363d6ae99f7465d006f.jpg"},13815:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-bottom-panel-sound-right-click-696d602e3df72f0463e5984e82964a20.jpg"},87653:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-clock-preferences-29e68150fa5526f0fbaab28c6f0ad6c2.jpg"},65545:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-create-new-user-00e085b06fb8c6899a23f90d14b50a29.jpg"},88955:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-ibus-add-startup-4f4ef3cf4e94656d727ff93c4e299432.jpg"},57540:(e,t,n)=>{n.d(t,{Z:()=>i});const i="data:image/jpeg;base64,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"},29608:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-ibus-starting-daemon-84bcee7978b1d8eb7163cb0d9b964ec3.jpg"},2390:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-keep-files-prompt-2aa2cbdb6a94db223d708562c884d71a.jpg"},46721:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-keyboard-choose-layout-e0ca24f2aa125275817acb229a194923.jpg"},19720:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-keyboard-layout-shortcuts-62aefb0c48a9d92a34c277497866e85e.jpg"},91066:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-keyboard-preferences-f13098df57c42dc0259006b9ac386dde.jpg"},572:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-monitor-preferences-confirm-c9ddeb8ecc32eb0a88fc49b247bd2535.jpg"},5229:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-monitor-preferences-dragging-0fb78bb10ab52ce991b90df95a517622.jpg"},95067:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-monitor-preferences-db6d4f848b460b4278da5c95e62d4d9d.jpg"},39667:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-mouse-settings-d43911b0e7fdc6f3a196808da1e353a8.jpg"},43845:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-multiple-user-settings-112efa554f35300d772bb5ede0cc603c.jpg"},21908:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-network-authentication-13f522132661aa358181f94e002fcc9f.jpg"},56120:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-network-disconnect-eff4984eda8c49d3e42259381f0490b0.jpg"},225:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-network-hidden-38a73abbffc438c4c8dc66f70d38fe33.jpg"},32077:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-open-with-right-click-096ce2548d773af1ee45fceb5f2153e4.jpg"},48197:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-open-with-setting-86e0958d69c60f7b4253ac2989931023.jpg"},33340:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-preferred-applications-dcd4e02b67ec579d69171c22c1eb38d3.jpg"},92617:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-single-user-settings-a1253a12d1a7214129fe3ac5dd897e32.jpg"},90751:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-sound-preferences-e6f0a451c79339dfbc290113f63e2894.jpg"},61690:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-startup-applications-e0d8dbd51c24a2987e3b83bc758d35fc.jpg"},14205:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-time-and-date-right-click-792aa50841ec26d8fcd4803ebb171839.jpg"},89206:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-time-and-date-settings-5fd258bf8a3cd09c075789ecb72370b4.jpg"},11410:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-time-and-date-c6cabc4c6ccfb4d51983c582ac985445.jpg"},92324:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-touchpad-settings-d9b3577e085d2ec9f5e357263f35ef90.jpg"},88409:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-tweak-desktop-30894d02f2a10654d0b8219947f974e6.jpg"},68146:(e,t,n)=>{n.d(t,{Z:()=>i});const i="data:image/jpeg;base64,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"},63008:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-keyboard-shortcuts-24395c1aa3f623b6b89284cffe6bd2e1.jpg"},87666:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-switch-add-to-panel-e57ec1f9a49d5dcf52f3126805d1d110.jpg"},3466:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-switcher-preferences-55630462d2aecfc0bd0f511b4ca5cd7c.jpg"},5070:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-switcher-right-click-0660da43481f40fe6fec7d39e0ec6f06.jpg"},77967:(e,t,n)=>{n.d(t,{Z:()=>i});const i="data:image/jpeg;base64,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"},43433:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-switching-a0f8cff6b00100314fd9f77994b5dcc9.jpg"},86624:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-titlebar-right-click-6dfec2d387d17d6ca06de2ed728ff521.jpg"},11151:(e,t,n)=>{n.d(t,{Z:()=>r,a:()=>a});var i=n(67294);const s={},o=i.createContext(s);function a(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[5951],{70197:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>d});var i=n(85893),s=n(11151);const o={title:"Configuration",summary:"Help for configuring MATE Desktop on Solus"},a="Configuration",r={id:"user/editions/mate/configuration",title:"Configuration",description:"System",source:"@site/docs/user/editions/mate/configuration.md",sourceDirName:"user/editions/mate",slug:"/user/editions/mate/configuration",permalink:"/docs/user/editions/mate/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/mate/configuration.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Configuration",summary:"Help for configuring MATE Desktop on Solus"},sidebar:"userSidebar",previous:{title:"MATE",permalink:"/docs/user/editions/mate/"},next:{title:"Tips and Tricks",permalink:"/docs/user/editions/mate/tips-and-tricks"}},c={},d=[{value:"System",id:"system",level:2},{value:"Date and time",id:"date-and-time",level:3},{value:"Default applications",id:"default-applications",level:3},{value:"Displays",id:"displays",level:2},{value:"Keyboard layout",id:"keyboard-layout",level:2},{value:"IBus",id:"ibus",level:3},{value:"Mouse and touchpad",id:"mouse-and-touchpad",level:2},{value:"Mouse",id:"mouse",level:3},{value:"Touchpad",id:"touchpad",level:3},{value:"Networking",id:"networking",level:2},{value:"Non-hidden network",id:"non-hidden-network",level:3},{value:"Hidden network",id:"hidden-network",level:3},{value:"Sound and sound devices",id:"sound-and-sound-devices",level:2},{value:"Settings",id:"settings",level:3},{value:"Users",id:"users",level:2},{value:"Adding a user",id:"adding-a-user",level:3},{value:"Removing a user",id:"removing-a-user",level:3},{value:"User interface",id:"user-interface",level:2},{value:"Desktop background",id:"desktop-background",level:3},{value:"Desktop icons",id:"desktop-icons",level:3},{value:"Workspaces",id:"workspaces",level:2},{value:"Keyboard shortcuts",id:"keyboard-shortcuts",level:3},{value:"Workspaces configuration",id:"workspaces-configuration",level:3}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,i.jsx)(t.h2,{id:"system",children:"System"}),"\n",(0,i.jsx)(t.h3,{id:"date-and-time",children:"Date and time"}),"\n",(0,i.jsx)(t.p,{children:'Using MATE, there are a couple of different ways to change the date and time. You can right click on the time in the bottom panel and click on "Preferences".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Date and Time Right-Click Menu",src:n(14205).Z+"",width:"195",height:"298"})}),"\n",(0,i.jsx)(t.p,{children:"This opens the Clock Preferences window and allows you to show the date, seconds or use 24 hour time."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Clock Preferences",src:n(87653).Z+"",width:"375",height:"367"})}),"\n",(0,i.jsx)(t.p,{children:'To change the time, click on "Time Settings" at the bottom of this window.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Time Settings",src:n(11410).Z+"",width:"459",height:"355"})}),"\n",(0,i.jsx)(t.p,{children:'Once you have the correct time, you can click on "Set System Time".'}),"\n",(0,i.jsx)(t.p,{children:'Alternatively, if you wish to change your timezone, open the Brisk Menu and then click on "Administration" followed by "Time and Date". Click on "Unlock" and input your user password so that you can alter the time zone.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Timezone Settings",src:n(89206).Z+"",width:"496",height:"380"})}),"\n",(0,i.jsx)(t.h3,{id:"default-applications",children:"Default applications"}),"\n",(0,i.jsx)(t.p,{children:'Using MATE, open the Brisk Menu and click on "Preferences" and then on "Preferred Applications".'}),"\n",(0,i.jsx)(t.p,{children:"In this section you will need to click one of the five tabs at the top to find the category you wish to change. For most categories, you will need to have installed alternative applications before you can change the default settings. For instance, if you wish to change the default image viewer from Eye of MATE to GIMP then you must first install GIMP (available in the Software Center)."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Preferred Applications",src:n(33340).Z+"",width:"399",height:"355"})}),"\n",(0,i.jsx)(t.p,{children:'You can specify default applications for individual file types by right clicking on a file and then clicking on "Open with other Application...".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE File Context Menu",src:n(32077).Z+"",width:"302",height:"384"})}),"\n",(0,i.jsx)(t.p,{children:'Next, select the application you wish to use and make sure "Remember this application for "your file type" files" is ticked. Finish by clicking "Open". In the future, all files with the same file type will open with the same application.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Application Selection",src:n(48197).Z+"",width:"426",height:"501"})}),"\n",(0,i.jsx)(t.h2,{id:"displays",children:"Displays"}),"\n",(0,i.jsx)(t.p,{children:'With MATE, open the Brisk Menu and click on "Preferences" and then on "Displays".'}),"\n",(0,i.jsx)(t.p,{children:'This opens the Monitor Preferences window and your display(s) will be represented by 1 or more colored boxes. Click on the individual display you wish to configure. You will now be able to select if you wish to set this monitor as the primary display, mirror all displays by turning on "Same image in all monitors", or turn it off. This window also gives you the ability to change the aspect ratio, rotate the display, and to change the resolution.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Monitor Preferences",src:n(95067).Z+"",width:"556",height:"363"})}),"\n",(0,i.jsx)(t.p,{children:"You can arrange your displays by dragging the colored boxes to your preferred positions, as shown below."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Monitor Arrangement",src:n(5229).Z+"",width:"556",height:"363"})}),"\n",(0,i.jsx)(t.p,{children:'Click "Apply" once you are happy with your changes. If you would like to apply the changes to all the user accounts on your system, click on "Apply system-wide". You will be shown a message asking if the display looks OK, if it does, click on "Keep This Configuration" within 30 seconds.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Confirm Monitor Preferences",src:n(572).Z+"",width:"483",height:"146"})}),"\n",(0,i.jsx)(t.h2,{id:"keyboard-layout",children:"Keyboard layout"}),"\n",(0,i.jsx)(t.p,{children:'To change your keyboard layout in MATE, open the Brisk Menu and click on "Preferences" and then on "Keyboard". This will open the Keyboard Preferences window, now click on the "Layouts" tab.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Keyboard Preferences",src:n(91066).Z+"",width:"452",height:"527"})}),"\n",(0,i.jsx)(t.p,{children:'To add a layout, click on the "+ Add..." button. The 2 tabs at the top of the chooser window give you the option to find your layout by country or by language. The preview gives you a graphical representation of each layout. Once you are happy with your selection, click on "+ Add".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Choose Keyboard Layout",src:n(46721).Z+"",width:"800",height:"509"})}),"\n",(0,i.jsx)(t.p,{children:'You can remove a keyboard layout by selecting one of the items in your layouts list and then clicking the "- Remove" button.'}),"\n",(0,i.jsx)(t.p,{children:"If you wish to use multiple keyboard layouts, you can switch between them by left clicking on the keyboard layout icon shown in the system tray. The icon will automatically appear when you have 2 or more keyboard layouts selected. A right click allows you to open the keyboard preferences window and to see the graphical view of your current layout."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Keyboard Indicator",src:n(89990).Z+"",width:"370",height:"141"})}),"\n",(0,i.jsx)(t.p,{children:'To enable keyboard shortcuts for easy switching, re-open the Keyboard Preferences window and open the "Layouts" tab again. Now click on the "Options..." button. This will open a detailed options list, look for and click on "Switching to another layout". Select one or more of the available keyboard shortcuts and then finish by clicking "X Close".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Keyboard Layout Shortcuts",src:n(19720).Z+"",width:"552",height:"425"})}),"\n",(0,i.jsx)(t.h3,{id:"ibus",children:"IBus"}),"\n",(0,i.jsx)(t.p,{children:'By default, IBus needs to be started in MATE before it can be used. Open the Brisk Menu, click on "Preferences" and then on "IBus Preferences". You will be asked if you wish to start the IBus daemon, click "Yes".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE IBus Starting Daemon",src:n(29608).Z+"",width:"419",height:"111"})}),"\n",(0,i.jsx)(t.p,{children:'If you wish to have the IBus daemon start automatically every time you start Solus MATE, Open the Brisk Menu, click on "Preferences" and then on "Startup Applications". Under the Startup Programs tab, click on "+ Add".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Startup Applications",src:n(61690).Z+"",width:"468",height:"379"})}),"\n",(0,i.jsxs)(t.p,{children:["In the Command box, you will need to write ",(0,i.jsx)(t.code,{children:"ibus-daemon --xim"}),'. If you wish, you can also fill in a Name and Comment but these are not compulsory. Once you are happy with your inputs, click the "+ Add" button. IBus will now run each time you boot your computer.']}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Add IBus Startup Entry",src:n(88955).Z+"",width:"372",height:"177"})}),"\n",(0,i.jsxs)(t.p,{children:["If you need an additional IBus IME for your language see: ",(0,i.jsx)(t.a,{href:"/docs/user/software/localization/ibus/",children:"IBus"})]}),"\n",(0,i.jsxs)(t.p,{children:["Finish by closing the IBus Preferences window. You can now switch between your layouts by using the keyboard shortcut ",(0,i.jsx)(t.code,{children:"Super + Space"}),"."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE IBus Keyboard Shortcut",src:n(57540).Z+"",width:"142",height:"101"})}),"\n",(0,i.jsx)(t.p,{children:"Or by left clicking on the keyboard layout icon shown in the system tray and selecting the layout you wish to use."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Bottom Panel IBus",src:n(31132).Z+"",width:"239",height:"207"})}),"\n",(0,i.jsx)(t.h2,{id:"mouse-and-touchpad",children:"Mouse and touchpad"}),"\n",(0,i.jsx)(t.p,{children:'With MATE, open the Brisk Menu and click on "Preferences" and then on "Mouse". You can toggle between the mouse and touchpad settings using the tabs at the top of the Mouse Preferences window. Click "Close" once you have finished making changes.'}),"\n",(0,i.jsx)(t.h3,{id:"mouse",children:"Mouse"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Mouse Settings",src:n(39667).Z+"",width:"502",height:"611"})}),"\n",(0,i.jsx)(t.p,{children:"For mice, you can set:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Left-handed or right-handed. This will change your primary button."}),"\n",(0,i.jsx)(t.li,{children:"Locate the pointer when the Control key is pressed."}),"\n",(0,i.jsx)(t.li,{children:"Mouse speed and sensitivity."}),"\n",(0,i.jsx)(t.li,{children:"Drag and Drop threshold. This is designed to prevent accidental dragging and dropping by setting the distance required to initiate a drag."}),"\n",(0,i.jsx)(t.li,{children:"Double click timeout. The length of time between 2 mouse clicks for it to register as a double click."}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"touchpad",children:"Touchpad"}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Touchpad Settings",src:n(92324).Z+"",width:"502",height:"605"})}),"\n",(0,i.jsx)(t.p,{children:"For touchpads, you can set:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Enabling / disabling of the touchpad."}),"\n",(0,i.jsx)(t.li,{children:"Enabling / disabling of the touchpad whilst typing."}),"\n",(0,i.jsx)(t.li,{children:"Enabling / disabling of mouse clicks with the touchpad."}),"\n",(0,i.jsx)(t.li,{children:"Two and three finger click emulation."}),"\n",(0,i.jsx)(t.li,{children:"Various edge and two finger scrolling options."}),"\n",(0,i.jsx)(t.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n",(0,i.jsx)(t.li,{children:"Touchpad speed and sensitivity."}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"networking",children:"Networking"}),"\n",(0,i.jsx)(t.p,{children:'With MATE, you can manage your network settings by left or right clicking on the network icon in the bottom panel system tray. A left click will bring up any wireless or wired connections currently available whilst a right click allows you to disable networking, view your current connection information and to create new connections and networks by clicking "Edit Connections...".'}),"\n",(0,i.jsx)(t.h3,{id:"non-hidden-network",children:"Non-hidden network"}),"\n",(0,i.jsx)(t.p,{children:'To connect to a network, left click on the network icon in the system tray. This will show you a selection of the networks currently available and you may need to click on "More networks" to find the one you want.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Networking Applet",src:n(35811).Z+"",width:"520",height:"475"})}),"\n",(0,i.jsx)(t.p,{children:'You may now be prompted to authenticate with the network. Type in your password and then click "Connect".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Network Authentication",src:n(21908).Z+"",width:"490",height:"254"})}),"\n",(0,i.jsx)(t.p,{children:"If your password is correct, you will now be authenticated with the network."}),"\n",(0,i.jsx)(t.p,{children:'Should you wish to disconnect from a network, left click on the network icon again and then click on "Disconnect" underneath the network you wish to leave.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Disconnect from Network",src:n(56120).Z+"",width:"283",height:"169"})}),"\n",(0,i.jsx)(t.h3,{id:"hidden-network",children:"Hidden network"}),"\n",(0,i.jsx)(t.p,{children:'To connect to a hidden network, left click on the network icon in the system tray and then on "Connect to Hidden Wi-Fi Network...". You will now be asked for the network name and type of security (if any).'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Hidden Network",src:n(225).Z+"",width:"490",height:"247"})}),"\n",(0,i.jsx)(t.p,{children:"If the network is found and has a password, you will be prompted to authenticate with the network."}),"\n",(0,i.jsx)(t.h2,{id:"sound-and-sound-devices",children:"Sound and sound devices"}),"\n",(0,i.jsx)(t.p,{children:"To alter the volume in MATE, left click on the speaker icon in the bottom panel system tray and then drag the volume slider with your mouse."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Volume Control",src:n(68146).Z+"",width:"71",height:"193"})}),"\n",(0,i.jsx)(t.h3,{id:"settings",children:"Settings"}),"\n",(0,i.jsx)(t.p,{children:'You can access sound settings, including individual application volume controls, and a simple speaker test by right clicking on the speaker icon in the bottom panel system tray and then clicking on "Sound Preferences". Alternatively, you can open the Brisk Menu and then click on "Preferences" followed by "Sound".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Sound Applet",src:n(13815).Z+"",width:"219",height:"113"})}),"\n",(0,i.jsx)(t.p,{children:"This will open the Sound Preferences window as shown below."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Sound Preferences",src:n(90751).Z+"",width:"550",height:"423"})}),"\n",(0,i.jsx)(t.h2,{id:"users",children:"Users"}),"\n",(0,i.jsx)(t.p,{children:'To add and remove users with MATE, open the Brisk Menu and click on "Administration" and then on "Users and Groups".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Users and Groups",src:n(92617).Z+"",width:"652",height:"431"})}),"\n",(0,i.jsx)(t.h3,{id:"adding-a-user",children:"Adding a user"}),"\n",(0,i.jsx)(t.p,{children:'To add a user, click the "+ Add" button underneath the list of users. You will be asked to input your password before you can make changes.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE New User",src:n(65545).Z+"",width:"307",height:"540"})}),"\n",(0,i.jsx)(t.p,{children:'Fill in the required items and then finish adding the new user by clicking "OK" in the bottom right corner.'}),"\n",(0,i.jsx)(t.h3,{id:"removing-a-user",children:"Removing a user"}),"\n",(0,i.jsx)(t.p,{children:'To remove a user, open the User Settings window and then click on the user you wish to remove. Now click on the "- Delete" button underneath the list of users.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE User List",src:n(43845).Z+"",width:"652",height:"431"})}),"\n",(0,i.jsx)(t.p,{children:"Upon clicking to remove the user, you will be given the option to keep their files, delete their files, or cancel the removal of the user\u2019s account."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Keep Files Prompt",src:n(2390).Z+"",width:"540",height:"203"})}),"\n",(0,i.jsx)(t.h2,{id:"user-interface",children:"User interface"}),"\n",(0,i.jsx)(t.h3,{id:"desktop-background",children:"Desktop background"}),"\n",(0,i.jsx)(t.p,{children:'If you wish to change the MATE desktop background, simply right click anywhere on the desktop and select "Change Desktop Background".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Background Right Click Menu",src:n(25408).Z+"",width:"261",height:"254"})}),"\n",(0,i.jsx)(t.p,{children:'Alternatively, open the Brisk Menu and click on "Preferences" and then on "Appearance". Click on the "Background" tab at the top if it isn\'t already selected.'}),"\n",(0,i.jsx)(t.p,{children:'In this section, you can choose between Solus wallpapers, solid colors, gradients or using your own pictures by clicking "Add". After choosing, click "Close".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Desktop Background Selection",src:n(46964).Z+"",width:"785",height:"536"})}),"\n",(0,i.jsx)(t.h3,{id:"desktop-icons",children:"Desktop icons"}),"\n",(0,i.jsx)(t.p,{children:'MATE has desktop icons enabled by default. If you wish to disable or re-enable them, open the Brisk Menu, click on "Preferences" and then on "MATE Tweak". You can then toggle them on and off by clicking "Show Desktop Icons" under the Desktop section.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Tweak Tool",src:n(88409).Z+"",width:"626",height:"599"})}),"\n",(0,i.jsx)(t.p,{children:"You may now add things to your Desktop. This can be done by dragging an item onto the Desktop, right clicking an icon and selecting Copy to / Move to Desktop or by opening the Caja file manager and then moving the files you want to the Desktop folder (as shown in the image below)."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Desktop Folder",src:n(67887).Z+"",width:"803",height:"581"})}),"\n",(0,i.jsx)(t.h2,{id:"workspaces",children:"Workspaces"}),"\n",(0,i.jsxs)(t.p,{children:["In MATE, workspaces are enabled by default. You can move between workspaces by using the keyboard shortcuts ",(0,i.jsx)(t.code,{children:"Ctrl + Alt + Left"})," and ",(0,i.jsx)(t.code,{children:"Ctrl + Alt + Right"}),"."]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Workspace Switching",src:n(43433).Z+"",width:"242",height:"93"})}),"\n",(0,i.jsx)(t.p,{children:'To send an application to a different workspace, right click on the applications titlebar and then use the "Move to Another Workspace" option or "Move to Workspace Right".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Workspace Menu",src:n(86624).Z+"",width:"411",height:"385"})}),"\n",(0,i.jsx)(t.p,{children:'One of the easiest ways to view and manage your workspaces is by using the Workspace Switcher. Right click inside the bottom panel and then click on "+ Add to Panel...".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Open Panel Configuration",src:n(23084).Z+"",width:"177",height:"228"})}),"\n",(0,i.jsx)(t.p,{children:'Towards the bottom of the list you will find the Workspace Switcher. Click on it and then finish by clicking "+ Add".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Add Applet to Panel",src:n(87666).Z+"",width:"512",height:"351"})}),"\n",(0,i.jsx)(t.p,{children:"You should now be able to see 4 slightly darker boxes to the left of your MATE system tray in the bottom panel. The workspace you are currently viewing will be highlighted in blue."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Workspace Switcher",src:n(77967).Z+"",width:"265",height:"48"})}),"\n",(0,i.jsx)(t.p,{children:"In addition to using keyboard shortcuts, you will now be able to switch workspaces by clicking on them in the bottom panel. You can also drag one workspace onto another in the bottom panel which will move the current active application to the new workspace."}),"\n",(0,i.jsx)(t.h3,{id:"keyboard-shortcuts",children:"Keyboard shortcuts"}),"\n",(0,i.jsx)(t.p,{children:"MATE provides a variety of keyboard shortcuts for workspaces. By default, the keyboard shortcuts for switching directly to a certain workspace are disabled."}),"\n",(0,i.jsx)(t.p,{children:'To enable these and to also view all other available shortcuts open the Brisk Menu and click on "Preferences" and then on "Keyboard Shortcuts". The workspace shortcuts are listed under Windows Management.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Workspace Keyboard Shortcuts",src:n(63008).Z+"",width:"626",height:"408"})}),"\n",(0,i.jsx)(t.h3,{id:"workspaces-configuration",children:"Workspaces configuration"}),"\n",(0,i.jsx)(t.p,{children:'By default, MATE provides you with 4 workspaces. If you would like to have more, less or change their names you must first add the Workspace Switcher to your bottom panel, as detailed above. You\'ll then be able to right click on the Workspace Switcher and select "Preferences".'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Open Switcher Preferences",src:n(5070).Z+"",width:"203",height:"228"})}),"\n",(0,i.jsx)(t.p,{children:'Use the plus and minus icons to add or remove workspaces. You can rename workspaces by double clicking on the current names and typing in an alternative. Click "X Close" once you are happy with your changes.'}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.img,{alt:"MATE Workspace Switcher Preferences",src:n(3466).Z+"",width:"367",height:"409"})})]})}function h(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},67887:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/caja-desktop-folder-4165fea2b0afc876931a10dbeb707384.jpg"},25408:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-background-right-click-0edaca8eb885eb54466e0a358d0f06ea.jpg"},46964:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-background-selection-fefc0656871c76fa23c620d99521a0ef.jpg"},31132:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-bottom-panel-ibus-left-click-016e725ce808036efb8bc77bd7fb47d8.jpg"},89990:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-bottom-panel-keyboard-22cf218bfdf946e6c10250af144d2166.jpg"},35811:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-bottom-panel-network-left-click-d3520a23fb573b5b52700f97306190a9.jpg"},23084:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-bottom-panel-right-click-83df358e1390b363d6ae99f7465d006f.jpg"},13815:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-bottom-panel-sound-right-click-696d602e3df72f0463e5984e82964a20.jpg"},87653:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-clock-preferences-29e68150fa5526f0fbaab28c6f0ad6c2.jpg"},65545:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-create-new-user-00e085b06fb8c6899a23f90d14b50a29.jpg"},88955:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-ibus-add-startup-4f4ef3cf4e94656d727ff93c4e299432.jpg"},57540:(e,t,n)=>{n.d(t,{Z:()=>i});const i="data:image/jpeg;base64,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"},29608:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-ibus-starting-daemon-84bcee7978b1d8eb7163cb0d9b964ec3.jpg"},2390:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-keep-files-prompt-2aa2cbdb6a94db223d708562c884d71a.jpg"},46721:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-keyboard-choose-layout-e0ca24f2aa125275817acb229a194923.jpg"},19720:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-keyboard-layout-shortcuts-62aefb0c48a9d92a34c277497866e85e.jpg"},91066:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-keyboard-preferences-f13098df57c42dc0259006b9ac386dde.jpg"},572:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-monitor-preferences-confirm-c9ddeb8ecc32eb0a88fc49b247bd2535.jpg"},5229:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-monitor-preferences-dragging-0fb78bb10ab52ce991b90df95a517622.jpg"},95067:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-monitor-preferences-db6d4f848b460b4278da5c95e62d4d9d.jpg"},39667:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-mouse-settings-d43911b0e7fdc6f3a196808da1e353a8.jpg"},43845:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-multiple-user-settings-112efa554f35300d772bb5ede0cc603c.jpg"},21908:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-network-authentication-13f522132661aa358181f94e002fcc9f.jpg"},56120:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-network-disconnect-eff4984eda8c49d3e42259381f0490b0.jpg"},225:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-network-hidden-38a73abbffc438c4c8dc66f70d38fe33.jpg"},32077:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-open-with-right-click-096ce2548d773af1ee45fceb5f2153e4.jpg"},48197:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-open-with-setting-86e0958d69c60f7b4253ac2989931023.jpg"},33340:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-preferred-applications-dcd4e02b67ec579d69171c22c1eb38d3.jpg"},92617:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-single-user-settings-a1253a12d1a7214129fe3ac5dd897e32.jpg"},90751:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-sound-preferences-e6f0a451c79339dfbc290113f63e2894.jpg"},61690:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-startup-applications-e0d8dbd51c24a2987e3b83bc758d35fc.jpg"},14205:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-time-and-date-right-click-792aa50841ec26d8fcd4803ebb171839.jpg"},89206:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-time-and-date-settings-5fd258bf8a3cd09c075789ecb72370b4.jpg"},11410:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-time-and-date-c6cabc4c6ccfb4d51983c582ac985445.jpg"},92324:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-touchpad-settings-d9b3577e085d2ec9f5e357263f35ef90.jpg"},88409:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-tweak-desktop-30894d02f2a10654d0b8219947f974e6.jpg"},68146:(e,t,n)=>{n.d(t,{Z:()=>i});const i="data:image/jpeg;base64,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"},63008:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-keyboard-shortcuts-24395c1aa3f623b6b89284cffe6bd2e1.jpg"},87666:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-switch-add-to-panel-e57ec1f9a49d5dcf52f3126805d1d110.jpg"},3466:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-switcher-preferences-55630462d2aecfc0bd0f511b4ca5cd7c.jpg"},5070:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-switcher-right-click-0660da43481f40fe6fec7d39e0ec6f06.jpg"},77967:(e,t,n)=>{n.d(t,{Z:()=>i});const i="data:image/jpeg;base64,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"},43433:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-switching-a0f8cff6b00100314fd9f77994b5dcc9.jpg"},86624:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/mate-workspace-titlebar-right-click-6dfec2d387d17d6ca06de2ed728ff521.jpg"},11151:(e,t,n)=>{n.d(t,{Z:()=>r,a:()=>a});var i=n(67294);const s={},o=i.createContext(s);function a(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2609550e.8431025b.js b/assets/js/2609550e.ae2836f2.js similarity index 99% rename from assets/js/2609550e.8431025b.js rename to assets/js/2609550e.ae2836f2.js index 885d2aa22..2386698c9 100644 --- a/assets/js/2609550e.8431025b.js +++ b/assets/js/2609550e.ae2836f2.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3206],{23394:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>d});var a=s(85893),i=s(11151);const t={title:"Samba File Sharing",summary:"A quick start guide to Samba on Solus"},o="Samba file sharing",r={id:"user/software/networking/samba",title:"Samba File Sharing",description:"Samba is the standard Windows interoperability suite of programs for Linux and Unix. Among other things, it allows Linux, macOS and Windows users to share files via the Server Message Block (SMB) protocol.",source:"@site/docs/user/software/networking/samba.md",sourceDirName:"user/software/networking",slug:"/user/software/networking/samba",permalink:"/docs/user/software/networking/samba",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/networking/samba.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Samba File Sharing",summary:"A quick start guide to Samba on Solus"},sidebar:"userSidebar",previous:{title:"Networking",permalink:"/docs/category/networking"},next:{title:"TigerVNC",permalink:"/docs/user/software/networking/tigervnc"}},l={},d=[{value:"Samba on Solus",id:"samba-on-solus",level:2},{value:"How to start/stop Samba",id:"how-to-startstop-samba",level:3},{value:"Enabling Windows 7+ network discovery support",id:"enabling-windows-7-network-discovery-support",level:3},{value:"Accessing Samba via IPv6",id:"accessing-samba-via-ipv6",level:3},{value:"A brief introduction to the Samba usershare functionality",id:"a-brief-introduction-to-the-samba-usershare-functionality",level:2},{value:"GUI - configuring shares via file manager plugins",id:"gui---configuring-shares-via-file-manager-plugins",level:3},{value:"CLI - using the net usershare command",id:"cli---using-the-net-usershare-command",level:3},{value:"Managing Samba authentication for named users",id:"managing-samba-authentication-for-named-users",level:2},{value:"Debugging Samba authentication issues",id:"debugging-samba-authentication-issues",level:3},{value:"Adding custom configuration parameters via /etc/samba/smb.conf",id:"adding-custom-configuration-parameters-via-etcsambasmbconf",level:2},{value:"Example -- anonymous, read-write share outside of $HOME",id:"example----anonymous-read-write-share-outside-of-home",level:3},{value:"Links to the official Samba documentation",id:"links-to-the-official-samba-documentation",level:3},{value:"Full manual control of Samba (recommended only for experienced Samba admins)",id:"full-manual-control-of-samba-recommended-only-for-experienced-samba-admins",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"samba-file-sharing",children:"Samba file sharing"})}),"\n",(0,a.jsx)(n.p,{children:"Samba is the standard Windows interoperability suite of programs for Linux and Unix. Among other things, it allows Linux, macOS and Windows users to share files via the Server Message Block (SMB) protocol."}),"\n",(0,a.jsx)(n.h2,{id:"samba-on-solus",children:"Samba on Solus"}),"\n",(0,a.jsx)(n.p,{children:"To enable convenient file-sharing on Solus, we maintain a Solus-specific Samba configuration that out-of-the-box:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Supports Samba usershare functionality"}),"\n",(0,a.jsxs)(n.li,{children:["Enables sharing of ",(0,a.jsx)(n.em,{children:"$HOME"})," folders (manual user account activation needed)"]}),"\n",(0,a.jsx)(n.li,{children:"Is set up as a standalone server using the SMB2.0.2 protocol and up (>= Windows Vista/Server 2008)"}),"\n",(0,a.jsxs)(n.li,{children:["Advertises itself via ",(0,a.jsx)(n.em,{children:"Avahi"})," aka ",(0,a.jsx)(n.em,{children:"Apple Bonjour"})," / ",(0,a.jsx)(n.em,{children:"mDNS"})," / ",(0,a.jsx)(n.em,{children:"zeroconf"})," for macOS compatibility"]}),"\n",(0,a.jsxs)(n.li,{children:["Advertises itself via ",(0,a.jsx)(n.em,{children:"wsdd"})," aka ",(0,a.jsx)(n.em,{children:"Web Services Discovery Daemon"})," for Windows 7+ compatibility"]}),"\n",(0,a.jsx)(n.li,{children:"Disables sharing of printers via Samba (use IPP via CUPS instead)"}),"\n",(0,a.jsx)(n.li,{children:"Allows access only from IPv4 and IPv6 private and link-local (non-internet-routable) addresses"}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"As of Samba 4.7.x, Solus disables the old, deprecated and insecure original SMB1/CIFS protocol by default."}),"\n",(0,a.jsxs)(n.p,{children:["For more information on this choice, please read ",(0,a.jsx)(n.a,{href:"https://techcommunity.microsoft.com/t5/storage-at-microsoft/stop-using-smb1/ba-p/425858",children:"this post regarding SMB1"}),"."]}),"\n",(0,a.jsx)(n.p,{children:"As of Samba 4.11.x, the SMB1/CIFS protocol is officially deprecated upstream."}),"\n",(0,a.jsx)(n.h3,{id:"how-to-startstop-samba",children:"How to start/stop Samba"}),"\n",(0,a.jsx)(n.p,{children:"Please note that Samba does NOT run on system boot by default. It needs to be manually started/configured to start automatically:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"# Start Samba manually\nsudo systemctl start smb\n\n# Configure Samba to start automatically on each boot and immediately start the service\nsudo systemctl enable --now smb\n\n# Check whether Samba is running\nsudo systemctl status smb\n\n# Restart Samba manually\nsudo systemctl restart smb\n\n# Stop Samba manually\nsudo systemctl stop smb\n\n# Configure Samba to not start automatically on each boot and immediately stop the service\nsudo systemctl disable --now smb\n"})}),"\n",(0,a.jsx)(n.h3,{id:"enabling-windows-7-network-discovery-support",children:"Enabling Windows 7+ network discovery support"}),"\n",(0,a.jsxs)(n.p,{children:["The Web Services Discovery protocol is used by Windows 7+ clients to discover shares on other computers. Solus now includes the ",(0,a.jsx)(n.em,{children:"wsdd"})," service which provides support for the Web Services Discovery protocol."]}),"\n",(0,a.jsx)(n.p,{children:"When restarting wsdd, it may be necessary to also restart Samba."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"# Start wsdd manually (depends on the smb service)\nsudo systemctl start wsdd\n\n# Configure wsdd to start automatically on each boot and immediately start the service\nsudo systemctl enable --now wsdd\n\n# Check whether wsdd is running\nsudo systemctl status wsdd\n\n# Restart wsdd and Samba\nsudo systemctl restart wsdd smb\n\n# Stop wsdd manually\nsudo systemctl stop wsdd\n\n# Configure wsdd to not start automatically on each boot and immediately stop the service\nsudo systemctl disable --now wsdd\n"})}),"\n",(0,a.jsxs)(n.p,{children:["For more details on managing services on Solus with ",(0,a.jsx)(n.em,{children:"systemctl"}),", see ",(0,a.jsx)(n.code,{children:"man systemctl"})," which is part of the systemd system and service manager."]}),"\n",(0,a.jsx)(n.h3,{id:"accessing-samba-via-ipv6",children:"Accessing Samba via IPv6"}),"\n",(0,a.jsx)(n.p,{children:"In order to access a running Solus Samba server instance via IPv6, first verify that all relevant hosts (including the Samba host) are configured with an IPv6 link-local address."}),"\n",(0,a.jsx)(n.p,{children:"This can be verified in a terminal:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"$ ip addr\n\n2: enp2s0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000\n link/ether 14:da:e9:10:f9:c7 brd ff:ff:ff:ff:ff:ff\n inet 192.168.147.233/24 brd 192.168.147.255 scope global dynamic noprefixroute enp2s0\n valid_lft 5066sec preferred_lft 5066sec\n inet6 fe80::d555:a50f:1aea:c944/64 scope link noprefixroute\n valid_lft forever preferred_lft forever\n"})}),"\n",(0,a.jsxs)(n.p,{children:["In the above example, the name of the relevant network device is ",(0,a.jsx)(n.code,{children:"enp2s0"}),". Note how the line starting with ",(0,a.jsx)(n.code,{children:"inet6"})," contains an IPv6 address which begins with fe80:: and contains ",(0,a.jsx)(n.code,{children:"scope link"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["Ensure that Samba has been started on the host and then query the running local Samba instance with the following command, using the IPv6 address and interface as show by the output of ",(0,a.jsx)(n.code,{children:"ip addr"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"$ smbclient -N -L //fe80::d555:a50f:1aea:c944%enp2s0\n"})}),"\n",(0,a.jsx)(n.p,{children:"The output might look something like this:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"Unable to initialize messaging context\nAnonymous login successful\n\n Sharename Type Comment\n --------- ---- -------\n eopkgs Disk\n IPC$ IPC IPC Service (Samba server (version: 4.10.11, protocol: SMB3_11))\n Public Disk\nfe80::d555:a50f:1aea:c944%enp2s0 is an IPv6 address -- no workgroup available\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Make sure to change the IPv6 address and interface name (",(0,a.jsx)(n.code,{children:"fe80::d555:a50f:1aea:c944"})," and ",(0,a.jsx)(n.code,{children:"enp2s0"})," respectively in the above example) to the real address and interface name of the Samba host in question."]}),"\n",(0,a.jsx)(n.h2,{id:"a-brief-introduction-to-the-samba-usershare-functionality",children:"A brief introduction to the Samba usershare functionality"}),"\n",(0,a.jsxs)(n.p,{children:["In order to support user-managed (as opposed to system-managed) shares, Samba provides the so-called ",(0,a.jsx)(n.em,{children:"usershare"})," functionality, where users can define network shares without touching the traditional Samba configuration file."]}),"\n",(0,a.jsx)(n.h3,{id:"gui---configuring-shares-via-file-manager-plugins",children:"GUI - configuring shares via file manager plugins"}),"\n",(0,a.jsxs)(n.p,{children:["The default Solus configuration was written with the ",(0,a.jsx)(n.code,{children:"nemo-share"})," (Budgie and XFCE), ",(0,a.jsx)(n.code,{children:"nautilus-share"})," (GNOME), and ",(0,a.jsx)(n.code,{children:"kdenetwork-filesharing"})," (Plasma) file manager plugins in mind. These plugins allow the user to share folders in an easy and convenient way."]}),"\n",(0,a.jsxs)(n.p,{children:["All you need to do is to install either the ",(0,a.jsx)(n.code,{children:"caja-extensions"})," package (which includes the ",(0,a.jsx)(n.code,{children:"caja-share"})," plugin), the ",(0,a.jsx)(n.code,{children:"kdenetwork-filesharing"})," package, the ",(0,a.jsx)(n.code,{children:"nautilus-share"})," package or the ",(0,a.jsx)(n.code,{children:"nemo-share"})," package from the Software Center and enable the relevant Samba services."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"# Budgie\nsudo eopkg install nemo-share\n\n#GNOME\nsudo eopkg install nautilus-share\n\n# Plasma\nsudo eopkg install kdenetwork-filesharing\n\n# XFCE\nsudo eopkg install nemo-share\n"})}),"\n",(0,a.jsx)(n.p,{children:"In order to load the newly installed file manager plugin, you will need to log out of the current desktop session and log back in to a new desktop session, at which point the plugin in question will be ready for use."}),"\n",(0,a.jsxs)(n.p,{children:["Afterwards, simply right-clicking a folder and clicking ",(0,a.jsx)(n.em,{children:"properties"})," will now show an option to share it, as well as whether to allow Read/Write permissions to your users or guest access."]}),"\n",(0,a.jsx)(n.h3,{id:"cli---using-the-net-usershare-command",children:"CLI - using the net usershare command"}),"\n",(0,a.jsxs)(n.p,{children:["Excerpt from the ",(0,a.jsx)(n.code,{children:"man smb.conf"})," manual page:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"net usershare add sharename path [comment] [acl] [guest_ok=[y|n]]\n To create or modify (overwrite) a user defined share.\n\nnet usershare delete sharename\n To delete a user defined share.\n\nnet usershare list wildcard-sharename\n To list user defined shares.\n\nnet usershare info wildcard-sharename\n To print information about user defined shares.\n"})}),"\n",(0,a.jsx)(n.h2,{id:"managing-samba-authentication-for-named-users",children:"Managing Samba authentication for named users"}),"\n",(0,a.jsxs)(n.p,{children:["Should the user ",(0,a.jsx)(n.code,{children:"some_user"})," wish to access e.g. the ",(0,a.jsx)(n.em,{children:"$HOME"})," directory via Samba, it is necessary to enable the ",(0,a.jsx)(n.code,{children:"some_user"})," Samba account."]}),"\n",(0,a.jsxs)(n.p,{children:["Note that the ",(0,a.jsx)(n.code,{children:"some_user"})," Samba account is separate from the ",(0,a.jsx)(n.code,{children:"some_user"})," Linux user account, but they share the same ",(0,a.jsx)(n.em,{children:"$HOME"})," directory."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"# Add the some_user account to the Samba login db\nsudo smbpasswd -a some_user\n\n# Enable the some_user account in the Samba login db\nsudo smbpasswd -e some_user\n\n# Try to log in to a running Samba instance as some_user and list shares\nsmbclient -U some_user -L localhost\n\n# Disable the some_user account in the Samba login db\nsudo smbpasswd -d some_user\n\n# Remove the some_user account from the Samba login db\nsudo smbpasswd -x some_user\n"})}),"\n",(0,a.jsxs)(n.p,{children:["See ",(0,a.jsx)(n.code,{children:"man smbpasswd"})," for more details."]}),"\n",(0,a.jsx)(n.h3,{id:"debugging-samba-authentication-issues",children:"Debugging Samba authentication issues"}),"\n",(0,a.jsx)(n.p,{children:"To help debug authentication issues, the Solus Samba configuration is by default set up with relatively verbose logging when it comes to authentication and protocol negotiation."}),"\n",(0,a.jsxs)(n.p,{children:["The Samba log files live in the ",(0,a.jsx)(n.code,{children:"/var/log/samba/"})," directory."]}),"\n",(0,a.jsxs)(n.h2,{id:"adding-custom-configuration-parameters-via-etcsambasmbconf",children:["Adding custom configuration parameters via ",(0,a.jsx)(n.code,{children:"/etc/samba/smb.conf"})]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"CAUTION:"})," ",(0,a.jsxs)(n.em,{children:["From this point on, it is assumed that the user is familiar with the Samba documentation, including ",(0,a.jsx)(n.code,{children:"man smb.conf"}),", and that the user has a basic understanding of Linux filesystem permissions."]})]}),"\n",(0,a.jsxs)(n.p,{children:["The default Solus-managed configuration (which lives in ",(0,a.jsx)(n.code,{children:"/usr/share/defaults/samba/smb.conf"})," and will be overwritten on each Samba package update) is written such that it will attempt to include any configuration parameters present in ",(0,a.jsx)(n.code,{children:"/etc/samba/smb.conf"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["Hence, any persistent user-managed parameters should be added to ",(0,a.jsx)(n.code,{children:"/etc/samba/smb.conf"})," which will ",(0,a.jsx)(n.em,{children:"never"})," be overwritten by the system package manager."]}),"\n",(0,a.jsxs)(n.p,{children:["In addition, the Solus-controlled Samba configuration is written such that it is possible to override its default parameters simply by assigning a new value to the parameter in question in ",(0,a.jsx)(n.code,{children:"/etc/samba/smb.conf"}),". From a technical perspective, any parameters added without a ",(0,a.jsx)(n.code,{children:"[shared resource]"})," header will considered part of the ",(0,a.jsx)(n.code,{children:"[global]"})," configuration section."]}),"\n",(0,a.jsxs)(n.p,{children:["This way, simply deleting or renaming ",(0,a.jsx)(n.code,{children:"/etc/samba/smb.conf"})," and restarting Samba with ",(0,a.jsx)(n.code,{children:"sudo systemctl restart smb"})," will reset the configuration to the known working default Solus configuration."]}),"\n",(0,a.jsxs)(n.h3,{id:"example----anonymous-read-write-share-outside-of-home",children:["Example -- anonymous, read-write share outside of ",(0,a.jsx)(n.em,{children:"$HOME"})]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ini",children:"# Contents of /etc/samba/smb.conf:\n#\n# If /etc/samba/smb.conf exists, it is automatically loaded by the Solus-\n# controlled default config residing in /usr/share/defaults/samba/smb.conf\n#\n# The following configuration creates a \"//servername/someshare\" share where\n# anonymous users have read and write access.\n#\n# ';' also denotes a comment (typically used for configuration parameters)\n#\n[someshare]\npath = /mnt/someshare\n# allow anonymous access\nguest ok = Yes\n# ONLY allow anonymous access (don't allow both guest and system user access)\n;guest only = Yes\n# allow write access\nread only = No\n# This is an example of how to limit access to the share to known IPs\n;hosts deny = ALL\n;hosts allow = 127.0.0.1 192.168.1.0/24\n# share config end\n"})}),"\n",(0,a.jsxs)(n.p,{children:["In the above example, it is assumed that the user has chosen a suitable method for making ",(0,a.jsx)(n.code,{children:"/mnt/someshare"})," writeable by guest users."]}),"\n",(0,a.jsxs)(n.p,{children:["After adding a ",(0,a.jsx)(n.code,{children:"[someshare]"})," section like in the above example, run ",(0,a.jsx)(n.code,{children:"sudo testparm"})," to check that the newly included share does not contain syntax errors. Check out ",(0,a.jsx)(n.code,{children:"man testparm"})," for more information about the ",(0,a.jsx)(n.em,{children:"testparm"})," utility."]}),"\n",(0,a.jsxs)(n.p,{children:["If ",(0,a.jsx)(n.em,{children:"testparm"})," didn't spot any problems, restart Samba with ",(0,a.jsx)(n.code,{children:"sudo systemctl restart smb"}),", which will activate the new configuration."]}),"\n",(0,a.jsx)(n.h3,{id:"links-to-the-official-samba-documentation",children:"Links to the official Samba documentation"}),"\n",(0,a.jsxs)(n.p,{children:["Apart from the aforementioned ",(0,a.jsx)(n.code,{children:"man smb.conf"}),", wiki.samba.org is your friend, specifically:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"https://wiki.samba.org/index.php/Setting_up_a_Share_Using_POSIX_ACLs",children:"https://wiki.samba.org/index.php/Setting_up_a_Share_Using_POSIX_ACLs"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"https://wiki.samba.org/index.php/Setting_up_Samba_as_a_Standalone_Server",children:"https://wiki.samba.org/index.php/Setting_up_Samba_as_a_Standalone_Server"})}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"The default Solus Samba configuration is patterned on the above."}),"\n",(0,a.jsx)(n.h2,{id:"full-manual-control-of-samba-recommended-only-for-experienced-samba-admins",children:"Full manual control of Samba (recommended only for experienced Samba admins)"}),"\n",(0,a.jsx)(n.p,{children:"Full manual control of Samba can be achieved by completely bypassing the default Solus Samba configuration."}),"\n",(0,a.jsxs)(n.p,{children:["In the ",(0,a.jsx)(n.em,{children:"smbd"})," manual page (",(0,a.jsx)(n.code,{children:"man 8 smbd"}),"), it is shown how the compiled-in default config file can be overridden by specifying the ",(0,a.jsx)(n.code,{children:"--configfile="})," flag during startup."]}),"\n",(0,a.jsxs)(n.p,{children:["To use the traditional ",(0,a.jsx)(n.code,{children:"/etc/samba/smb.conf"})," configuration file exclusively (thus bypassing the Solus configuration), edit the ",(0,a.jsx)(n.code,{children:"/etc/sysconfig/samba"})," file to look like so:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ini",children:'## Path: Network/Samba\n## Description: Samba process options\n## Type: string\n## Default: ""\n## ServiceRestart: samba\nSAMBAOPTIONS=""\n## Type: string\n## Default: ""\n## ServiceRestart: smb\nSMBDOPTIONS="--configfile=/etc/samba/smb.conf"\n## Type: string\n## Default: ""\n## ServiceRestart: nmb\nNMBDOPTIONS="--configfile=/etc/samba/smb.conf"\n## Type: string\n## Default: ""\n## ServiceRestart: winbind\nWINBINDOPTIONS=""\n'})})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},11151:(e,n,s)=>{s.d(n,{Z:()=>r,a:()=>o});var a=s(67294);const i={},t=a.createContext(i);function o(e){const n=a.useContext(t);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),a.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3206],{23394:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>d});var a=s(85893),i=s(11151);const t={title:"Samba File Sharing",summary:"A quick start guide to Samba on Solus"},o="Samba file sharing",r={id:"user/software/networking/samba",title:"Samba File Sharing",description:"Samba is the standard Windows interoperability suite of programs for Linux and Unix. Among other things, it allows Linux, macOS and Windows users to share files via the Server Message Block (SMB) protocol.",source:"@site/docs/user/software/networking/samba.md",sourceDirName:"user/software/networking",slug:"/user/software/networking/samba",permalink:"/docs/user/software/networking/samba",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/networking/samba.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Samba File Sharing",summary:"A quick start guide to Samba on Solus"},sidebar:"userSidebar",previous:{title:"Networking",permalink:"/docs/category/networking"},next:{title:"TigerVNC",permalink:"/docs/user/software/networking/tigervnc"}},l={},d=[{value:"Samba on Solus",id:"samba-on-solus",level:2},{value:"How to start/stop Samba",id:"how-to-startstop-samba",level:3},{value:"Enabling Windows 7+ network discovery support",id:"enabling-windows-7-network-discovery-support",level:3},{value:"Accessing Samba via IPv6",id:"accessing-samba-via-ipv6",level:3},{value:"A brief introduction to the Samba usershare functionality",id:"a-brief-introduction-to-the-samba-usershare-functionality",level:2},{value:"GUI - configuring shares via file manager plugins",id:"gui---configuring-shares-via-file-manager-plugins",level:3},{value:"CLI - using the net usershare command",id:"cli---using-the-net-usershare-command",level:3},{value:"Managing Samba authentication for named users",id:"managing-samba-authentication-for-named-users",level:2},{value:"Debugging Samba authentication issues",id:"debugging-samba-authentication-issues",level:3},{value:"Adding custom configuration parameters via /etc/samba/smb.conf",id:"adding-custom-configuration-parameters-via-etcsambasmbconf",level:2},{value:"Example -- anonymous, read-write share outside of $HOME",id:"example----anonymous-read-write-share-outside-of-home",level:3},{value:"Links to the official Samba documentation",id:"links-to-the-official-samba-documentation",level:3},{value:"Full manual control of Samba (recommended only for experienced Samba admins)",id:"full-manual-control-of-samba-recommended-only-for-experienced-samba-admins",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"samba-file-sharing",children:"Samba file sharing"})}),"\n",(0,a.jsx)(n.p,{children:"Samba is the standard Windows interoperability suite of programs for Linux and Unix. Among other things, it allows Linux, macOS and Windows users to share files via the Server Message Block (SMB) protocol."}),"\n",(0,a.jsx)(n.h2,{id:"samba-on-solus",children:"Samba on Solus"}),"\n",(0,a.jsx)(n.p,{children:"To enable convenient file-sharing on Solus, we maintain a Solus-specific Samba configuration that out-of-the-box:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Supports Samba usershare functionality"}),"\n",(0,a.jsxs)(n.li,{children:["Enables sharing of ",(0,a.jsx)(n.em,{children:"$HOME"})," folders (manual user account activation needed)"]}),"\n",(0,a.jsx)(n.li,{children:"Is set up as a standalone server using the SMB2.0.2 protocol and up (>= Windows Vista/Server 2008)"}),"\n",(0,a.jsxs)(n.li,{children:["Advertises itself via ",(0,a.jsx)(n.em,{children:"Avahi"})," aka ",(0,a.jsx)(n.em,{children:"Apple Bonjour"})," / ",(0,a.jsx)(n.em,{children:"mDNS"})," / ",(0,a.jsx)(n.em,{children:"zeroconf"})," for macOS compatibility"]}),"\n",(0,a.jsxs)(n.li,{children:["Advertises itself via ",(0,a.jsx)(n.em,{children:"wsdd"})," aka ",(0,a.jsx)(n.em,{children:"Web Services Discovery Daemon"})," for Windows 7+ compatibility"]}),"\n",(0,a.jsx)(n.li,{children:"Disables sharing of printers via Samba (use IPP via CUPS instead)"}),"\n",(0,a.jsx)(n.li,{children:"Allows access only from IPv4 and IPv6 private and link-local (non-internet-routable) addresses"}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"As of Samba 4.7.x, Solus disables the old, deprecated and insecure original SMB1/CIFS protocol by default."}),"\n",(0,a.jsxs)(n.p,{children:["For more information on this choice, please read ",(0,a.jsx)(n.a,{href:"https://techcommunity.microsoft.com/t5/storage-at-microsoft/stop-using-smb1/ba-p/425858",children:"this post regarding SMB1"}),"."]}),"\n",(0,a.jsx)(n.p,{children:"As of Samba 4.11.x, the SMB1/CIFS protocol is officially deprecated upstream."}),"\n",(0,a.jsx)(n.h3,{id:"how-to-startstop-samba",children:"How to start/stop Samba"}),"\n",(0,a.jsx)(n.p,{children:"Please note that Samba does NOT run on system boot by default. It needs to be manually started/configured to start automatically:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"# Start Samba manually\nsudo systemctl start smb\n\n# Configure Samba to start automatically on each boot and immediately start the service\nsudo systemctl enable --now smb\n\n# Check whether Samba is running\nsudo systemctl status smb\n\n# Restart Samba manually\nsudo systemctl restart smb\n\n# Stop Samba manually\nsudo systemctl stop smb\n\n# Configure Samba to not start automatically on each boot and immediately stop the service\nsudo systemctl disable --now smb\n"})}),"\n",(0,a.jsx)(n.h3,{id:"enabling-windows-7-network-discovery-support",children:"Enabling Windows 7+ network discovery support"}),"\n",(0,a.jsxs)(n.p,{children:["The Web Services Discovery protocol is used by Windows 7+ clients to discover shares on other computers. Solus now includes the ",(0,a.jsx)(n.em,{children:"wsdd"})," service which provides support for the Web Services Discovery protocol."]}),"\n",(0,a.jsx)(n.p,{children:"When restarting wsdd, it may be necessary to also restart Samba."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"# Start wsdd manually (depends on the smb service)\nsudo systemctl start wsdd\n\n# Configure wsdd to start automatically on each boot and immediately start the service\nsudo systemctl enable --now wsdd\n\n# Check whether wsdd is running\nsudo systemctl status wsdd\n\n# Restart wsdd and Samba\nsudo systemctl restart wsdd smb\n\n# Stop wsdd manually\nsudo systemctl stop wsdd\n\n# Configure wsdd to not start automatically on each boot and immediately stop the service\nsudo systemctl disable --now wsdd\n"})}),"\n",(0,a.jsxs)(n.p,{children:["For more details on managing services on Solus with ",(0,a.jsx)(n.em,{children:"systemctl"}),", see ",(0,a.jsx)(n.code,{children:"man systemctl"})," which is part of the systemd system and service manager."]}),"\n",(0,a.jsx)(n.h3,{id:"accessing-samba-via-ipv6",children:"Accessing Samba via IPv6"}),"\n",(0,a.jsx)(n.p,{children:"In order to access a running Solus Samba server instance via IPv6, first verify that all relevant hosts (including the Samba host) are configured with an IPv6 link-local address."}),"\n",(0,a.jsx)(n.p,{children:"This can be verified in a terminal:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"$ ip addr\n\n2: enp2s0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000\n link/ether 14:da:e9:10:f9:c7 brd ff:ff:ff:ff:ff:ff\n inet 192.168.147.233/24 brd 192.168.147.255 scope global dynamic noprefixroute enp2s0\n valid_lft 5066sec preferred_lft 5066sec\n inet6 fe80::d555:a50f:1aea:c944/64 scope link noprefixroute\n valid_lft forever preferred_lft forever\n"})}),"\n",(0,a.jsxs)(n.p,{children:["In the above example, the name of the relevant network device is ",(0,a.jsx)(n.code,{children:"enp2s0"}),". Note how the line starting with ",(0,a.jsx)(n.code,{children:"inet6"})," contains an IPv6 address which begins with fe80:: and contains ",(0,a.jsx)(n.code,{children:"scope link"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["Ensure that Samba has been started on the host and then query the running local Samba instance with the following command, using the IPv6 address and interface as show by the output of ",(0,a.jsx)(n.code,{children:"ip addr"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"$ smbclient -N -L //fe80::d555:a50f:1aea:c944%enp2s0\n"})}),"\n",(0,a.jsx)(n.p,{children:"The output might look something like this:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"Unable to initialize messaging context\nAnonymous login successful\n\n Sharename Type Comment\n --------- ---- -------\n eopkgs Disk\n IPC$ IPC IPC Service (Samba server (version: 4.10.11, protocol: SMB3_11))\n Public Disk\nfe80::d555:a50f:1aea:c944%enp2s0 is an IPv6 address -- no workgroup available\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Make sure to change the IPv6 address and interface name (",(0,a.jsx)(n.code,{children:"fe80::d555:a50f:1aea:c944"})," and ",(0,a.jsx)(n.code,{children:"enp2s0"})," respectively in the above example) to the real address and interface name of the Samba host in question."]}),"\n",(0,a.jsx)(n.h2,{id:"a-brief-introduction-to-the-samba-usershare-functionality",children:"A brief introduction to the Samba usershare functionality"}),"\n",(0,a.jsxs)(n.p,{children:["In order to support user-managed (as opposed to system-managed) shares, Samba provides the so-called ",(0,a.jsx)(n.em,{children:"usershare"})," functionality, where users can define network shares without touching the traditional Samba configuration file."]}),"\n",(0,a.jsx)(n.h3,{id:"gui---configuring-shares-via-file-manager-plugins",children:"GUI - configuring shares via file manager plugins"}),"\n",(0,a.jsxs)(n.p,{children:["The default Solus configuration was written with the ",(0,a.jsx)(n.code,{children:"nemo-share"})," (Budgie and XFCE), ",(0,a.jsx)(n.code,{children:"nautilus-share"})," (GNOME), and ",(0,a.jsx)(n.code,{children:"kdenetwork-filesharing"})," (Plasma) file manager plugins in mind. These plugins allow the user to share folders in an easy and convenient way."]}),"\n",(0,a.jsxs)(n.p,{children:["All you need to do is to install either the ",(0,a.jsx)(n.code,{children:"caja-extensions"})," package (which includes the ",(0,a.jsx)(n.code,{children:"caja-share"})," plugin), the ",(0,a.jsx)(n.code,{children:"kdenetwork-filesharing"})," package, the ",(0,a.jsx)(n.code,{children:"nautilus-share"})," package or the ",(0,a.jsx)(n.code,{children:"nemo-share"})," package from the Software Center and enable the relevant Samba services."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"# Budgie\nsudo eopkg install nemo-share\n\n#GNOME\nsudo eopkg install nautilus-share\n\n# Plasma\nsudo eopkg install kdenetwork-filesharing\n\n# XFCE\nsudo eopkg install nemo-share\n"})}),"\n",(0,a.jsx)(n.p,{children:"In order to load the newly installed file manager plugin, you will need to log out of the current desktop session and log back in to a new desktop session, at which point the plugin in question will be ready for use."}),"\n",(0,a.jsxs)(n.p,{children:["Afterwards, simply right-clicking a folder and clicking ",(0,a.jsx)(n.em,{children:"properties"})," will now show an option to share it, as well as whether to allow Read/Write permissions to your users or guest access."]}),"\n",(0,a.jsx)(n.h3,{id:"cli---using-the-net-usershare-command",children:"CLI - using the net usershare command"}),"\n",(0,a.jsxs)(n.p,{children:["Excerpt from the ",(0,a.jsx)(n.code,{children:"man smb.conf"})," manual page:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"net usershare add sharename path [comment] [acl] [guest_ok=[y|n]]\n To create or modify (overwrite) a user defined share.\n\nnet usershare delete sharename\n To delete a user defined share.\n\nnet usershare list wildcard-sharename\n To list user defined shares.\n\nnet usershare info wildcard-sharename\n To print information about user defined shares.\n"})}),"\n",(0,a.jsx)(n.h2,{id:"managing-samba-authentication-for-named-users",children:"Managing Samba authentication for named users"}),"\n",(0,a.jsxs)(n.p,{children:["Should the user ",(0,a.jsx)(n.code,{children:"some_user"})," wish to access e.g. the ",(0,a.jsx)(n.em,{children:"$HOME"})," directory via Samba, it is necessary to enable the ",(0,a.jsx)(n.code,{children:"some_user"})," Samba account."]}),"\n",(0,a.jsxs)(n.p,{children:["Note that the ",(0,a.jsx)(n.code,{children:"some_user"})," Samba account is separate from the ",(0,a.jsx)(n.code,{children:"some_user"})," Linux user account, but they share the same ",(0,a.jsx)(n.em,{children:"$HOME"})," directory."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"# Add the some_user account to the Samba login db\nsudo smbpasswd -a some_user\n\n# Enable the some_user account in the Samba login db\nsudo smbpasswd -e some_user\n\n# Try to log in to a running Samba instance as some_user and list shares\nsmbclient -U some_user -L localhost\n\n# Disable the some_user account in the Samba login db\nsudo smbpasswd -d some_user\n\n# Remove the some_user account from the Samba login db\nsudo smbpasswd -x some_user\n"})}),"\n",(0,a.jsxs)(n.p,{children:["See ",(0,a.jsx)(n.code,{children:"man smbpasswd"})," for more details."]}),"\n",(0,a.jsx)(n.h3,{id:"debugging-samba-authentication-issues",children:"Debugging Samba authentication issues"}),"\n",(0,a.jsx)(n.p,{children:"To help debug authentication issues, the Solus Samba configuration is by default set up with relatively verbose logging when it comes to authentication and protocol negotiation."}),"\n",(0,a.jsxs)(n.p,{children:["The Samba log files live in the ",(0,a.jsx)(n.code,{children:"/var/log/samba/"})," directory."]}),"\n",(0,a.jsxs)(n.h2,{id:"adding-custom-configuration-parameters-via-etcsambasmbconf",children:["Adding custom configuration parameters via ",(0,a.jsx)(n.code,{children:"/etc/samba/smb.conf"})]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"CAUTION:"})," ",(0,a.jsxs)(n.em,{children:["From this point on, it is assumed that the user is familiar with the Samba documentation, including ",(0,a.jsx)(n.code,{children:"man smb.conf"}),", and that the user has a basic understanding of Linux filesystem permissions."]})]}),"\n",(0,a.jsxs)(n.p,{children:["The default Solus-managed configuration (which lives in ",(0,a.jsx)(n.code,{children:"/usr/share/defaults/samba/smb.conf"})," and will be overwritten on each Samba package update) is written such that it will attempt to include any configuration parameters present in ",(0,a.jsx)(n.code,{children:"/etc/samba/smb.conf"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["Hence, any persistent user-managed parameters should be added to ",(0,a.jsx)(n.code,{children:"/etc/samba/smb.conf"})," which will ",(0,a.jsx)(n.em,{children:"never"})," be overwritten by the system package manager."]}),"\n",(0,a.jsxs)(n.p,{children:["In addition, the Solus-controlled Samba configuration is written such that it is possible to override its default parameters simply by assigning a new value to the parameter in question in ",(0,a.jsx)(n.code,{children:"/etc/samba/smb.conf"}),". From a technical perspective, any parameters added without a ",(0,a.jsx)(n.code,{children:"[shared resource]"})," header will considered part of the ",(0,a.jsx)(n.code,{children:"[global]"})," configuration section."]}),"\n",(0,a.jsxs)(n.p,{children:["This way, simply deleting or renaming ",(0,a.jsx)(n.code,{children:"/etc/samba/smb.conf"})," and restarting Samba with ",(0,a.jsx)(n.code,{children:"sudo systemctl restart smb"})," will reset the configuration to the known working default Solus configuration."]}),"\n",(0,a.jsxs)(n.h3,{id:"example----anonymous-read-write-share-outside-of-home",children:["Example -- anonymous, read-write share outside of ",(0,a.jsx)(n.em,{children:"$HOME"})]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ini",children:"# Contents of /etc/samba/smb.conf:\n#\n# If /etc/samba/smb.conf exists, it is automatically loaded by the Solus-\n# controlled default config residing in /usr/share/defaults/samba/smb.conf\n#\n# The following configuration creates a \"//servername/someshare\" share where\n# anonymous users have read and write access.\n#\n# ';' also denotes a comment (typically used for configuration parameters)\n#\n[someshare]\npath = /mnt/someshare\n# allow anonymous access\nguest ok = Yes\n# ONLY allow anonymous access (don't allow both guest and system user access)\n;guest only = Yes\n# allow write access\nread only = No\n# This is an example of how to limit access to the share to known IPs\n;hosts deny = ALL\n;hosts allow = 127.0.0.1 192.168.1.0/24\n# share config end\n"})}),"\n",(0,a.jsxs)(n.p,{children:["In the above example, it is assumed that the user has chosen a suitable method for making ",(0,a.jsx)(n.code,{children:"/mnt/someshare"})," writeable by guest users."]}),"\n",(0,a.jsxs)(n.p,{children:["After adding a ",(0,a.jsx)(n.code,{children:"[someshare]"})," section like in the above example, run ",(0,a.jsx)(n.code,{children:"sudo testparm"})," to check that the newly included share does not contain syntax errors. Check out ",(0,a.jsx)(n.code,{children:"man testparm"})," for more information about the ",(0,a.jsx)(n.em,{children:"testparm"})," utility."]}),"\n",(0,a.jsxs)(n.p,{children:["If ",(0,a.jsx)(n.em,{children:"testparm"})," didn't spot any problems, restart Samba with ",(0,a.jsx)(n.code,{children:"sudo systemctl restart smb"}),", which will activate the new configuration."]}),"\n",(0,a.jsx)(n.h3,{id:"links-to-the-official-samba-documentation",children:"Links to the official Samba documentation"}),"\n",(0,a.jsxs)(n.p,{children:["Apart from the aforementioned ",(0,a.jsx)(n.code,{children:"man smb.conf"}),", wiki.samba.org is your friend, specifically:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"https://wiki.samba.org/index.php/Setting_up_a_Share_Using_POSIX_ACLs",children:"https://wiki.samba.org/index.php/Setting_up_a_Share_Using_POSIX_ACLs"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"https://wiki.samba.org/index.php/Setting_up_Samba_as_a_Standalone_Server",children:"https://wiki.samba.org/index.php/Setting_up_Samba_as_a_Standalone_Server"})}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"The default Solus Samba configuration is patterned on the above."}),"\n",(0,a.jsx)(n.h2,{id:"full-manual-control-of-samba-recommended-only-for-experienced-samba-admins",children:"Full manual control of Samba (recommended only for experienced Samba admins)"}),"\n",(0,a.jsx)(n.p,{children:"Full manual control of Samba can be achieved by completely bypassing the default Solus Samba configuration."}),"\n",(0,a.jsxs)(n.p,{children:["In the ",(0,a.jsx)(n.em,{children:"smbd"})," manual page (",(0,a.jsx)(n.code,{children:"man 8 smbd"}),"), it is shown how the compiled-in default config file can be overridden by specifying the ",(0,a.jsx)(n.code,{children:"--configfile="})," flag during startup."]}),"\n",(0,a.jsxs)(n.p,{children:["To use the traditional ",(0,a.jsx)(n.code,{children:"/etc/samba/smb.conf"})," configuration file exclusively (thus bypassing the Solus configuration), edit the ",(0,a.jsx)(n.code,{children:"/etc/sysconfig/samba"})," file to look like so:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ini",children:'## Path: Network/Samba\n## Description: Samba process options\n## Type: string\n## Default: ""\n## ServiceRestart: samba\nSAMBAOPTIONS=""\n## Type: string\n## Default: ""\n## ServiceRestart: smb\nSMBDOPTIONS="--configfile=/etc/samba/smb.conf"\n## Type: string\n## Default: ""\n## ServiceRestart: nmb\nNMBDOPTIONS="--configfile=/etc/samba/smb.conf"\n## Type: string\n## Default: ""\n## ServiceRestart: winbind\nWINBINDOPTIONS=""\n'})})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},11151:(e,n,s)=>{s.d(n,{Z:()=>r,a:()=>o});var a=s(67294);const i={},t=a.createContext(i);function o(e){const n=a.useContext(t);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),a.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/26308ea3.5bba2662.js b/assets/js/26308ea3.3ef577e8.js similarity index 99% rename from assets/js/26308ea3.5bba2662.js rename to assets/js/26308ea3.3ef577e8.js index 9893d87f6..cf9a1c916 100644 --- a/assets/js/26308ea3.5bba2662.js +++ b/assets/js/26308ea3.3ef577e8.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6485],{85612:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>C,contentTitle:()=>P,default:()=>N,frontMatter:()=>T,metadata:()=>A,toc:()=>V});var s=n(85893),a=n(11151),r=n(20906),i=n(17573),l=n(67294),o=n(36905);const c={tabItem:"tabItem_Ymn6"};function u(e){let{children:t,hidden:n,className:a}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,o.Z)(c.tabItem,a),hidden:n,children:t})}var h=n(18119),d=n(16550),p=n(1290),m=n(39222),g=n(79113),f=n(1606);function b(e){return l.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function x(e){const{values:t,children:n}=e;return(0,l.useMemo)((()=>{const e=t??function(e){return b(e).map((e=>{let{props:{value:t,label:n,attributes:s,default:a}}=e;return{value:t,label:n,attributes:s,default:a}}))}(n);return function(e){const t=(0,g.lx)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function j(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function y(e){let{queryString:t=!1,groupId:n}=e;const s=(0,d.k6)(),a=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,m._X)(a),(0,l.useCallback)((e=>{if(!a)return;const t=new URLSearchParams(s.location.search);t.set(a,e),s.replace({...s.location,search:t.toString()})}),[a,s])]}function w(e){const{defaultValue:t,queryString:n=!1,groupId:s}=e,a=x(e),[r,i]=(0,l.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!j({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const s=n.find((e=>e.default))??n[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:t,tabValues:a}))),[o,c]=y({queryString:n,groupId:s}),[u,h]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[s,a]=(0,f.Nk)(n);return[s,(0,l.useCallback)((e=>{n&&a.set(e)}),[n,a])]}({groupId:s}),d=(()=>{const e=o??u;return j({value:e,tabValues:a})?e:null})();(0,p.Z)((()=>{d&&i(d)}),[d]);return{selectedValue:r,selectValue:(0,l.useCallback)((e=>{if(!j({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);i(e),c(e),h(e)}),[c,h,a]),tabValues:a}}var k=n(45025);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function q(e){let{className:t,block:n,selectedValue:a,selectValue:r,tabValues:i}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,h.o5)(),u=e=>{const t=e.currentTarget,n=l.indexOf(t),s=i[n].value;s!==a&&(c(t),r(s))},d=e=>{let t=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const n=l.indexOf(e.currentTarget)+1;t=l[n]??l[0];break}case"ArrowLeft":{const n=l.indexOf(e.currentTarget)-1;t=l[n]??l[l.length-1];break}}t?.focus()};return(0,s.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t),children:i.map((e=>{let{value:t,label:n,attributes:r}=e;return(0,s.jsx)("li",{role:"tab",tabIndex:a===t?0:-1,"aria-selected":a===t,ref:e=>l.push(e),onKeyDown:d,onClick:u,...r,className:(0,o.Z)("tabs__item",v.tabItem,r?.className,{"tabs__item--active":a===t}),children:n??t},t)}))})}function I(e){let{lazy:t,children:n,selectedValue:a}=e;const r=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===a));return e?(0,l.cloneElement)(e,{className:(0,o.Z)("margin-top--md",e.props.className)}):null}return(0,s.jsx)("div",{className:"margin-top--md",children:r.map(((e,t)=>(0,l.cloneElement)(e,{key:t,hidden:e.props.value!==a})))})}function S(e){const t=w(e);return(0,s.jsxs)("div",{className:(0,o.Z)("tabs-container",v.tabList),children:[(0,s.jsx)(q,{...t,...e}),(0,s.jsx)(I,{...t,...e})]})}function R(e){const t=(0,k.Z)();return(0,s.jsx)(S,{...e,children:b(e.children)},String(t))}const T={title:"Submitting a Pull Request for Review",summary:"Submitting a Pull Request for Review",sidebar_position:6},P="Submitting a Pull Request for Review",A={id:"packaging/submitting-a-pull-request",title:"Submitting a Pull Request for Review",description:"Please refrain from submitting a pull request for the following instances:",source:"@site/docs/packaging/submitting-a-pull-request.mdx",sourceDirName:"packaging",slug:"/packaging/submitting-a-pull-request",permalink:"/docs/packaging/submitting-a-pull-request",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/submitting-a-pull-request.mdx",tags:[],version:"current",lastUpdatedAt:1731532839e3,sidebarPosition:6,frontMatter:{title:"Submitting a Pull Request for Review",summary:"Submitting a Pull Request for Review",sidebar_position:6},sidebar:"packagingSidebar",previous:{title:"Testing a Package",permalink:"/docs/packaging/testing-a-package"},next:{title:"Packaging Changes",permalink:"/docs/packaging/packaging-changes"}},C={},V=[{value:"Final branch review",id:"final-branch-review",level:2},{value:"Creating the pull request",id:"creating-the-pull-request",level:2},{value:"Amending a pull request",id:"amending-a-pull-request",level:2},{value:"Amending a pull request with multiple commits",id:"amending-a-pull-request-with-multiple-commits",level:3},{value:"Updating a pull request that has changes requested",id:"updating-a-pull-request-that-has-changes-requested",level:2},{value:"After the pull request is accepted",id:"after-the-pull-request-is-accepted",level:2}];function _(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"submitting-a-pull-request-for-review",children:"Submitting a Pull Request for Review"})}),"\n",(0,s.jsx)(t.p,{children:"Please refrain from submitting a pull request for the following instances:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["For a package that is yet to be accepted for inclusion by a member of the Solus Staff team. Search ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues?q=label%3A%22Package+Request%22",children:"open package requests"})," to see if there is an open request for the package.\nWe welcome you to politely reach out via the package request issue or our Support room on ",(0,s.jsx)(t.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"})," if you deem the review of the request to be time-sensitive in nature."]}),"\n",(0,s.jsxs)(t.li,{children:["If your pull request is a Work In Progress / WIP. Pull requests that are completed or are marked as ",(0,s.jsx)(t.em,{children:"request for comments"})," (RFC) are accepted. For RFC request please ensure your patch title contains ",(0,s.jsx)(t.code,{children:"[RFC]"})," and is marked as 'draft'. WIP patches clutter the issue tracker, make patch review by Solus Staff more time consuming, and introduce unnecessary work."]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"final-branch-review",children:"Final branch review"}),"\n",(0,s.jsx)(t.p,{children:"At minimum, your pull request will include changes for the following files:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"package.yml"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"pspec_*.xml"})}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"It may also include these files:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"MAINTAINERS.md"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"monitoring.yml"})}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Double check the ",(0,s.jsx)(t.code,{children:"package.yml"})," to make sure the builddeps are in the right order, and that it otherwise adheres to the ",(0,s.jsx)(t.a,{href:"/docs/packaging/package.yml",children:"standards"})," Solus has set."]}),"\n",(0,s.jsxs)(t.p,{children:["If any additional files were required for the build, then you must also include the ",(0,s.jsx)(t.code,{children:"files/"})," directory. See ",(0,s.jsx)(t.a,{href:"/docs/packaging/packaging-practices",children:"Packaging Practices"})," for more detail."]}),"\n",(0,s.jsxs)(t.p,{children:["Many package builds may result in the automatic generation of an ABI report. These files start with ",(0,s.jsx)(t.code,{children:"abi_*"})," and must also be included, as they allow simple tracking of changes to symbols and dependencies."]}),"\n",(0,s.jsx)(t.p,{children:"Take a final look over your commit message to make sure it has all the necessary information, and that the formatting is good. You can use this, which will show the most recent commit:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"git log -1\n"})}),"\n",(0,s.jsx)(t.h2,{id:"creating-the-pull-request",children:"Creating the pull request"}),"\n",(0,s.jsx)(t.p,{children:"There are multiple ways to create a pull request with GitHub, either from the website, or from the command line."}),"\n",(0,s.jsxs)(R,{groupId:"opening-prs",children:[(0,s.jsxs)(u,{value:"website",label:"Website",children:[(0,s.jsxs)("p",{children:[(0,s.jsx)(t.p,{children:"In the package folder, push your local changes to a remote branch:"}),(0,s.jsx)(i.Z,{language:"bash",children:(0,s.jsx)(t.p,{children:"git push"})})]}),(0,s.jsx)(r.Z,{type:"info",children:(0,s.jsx)(t.p,{children:"If you've created your own branch, as recommended, the CLI tool will show you a new command to create and push to a remote branch matching the local one. Run this."})}),(0,s.jsxs)("p",{children:[(0,s.jsx)(t.p,{children:"Once the commit is successfully pushed, you'll notice that a URL will be provided that will immediately allow you to create a pull request with your changes."}),(0,s.jsxs)(t.p,{children:["Run ",(0,s.jsx)(t.code,{children:"git status"})," one last time to make sure your branch is clean. If it is:"]}),(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Open the link."}),"\n",(0,s.jsx)(t.li,{children:"Fill in a summary of your changes (usually the same as the commit message)."}),"\n",(0,s.jsxs)(t.li,{children:["Link any relevant issues:","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["If you want to link this pull request to an existing issue, simply mention it in the PR summary: ",(0,s.jsx)(t.code,{children:"The inclusion of fixes #123"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:["If you need a change to depend on another change, mention it in the PR summary too: ",(0,s.jsx)(t.code,{children:"Depends on #234"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.li,{children:"Double-check everything."}),"\n",(0,s.jsx)(t.li,{children:"Create the pull request!"}),"\n"]})]})]}),(0,s.jsxs)(u,{value:"github-cli",label:"GitHub CLI",children:[(0,s.jsx)("p",{children:(0,s.jsxs)(t.p,{children:["In the package folder, run the ",(0,s.jsx)(t.code,{children:"gh"})," command:"]})}),(0,s.jsx)(i.Z,{language:"bash",children:(0,s.jsx)(t.p,{children:"gh pr create"})}),(0,s.jsxs)("p",{children:[(0,s.jsx)(t.p,{children:"This will start an interactive session to create your pull request step-by-step."}),(0,s.jsxs)(t.p,{children:["When the current branch isn't fully pushed to a git remote, a prompt will ask where to push the branch and offer an option to fork the base repository. For community packagers, you should use your fork of the packages repository. If you are a member of the Solus Staff, you should use ",(0,s.jsx)(t.code,{children:"getsolus/packages"}),"."]})]}),(0,s.jsx)(r.Z,{type:"info",children:(0,s.jsxs)(t.p,{children:["The text editor used by ",(0,s.jsx)(t.code,{children:"github-cli"})," may not the same one that ",(0,s.jsx)(t.code,{children:"git"})," uses. To change this, consult the ",(0,s.jsxs)(t.a,{href:"https://cli.github.com/manual/gh_config_set",children:[(0,s.jsx)(t.code,{children:"gh config set"})," command"]}),"."]})})]})]}),"\n",(0,s.jsx)(t.h2,{id:"amending-a-pull-request",children:"Amending a pull request"}),"\n",(0,s.jsx)(t.p,{children:"There may be times you need to make minor changes after submitting the pull request. For instance, you see something that needs correcting. To do this, you will need to amend your commit."}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Make your changes"}),"\n",(0,s.jsxs)(t.li,{children:["Stage your changes: ",(0,s.jsx)(t.code,{children:"git add ."})]}),"\n",(0,s.jsxs)(t.li,{children:["Amend the commit: ",(0,s.jsx)(t.code,{children:"git commit --amend"})]}),"\n",(0,s.jsxs)(t.li,{children:["Push the amended commit: ",(0,s.jsx)(t.code,{children:"git push --force"})]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"The web interface on GitHub will automatically update with the latest changes."}),"\n",(0,s.jsx)(t.admonition,{type:"note",children:(0,s.jsx)(t.p,{children:"We want amended commits because of the way our tooling works. It expects that there is only one Git commit per package change."})}),"\n",(0,s.jsx)(t.h3,{id:"amending-a-pull-request-with-multiple-commits",children:"Amending a pull request with multiple commits"}),"\n",(0,s.jsx)(t.p,{children:"Sometimes, you may be submitting multiple packages in a single pull request, and one of them might need changes. The process is very similar to the above steps, but with a couple of additions."}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["Rebase on the ",(0,s.jsx)(t.code,{children:"main"})," branch: ",(0,s.jsx)(t.code,{children:"git rebase -i origin/main"})]}),"\n",(0,s.jsxs)(t.li,{children:["A text editor will open in your terminal (",(0,s.jsx)(t.code,{children:"nano"})," by default). Change the line or lines of the commits you want to change from ",(0,s.jsx)(t.code,{children:"pick"})," to ",(0,s.jsx)(t.code,{children:"edit"})]}),"\n",(0,s.jsxs)(t.li,{children:["Save and close the editor (by default, ",(0,s.jsx)(t.code,{children:"Ctrl+s"})," ",(0,s.jsx)(t.code,{children:"Ctrl+x"}),")"]}),"\n",(0,s.jsx)(t.li,{children:"Make your changes"}),"\n",(0,s.jsxs)(t.li,{children:["Stage your changes: ",(0,s.jsx)(t.code,{children:"git add ."})]}),"\n",(0,s.jsxs)(t.li,{children:["Amend the commit: ",(0,s.jsx)(t.code,{children:"git commit --amend"})]}),"\n",(0,s.jsxs)(t.li,{children:["Continue the rebase: ",(0,s.jsx)(t.code,{children:"git rebase --continue"})]}),"\n",(0,s.jsx)(t.li,{children:"Repeat steps 4 through 7 for all commits you wish to edit"}),"\n",(0,s.jsxs)(t.li,{children:["Push the amended stack: ",(0,s.jsx)(t.code,{children:"git push --force"})]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"updating-a-pull-request-that-has-changes-requested",children:"Updating a pull request that has changes requested"}),"\n",(0,s.jsx)(t.p,{children:"Your pull request will be reviewed, and changes may be requested. This is normal. It's to ensure the quality of the packages in our repository and to make sure each PR adheres to our standards."}),"\n",(0,s.jsxs)(t.p,{children:["If you need to make changes in response to a review, follow the steps in the ",(0,s.jsx)(t.a,{href:"#amending-a-pull-request",children:"section above"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"after-the-pull-request-is-accepted",children:"After the pull request is accepted"}),"\n",(0,s.jsx)(t.p,{children:"Once your pull request is accepted and merged, someone on the Solus Team will issue a build. Your new / updated package will be published to the unstable repos."}),"\n",(0,s.jsxs)(t.p,{children:["At this point you may ",(0,s.jsx)(t.a,{href:"git-basics#deleting-your-branch-after-a-pull-request-is-merged",children:"delete the local and remote branches"})," for this pull request."]})]})}function N(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(_,{...e})}):_(e)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6485],{85612:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>C,contentTitle:()=>P,default:()=>N,frontMatter:()=>T,metadata:()=>A,toc:()=>V});var s=n(85893),a=n(11151),r=n(20906),i=n(17573),l=n(67294),o=n(36905);const c={tabItem:"tabItem_Ymn6"};function u(e){let{children:t,hidden:n,className:a}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,o.Z)(c.tabItem,a),hidden:n,children:t})}var h=n(18119),d=n(16550),p=n(1290),m=n(39222),g=n(79113),f=n(1606);function b(e){return l.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function x(e){const{values:t,children:n}=e;return(0,l.useMemo)((()=>{const e=t??function(e){return b(e).map((e=>{let{props:{value:t,label:n,attributes:s,default:a}}=e;return{value:t,label:n,attributes:s,default:a}}))}(n);return function(e){const t=(0,g.lx)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,n])}function j(e){let{value:t,tabValues:n}=e;return n.some((e=>e.value===t))}function y(e){let{queryString:t=!1,groupId:n}=e;const s=(0,d.k6)(),a=function(e){let{queryString:t=!1,groupId:n}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:t,groupId:n});return[(0,m._X)(a),(0,l.useCallback)((e=>{if(!a)return;const t=new URLSearchParams(s.location.search);t.set(a,e),s.replace({...s.location,search:t.toString()})}),[a,s])]}function w(e){const{defaultValue:t,queryString:n=!1,groupId:s}=e,a=x(e),[r,i]=(0,l.useState)((()=>function(e){let{defaultValue:t,tabValues:n}=e;if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!j({value:t,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${n.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const s=n.find((e=>e.default))??n[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:t,tabValues:a}))),[o,c]=y({queryString:n,groupId:s}),[u,h]=function(e){let{groupId:t}=e;const n=function(e){return e?`docusaurus.tab.${e}`:null}(t),[s,a]=(0,f.Nk)(n);return[s,(0,l.useCallback)((e=>{n&&a.set(e)}),[n,a])]}({groupId:s}),d=(()=>{const e=o??u;return j({value:e,tabValues:a})?e:null})();(0,p.Z)((()=>{d&&i(d)}),[d]);return{selectedValue:r,selectValue:(0,l.useCallback)((e=>{if(!j({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);i(e),c(e),h(e)}),[c,h,a]),tabValues:a}}var k=n(45025);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function q(e){let{className:t,block:n,selectedValue:a,selectValue:r,tabValues:i}=e;const l=[],{blockElementScrollPositionUntilNextRender:c}=(0,h.o5)(),u=e=>{const t=e.currentTarget,n=l.indexOf(t),s=i[n].value;s!==a&&(c(t),r(s))},d=e=>{let t=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const n=l.indexOf(e.currentTarget)+1;t=l[n]??l[0];break}case"ArrowLeft":{const n=l.indexOf(e.currentTarget)-1;t=l[n]??l[l.length-1];break}}t?.focus()};return(0,s.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":n},t),children:i.map((e=>{let{value:t,label:n,attributes:r}=e;return(0,s.jsx)("li",{role:"tab",tabIndex:a===t?0:-1,"aria-selected":a===t,ref:e=>l.push(e),onKeyDown:d,onClick:u,...r,className:(0,o.Z)("tabs__item",v.tabItem,r?.className,{"tabs__item--active":a===t}),children:n??t},t)}))})}function I(e){let{lazy:t,children:n,selectedValue:a}=e;const r=(Array.isArray(n)?n:[n]).filter(Boolean);if(t){const e=r.find((e=>e.props.value===a));return e?(0,l.cloneElement)(e,{className:(0,o.Z)("margin-top--md",e.props.className)}):null}return(0,s.jsx)("div",{className:"margin-top--md",children:r.map(((e,t)=>(0,l.cloneElement)(e,{key:t,hidden:e.props.value!==a})))})}function S(e){const t=w(e);return(0,s.jsxs)("div",{className:(0,o.Z)("tabs-container",v.tabList),children:[(0,s.jsx)(q,{...t,...e}),(0,s.jsx)(I,{...t,...e})]})}function R(e){const t=(0,k.Z)();return(0,s.jsx)(S,{...e,children:b(e.children)},String(t))}const T={title:"Submitting a Pull Request for Review",summary:"Submitting a Pull Request for Review",sidebar_position:6},P="Submitting a Pull Request for Review",A={id:"packaging/submitting-a-pull-request",title:"Submitting a Pull Request for Review",description:"Please refrain from submitting a pull request for the following instances:",source:"@site/docs/packaging/submitting-a-pull-request.mdx",sourceDirName:"packaging",slug:"/packaging/submitting-a-pull-request",permalink:"/docs/packaging/submitting-a-pull-request",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/submitting-a-pull-request.mdx",tags:[],version:"current",lastUpdatedAt:1732070401e3,sidebarPosition:6,frontMatter:{title:"Submitting a Pull Request for Review",summary:"Submitting a Pull Request for Review",sidebar_position:6},sidebar:"packagingSidebar",previous:{title:"Testing a Package",permalink:"/docs/packaging/testing-a-package"},next:{title:"Packaging Changes",permalink:"/docs/packaging/packaging-changes"}},C={},V=[{value:"Final branch review",id:"final-branch-review",level:2},{value:"Creating the pull request",id:"creating-the-pull-request",level:2},{value:"Amending a pull request",id:"amending-a-pull-request",level:2},{value:"Amending a pull request with multiple commits",id:"amending-a-pull-request-with-multiple-commits",level:3},{value:"Updating a pull request that has changes requested",id:"updating-a-pull-request-that-has-changes-requested",level:2},{value:"After the pull request is accepted",id:"after-the-pull-request-is-accepted",level:2}];function _(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"submitting-a-pull-request-for-review",children:"Submitting a Pull Request for Review"})}),"\n",(0,s.jsx)(t.p,{children:"Please refrain from submitting a pull request for the following instances:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["For a package that is yet to be accepted for inclusion by a member of the Solus Staff team. Search ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues?q=label%3A%22Package+Request%22",children:"open package requests"})," to see if there is an open request for the package.\nWe welcome you to politely reach out via the package request issue or our Support room on ",(0,s.jsx)(t.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"})," if you deem the review of the request to be time-sensitive in nature."]}),"\n",(0,s.jsxs)(t.li,{children:["If your pull request is a Work In Progress / WIP. Pull requests that are completed or are marked as ",(0,s.jsx)(t.em,{children:"request for comments"})," (RFC) are accepted. For RFC request please ensure your patch title contains ",(0,s.jsx)(t.code,{children:"[RFC]"})," and is marked as 'draft'. WIP patches clutter the issue tracker, make patch review by Solus Staff more time consuming, and introduce unnecessary work."]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"final-branch-review",children:"Final branch review"}),"\n",(0,s.jsx)(t.p,{children:"At minimum, your pull request will include changes for the following files:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"package.yml"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"pspec_*.xml"})}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"It may also include these files:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"MAINTAINERS.md"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"monitoring.yml"})}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Double check the ",(0,s.jsx)(t.code,{children:"package.yml"})," to make sure the builddeps are in the right order, and that it otherwise adheres to the ",(0,s.jsx)(t.a,{href:"/docs/packaging/package.yml",children:"standards"})," Solus has set."]}),"\n",(0,s.jsxs)(t.p,{children:["If any additional files were required for the build, then you must also include the ",(0,s.jsx)(t.code,{children:"files/"})," directory. See ",(0,s.jsx)(t.a,{href:"/docs/packaging/packaging-practices",children:"Packaging Practices"})," for more detail."]}),"\n",(0,s.jsxs)(t.p,{children:["Many package builds may result in the automatic generation of an ABI report. These files start with ",(0,s.jsx)(t.code,{children:"abi_*"})," and must also be included, as they allow simple tracking of changes to symbols and dependencies."]}),"\n",(0,s.jsx)(t.p,{children:"Take a final look over your commit message to make sure it has all the necessary information, and that the formatting is good. You can use this, which will show the most recent commit:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"git log -1\n"})}),"\n",(0,s.jsx)(t.h2,{id:"creating-the-pull-request",children:"Creating the pull request"}),"\n",(0,s.jsx)(t.p,{children:"There are multiple ways to create a pull request with GitHub, either from the website, or from the command line."}),"\n",(0,s.jsxs)(R,{groupId:"opening-prs",children:[(0,s.jsxs)(u,{value:"website",label:"Website",children:[(0,s.jsxs)("p",{children:[(0,s.jsx)(t.p,{children:"In the package folder, push your local changes to a remote branch:"}),(0,s.jsx)(i.Z,{language:"bash",children:(0,s.jsx)(t.p,{children:"git push"})})]}),(0,s.jsx)(r.Z,{type:"info",children:(0,s.jsx)(t.p,{children:"If you've created your own branch, as recommended, the CLI tool will show you a new command to create and push to a remote branch matching the local one. Run this."})}),(0,s.jsxs)("p",{children:[(0,s.jsx)(t.p,{children:"Once the commit is successfully pushed, you'll notice that a URL will be provided that will immediately allow you to create a pull request with your changes."}),(0,s.jsxs)(t.p,{children:["Run ",(0,s.jsx)(t.code,{children:"git status"})," one last time to make sure your branch is clean. If it is:"]}),(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Open the link."}),"\n",(0,s.jsx)(t.li,{children:"Fill in a summary of your changes (usually the same as the commit message)."}),"\n",(0,s.jsxs)(t.li,{children:["Link any relevant issues:","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["If you want to link this pull request to an existing issue, simply mention it in the PR summary: ",(0,s.jsx)(t.code,{children:"The inclusion of fixes #123"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:["If you need a change to depend on another change, mention it in the PR summary too: ",(0,s.jsx)(t.code,{children:"Depends on #234"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.li,{children:"Double-check everything."}),"\n",(0,s.jsx)(t.li,{children:"Create the pull request!"}),"\n"]})]})]}),(0,s.jsxs)(u,{value:"github-cli",label:"GitHub CLI",children:[(0,s.jsx)("p",{children:(0,s.jsxs)(t.p,{children:["In the package folder, run the ",(0,s.jsx)(t.code,{children:"gh"})," command:"]})}),(0,s.jsx)(i.Z,{language:"bash",children:(0,s.jsx)(t.p,{children:"gh pr create"})}),(0,s.jsxs)("p",{children:[(0,s.jsx)(t.p,{children:"This will start an interactive session to create your pull request step-by-step."}),(0,s.jsxs)(t.p,{children:["When the current branch isn't fully pushed to a git remote, a prompt will ask where to push the branch and offer an option to fork the base repository. For community packagers, you should use your fork of the packages repository. If you are a member of the Solus Staff, you should use ",(0,s.jsx)(t.code,{children:"getsolus/packages"}),"."]})]}),(0,s.jsx)(r.Z,{type:"info",children:(0,s.jsxs)(t.p,{children:["The text editor used by ",(0,s.jsx)(t.code,{children:"github-cli"})," may not the same one that ",(0,s.jsx)(t.code,{children:"git"})," uses. To change this, consult the ",(0,s.jsxs)(t.a,{href:"https://cli.github.com/manual/gh_config_set",children:[(0,s.jsx)(t.code,{children:"gh config set"})," command"]}),"."]})})]})]}),"\n",(0,s.jsx)(t.h2,{id:"amending-a-pull-request",children:"Amending a pull request"}),"\n",(0,s.jsx)(t.p,{children:"There may be times you need to make minor changes after submitting the pull request. For instance, you see something that needs correcting. To do this, you will need to amend your commit."}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Make your changes"}),"\n",(0,s.jsxs)(t.li,{children:["Stage your changes: ",(0,s.jsx)(t.code,{children:"git add ."})]}),"\n",(0,s.jsxs)(t.li,{children:["Amend the commit: ",(0,s.jsx)(t.code,{children:"git commit --amend"})]}),"\n",(0,s.jsxs)(t.li,{children:["Push the amended commit: ",(0,s.jsx)(t.code,{children:"git push --force"})]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"The web interface on GitHub will automatically update with the latest changes."}),"\n",(0,s.jsx)(t.admonition,{type:"note",children:(0,s.jsx)(t.p,{children:"We want amended commits because of the way our tooling works. It expects that there is only one Git commit per package change."})}),"\n",(0,s.jsx)(t.h3,{id:"amending-a-pull-request-with-multiple-commits",children:"Amending a pull request with multiple commits"}),"\n",(0,s.jsx)(t.p,{children:"Sometimes, you may be submitting multiple packages in a single pull request, and one of them might need changes. The process is very similar to the above steps, but with a couple of additions."}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["Rebase on the ",(0,s.jsx)(t.code,{children:"main"})," branch: ",(0,s.jsx)(t.code,{children:"git rebase -i origin/main"})]}),"\n",(0,s.jsxs)(t.li,{children:["A text editor will open in your terminal (",(0,s.jsx)(t.code,{children:"nano"})," by default). Change the line or lines of the commits you want to change from ",(0,s.jsx)(t.code,{children:"pick"})," to ",(0,s.jsx)(t.code,{children:"edit"})]}),"\n",(0,s.jsxs)(t.li,{children:["Save and close the editor (by default, ",(0,s.jsx)(t.code,{children:"Ctrl+s"})," ",(0,s.jsx)(t.code,{children:"Ctrl+x"}),")"]}),"\n",(0,s.jsx)(t.li,{children:"Make your changes"}),"\n",(0,s.jsxs)(t.li,{children:["Stage your changes: ",(0,s.jsx)(t.code,{children:"git add ."})]}),"\n",(0,s.jsxs)(t.li,{children:["Amend the commit: ",(0,s.jsx)(t.code,{children:"git commit --amend"})]}),"\n",(0,s.jsxs)(t.li,{children:["Continue the rebase: ",(0,s.jsx)(t.code,{children:"git rebase --continue"})]}),"\n",(0,s.jsx)(t.li,{children:"Repeat steps 4 through 7 for all commits you wish to edit"}),"\n",(0,s.jsxs)(t.li,{children:["Push the amended stack: ",(0,s.jsx)(t.code,{children:"git push --force"})]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"updating-a-pull-request-that-has-changes-requested",children:"Updating a pull request that has changes requested"}),"\n",(0,s.jsx)(t.p,{children:"Your pull request will be reviewed, and changes may be requested. This is normal. It's to ensure the quality of the packages in our repository and to make sure each PR adheres to our standards."}),"\n",(0,s.jsxs)(t.p,{children:["If you need to make changes in response to a review, follow the steps in the ",(0,s.jsx)(t.a,{href:"#amending-a-pull-request",children:"section above"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"after-the-pull-request-is-accepted",children:"After the pull request is accepted"}),"\n",(0,s.jsx)(t.p,{children:"Once your pull request is accepted and merged, someone on the Solus Team will issue a build. Your new / updated package will be published to the unstable repos."}),"\n",(0,s.jsxs)(t.p,{children:["At this point you may ",(0,s.jsx)(t.a,{href:"git-basics#deleting-your-branch-after-a-pull-request-is-merged",children:"delete the local and remote branches"})," for this pull request."]})]})}function N(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(_,{...e})}):_(e)}}}]); \ No newline at end of file diff --git a/assets/js/2a0f90eb.cdffec6b.js b/assets/js/2a0f90eb.493adcbc.js similarity index 55% rename from assets/js/2a0f90eb.cdffec6b.js rename to assets/js/2a0f90eb.493adcbc.js index 74a5fcbe9..5175d4042 100644 --- a/assets/js/2a0f90eb.cdffec6b.js +++ b/assets/js/2a0f90eb.493adcbc.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2817],{98247:e=>{e.exports=JSON.parse('{"tag":{"label":"solus","permalink":"/blog/tags/solus","allTagsPath":"/blog/tags","count":4,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/solus","page":1,"postsPerPage":4,"totalPages":1,"totalCount":4,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2817],{98247:e=>{e.exports=JSON.parse('{"tag":{"label":"solus","permalink":"/blog/tags/solus","allTagsPath":"/blog/tags","count":5,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/solus","page":1,"postsPerPage":5,"totalPages":1,"totalCount":5,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/2a34ce22.59508d8f.js b/assets/js/2a34ce22.6a00fac3.js similarity index 98% rename from assets/js/2a34ce22.59508d8f.js rename to assets/js/2a34ce22.6a00fac3.js index 389ea37e0..a0cd58c00 100644 --- a/assets/js/2a34ce22.59508d8f.js +++ b/assets/js/2a34ce22.6a00fac3.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6074],{21974:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>a,contentTitle:()=>d,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>l});var s=r(85893),n=r(11151);const i={title:"System Requirements",summary:"Hardware Requirements Guide"},d="System requirements",o={id:"user/quick-start/installation/system-requirements",title:"System Requirements",description:"- A blank DVD or a USB drive that is at least 3 GB",source:"@site/docs/user/quick-start/installation/system-requirements.md",sourceDirName:"user/quick-start/installation",slug:"/user/quick-start/installation/system-requirements",permalink:"/docs/user/quick-start/installation/system-requirements",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/installation/system-requirements.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"System Requirements",summary:"Hardware Requirements Guide"},sidebar:"userSidebar",previous:{title:"Booting with Secure Boot Enabled",permalink:"/docs/user/quick-start/installation/secure-boot"},next:{title:"Software Center",permalink:"/docs/user/quick-start/software-center/"}},a={},l=[];function c(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"system-requirements",children:"System requirements"})}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"A blank DVD or a USB drive that is at least 3\xa0GB"}),"\n",(0,s.jsx)(t.li,{children:"On UEFI systems, an EFI partition of 1\xa0GB minimum"}),"\n",(0,s.jsx)(t.li,{children:"An internet connection"}),"\n",(0,s.jsx)(t.li,{children:"System connected to AC power"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"In order to install Solus, your system must meet the minimum system requirements. Ideally it should meet or exceed the recommended values for a better experience."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{}),(0,s.jsx)(t.th,{children:"Minimum"}),(0,s.jsx)(t.th,{children:"Recommended"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"Disk space free"})}),(0,s.jsx)(t.td,{children:"10\xa0GB / 9.3\xa0GiB"}),(0,s.jsx)(t.td,{children:"25\xa0GB / 23.3\xa0GiB"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"Memory (RAM)"})}),(0,s.jsx)(t.td,{children:"4\xa0GB"}),(0,s.jsx)(t.td,{children:"8\xa0GB or more"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"Processor (CPU)"})}),(0,s.jsx)(t.td,{children:"64-bit (x86-64) processor"}),(0,s.jsxs)(t.td,{children:[(0,s.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/X86-64#Microarchitecture_levels",children:"x86-64-v2"})," 2\xa0GHz quad core"]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"System firmware"})}),(0,s.jsx)(t.td,{children:"BIOS / UEFI"}),(0,s.jsx)(t.td,{children:"UEFI"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"Display Adapter (GPU)"})}),(0,s.jsx)(t.td,{children:"Any onboard or dedicated adapter"}),(0,s.jsx)(t.td,{})]})]})]}),"\n",(0,s.jsx)(t.p,{children:"These are general recommendations. Your requirements may vary based on your intended use of the system."}),"\n",(0,s.jsxs)(t.admonition,{type:"info",children:[(0,s.jsx)(t.p,{children:"Desktop environments that are more feature rich (such as GNOME and KDE Plasma) use the graphics card for 3D-acceleration, when possible. They will benefit from dedicated and more powerful GPUs. Older graphics cards may not support acceleration:"}),(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Intel prior to GMA9xx"}),"\n",(0,s.jsx)(t.li,{children:"NVIDIA prior to NV30 (GeForce FX5xxx series)"}),"\n",(0,s.jsx)(t.li,{children:"Radeon prior to R300 (Radeon 9500)"}),"\n"]})]})]})}function h(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,t,r)=>{r.d(t,{Z:()=>o,a:()=>d});var s=r(67294);const n={},i=s.createContext(n);function d(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6074],{21974:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>a,contentTitle:()=>d,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>l});var s=r(85893),n=r(11151);const i={title:"System Requirements",summary:"Hardware Requirements Guide"},d="System requirements",o={id:"user/quick-start/installation/system-requirements",title:"System Requirements",description:"- A blank DVD or a USB drive that is at least 3 GB",source:"@site/docs/user/quick-start/installation/system-requirements.md",sourceDirName:"user/quick-start/installation",slug:"/user/quick-start/installation/system-requirements",permalink:"/docs/user/quick-start/installation/system-requirements",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/installation/system-requirements.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"System Requirements",summary:"Hardware Requirements Guide"},sidebar:"userSidebar",previous:{title:"Booting with Secure Boot Enabled",permalink:"/docs/user/quick-start/installation/secure-boot"},next:{title:"Software Center",permalink:"/docs/user/quick-start/software-center/"}},a={},l=[];function c(e){const t={a:"a",admonition:"admonition",h1:"h1",header:"header",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"system-requirements",children:"System requirements"})}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"A blank DVD or a USB drive that is at least 3\xa0GB"}),"\n",(0,s.jsx)(t.li,{children:"On UEFI systems, an EFI partition of 1\xa0GB minimum"}),"\n",(0,s.jsx)(t.li,{children:"An internet connection"}),"\n",(0,s.jsx)(t.li,{children:"System connected to AC power"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"In order to install Solus, your system must meet the minimum system requirements. Ideally it should meet or exceed the recommended values for a better experience."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{}),(0,s.jsx)(t.th,{children:"Minimum"}),(0,s.jsx)(t.th,{children:"Recommended"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"Disk space free"})}),(0,s.jsx)(t.td,{children:"10\xa0GB / 9.3\xa0GiB"}),(0,s.jsx)(t.td,{children:"25\xa0GB / 23.3\xa0GiB"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"Memory (RAM)"})}),(0,s.jsx)(t.td,{children:"4\xa0GB"}),(0,s.jsx)(t.td,{children:"8\xa0GB or more"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"Processor (CPU)"})}),(0,s.jsx)(t.td,{children:"64-bit (x86-64) processor"}),(0,s.jsxs)(t.td,{children:[(0,s.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/X86-64#Microarchitecture_levels",children:"x86-64-v2"})," 2\xa0GHz quad core"]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"System firmware"})}),(0,s.jsx)(t.td,{children:"BIOS / UEFI"}),(0,s.jsx)(t.td,{children:"UEFI"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"Display Adapter (GPU)"})}),(0,s.jsx)(t.td,{children:"Any onboard or dedicated adapter"}),(0,s.jsx)(t.td,{})]})]})]}),"\n",(0,s.jsx)(t.p,{children:"These are general recommendations. Your requirements may vary based on your intended use of the system."}),"\n",(0,s.jsxs)(t.admonition,{type:"info",children:[(0,s.jsx)(t.p,{children:"Desktop environments that are more feature rich (such as GNOME and KDE Plasma) use the graphics card for 3D-acceleration, when possible. They will benefit from dedicated and more powerful GPUs. Older graphics cards may not support acceleration:"}),(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Intel prior to GMA9xx"}),"\n",(0,s.jsx)(t.li,{children:"NVIDIA prior to NV30 (GeForce FX5xxx series)"}),"\n",(0,s.jsx)(t.li,{children:"Radeon prior to R300 (Radeon 9500)"}),"\n"]})]})]})}function h(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,t,r)=>{r.d(t,{Z:()=>o,a:()=>d});var s=r(67294);const n={},i=s.createContext(n);function d(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2a37c7d8.c20b4d40.js b/assets/js/2a37c7d8.fcae30d8.js similarity index 99% rename from assets/js/2a37c7d8.c20b4d40.js rename to assets/js/2a37c7d8.fcae30d8.js index 28a9b3052..60e923384 100644 --- a/assets/js/2a37c7d8.c20b4d40.js +++ b/assets/js/2a37c7d8.fcae30d8.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9995],{81754:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>d,default:()=>a,frontMatter:()=>r,metadata:()=>c,toc:()=>o});var t=s(85893),i=s(11151);const r={title:"Tips and Tricks",summary:"Helpful tips and tricks for using Plasma on Solus."},d="Tips and Tricks",c={id:"user/editions/plasma/tips-and-tricks",title:"Tips and Tricks",description:"Keyboard shortcuts",source:"@site/docs/user/editions/plasma/tips-and-tricks.md",sourceDirName:"user/editions/plasma",slug:"/user/editions/plasma/tips-and-tricks",permalink:"/docs/user/editions/plasma/tips-and-tricks",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/plasma/tips-and-tricks.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Tips and Tricks",summary:"Helpful tips and tricks for using Plasma on Solus."},sidebar:"userSidebar",previous:{title:"Configuration",permalink:"/docs/user/editions/plasma/configuration"},next:{title:"XFCE",permalink:"/docs/user/editions/xfce/"}},l={},o=[{value:"Keyboard shortcuts",id:"keyboard-shortcuts",level:2},{value:"Using KRunner",id:"using-krunner",level:2},{value:"Dolphin",id:"dolphin",level:2},{value:"Context menu",id:"context-menu",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,t.jsx)(n.h2,{id:"keyboard-shortcuts",children:"Keyboard shortcuts"}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["To see the complete list of keyboard shortcuts available on your system, open the ",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.a,{href:"/docs/user/editions/plasma/configuration#opening-system-settings",children:"System Settings"})})," screen, then go to ",(0,t.jsx)(n.strong,{children:"Workspace"})," > ",(0,t.jsx)(n.strong,{children:"Shortcuts"}),"."]})}),"\n",(0,t.jsx)(n.p,{children:"The following table shows some of the keyboard shortcuts available in Solus Plasma."}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Keyboard shortcut"}),(0,t.jsx)(n.th,{children:"Action"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"Alt"})," + ",(0,t.jsx)(n.code,{children:"F2"})]}),(0,t.jsx)(n.td,{children:"Opens KRunner"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"Alt"})," + ",(0,t.jsx)(n.code,{children:"Space"})]}),(0,t.jsx)(n.td,{children:"Opens KRunner"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"Alt"})," + ",(0,t.jsx)(n.code,{children:"F4"})]}),(0,t.jsx)(n.td,{children:"Closes the active window on the desktop"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"Alt"})," + ",(0,t.jsx)(n.code,{children:"Tab"})]}),(0,t.jsx)(n.td,{children:"Opens application switcher, switch to the next application on the list"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"Shift"})," + ",(0,t.jsx)(n.code,{children:"Alt"})," + ",(0,t.jsx)(n.code,{children:"Tab"})]}),(0,t.jsx)(n.td,{children:"Opens application switcher, switch to previous application on the list"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"Super"})}),(0,t.jsx)(n.td,{children:"Opens the application menu"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"Super"})," + ",(0,t.jsx)(n.code,{children:"L"})]}),(0,t.jsx)(n.td,{children:"Locks the screen"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"Super"})," + ",(0,t.jsx)(n.code,{children:"D"})]}),(0,t.jsx)(n.td,{children:"Shows the desktop"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"Print"})}),(0,t.jsx)(n.td,{children:"Opens the screenshot utility (Spectacle)"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"Super"})," + ",(0,t.jsx)(n.code,{children:"Print"})]}),(0,t.jsx)(n.td,{children:"Captures the active window"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"Super"})," + ",(0,t.jsx)(n.code,{children:"Shift"})," + ",(0,t.jsx)(n.code,{children:"Print"})]}),(0,t.jsx)(n.td,{children:"Captures a rectangular region of the screen"})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"using-krunner",children:"Using KRunner"}),"\n",(0,t.jsx)(n.p,{children:"KRunner is a system-wide desktop search and launcher app available on Solus Plasma. KRunner allows you to perform a variety of actions such as launching apps, executing commands, search files and open open system settings."}),"\n",(0,t.jsxs)(n.p,{children:["Open KRunner by pressing ",(0,t.jsx)(n.code,{children:"Alt"})," + ",(0,t.jsx)(n.code,{children:"F2"})," or ",(0,t.jsx)(n.code,{children:"Alt"})," + ",(0,t.jsx)(n.code,{children:"Space"}),"."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"KRunner interface",src:s(71242).Z+"",width:"723",height:"161"})}),"\n",(0,t.jsx)(n.p,{children:"The following table outlines the actions you can perform using KRunner."}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Action"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Open an application"}),(0,t.jsx)(n.td,{children:"Enter the name of the application, then select the application from the list."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Run a command"}),(0,t.jsxs)(n.td,{children:["Enter the command you want to run and press ",(0,t.jsx)(n.code,{children:"Enter"}),"."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"See the man pages of a command"}),(0,t.jsxs)(n.td,{children:["Add ",(0,t.jsx)(n.code,{children:"#"})," before a command name and press enter (Example, ",(0,t.jsx)(n.code,{children:"#wget"}),")."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Terminate a program"}),(0,t.jsxs)(n.td,{children:["Enter ",(0,t.jsx)(n.code,{children:"kill [application name]"})," and press ",(0,t.jsx)(n.code,{children:"Enter"})," (Example: ",(0,t.jsx)(n.code,{children:"kill firefox"}),")"]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Do math operations"}),(0,t.jsxs)(n.td,{children:["Enter ",(0,t.jsx)(n.code,{children:"="})," followed by the calculation you want to perform (Examples: ",(0,t.jsx)(n.code,{children:"=2*2"}),", ",(0,t.jsx)(n.code,{children:"=5!"}),", ",(0,t.jsx)(n.code,{children:"=sin(20)"}),")."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Unit conversions"}),(0,t.jsxs)(n.td,{children:["Enter ",(0,t.jsx)(n.code,{children:"[measurement] to [destination unit]"})," (Examples: ",(0,t.jsx)(n.code,{children:"200 mi to km"}),")."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Currency conversions"}),(0,t.jsxs)(n.td,{children:["Enter ",(0,t.jsx)(n.code,{children:"[amount] to [destination currency]"}),". You can use the ISO code or the name of the currencies to do the conversion (Examples: ",(0,t.jsx)(n.code,{children:"200 CAD to NOK"}),", ",(0,t.jsx)(n.code,{children:"50 koruna to yen"}),")."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Check the time of other countries or time zones"}),(0,t.jsxs)(n.td,{children:["Enter ",(0,t.jsx)(n.code,{children:"time [country]"})," or ",(0,t.jsx)(n.code,{children:"time [time zone]"})," (Examples: ",(0,t.jsx)(n.code,{children:"time finland"}),", ",(0,t.jsx)(n.code,{children:"time gmt-1"}),")."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Open files and folders"}),(0,t.jsx)(n.td,{children:"Enter the name of a file or folder, then select an entry from the list."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Switch between windows"}),(0,t.jsxs)(n.td,{children:["Enter the name of an open window and select an entry from the ",(0,t.jsx)(n.strong,{children:"Windows"})," list."]})]})]})]}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["To see a list of the currencies KRunner supports, see ",(0,t.jsx)(n.a,{href:"https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/index.en.html",children:"https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/index.en.html"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Unit and currency conversions do not require the ",(0,t.jsx)(n.code,{children:"="})," symbol."]}),"\n"]})}),"\n",(0,t.jsx)(n.h2,{id:"dolphin",children:"Dolphin"}),"\n",(0,t.jsx)(n.p,{children:"Dolphin is the file manager included by default in Solus Plasma. Dolphin has multiple features, including tabs, split views, integrated terminal, and support for various file formats and protocols."}),"\n",(0,t.jsx)(n.p,{children:"The following table describes some of the keyboard shortcuts you can use in Dolphin."}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Action"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Create a new folder"}),(0,t.jsxs)(n.td,{children:["Press ",(0,t.jsx)(n.code,{children:"F10"})," to create a new folder."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Enabling dual-pane mode"}),(0,t.jsxs)(n.td,{children:["Press ",(0,t.jsx)(n.code,{children:"F3"})," to enable dual-pane mode."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Open multiple tabs"}),(0,t.jsxs)(n.td,{children:["Press ",(0,t.jsx)(n.code,{children:"Ctrl"})," + ",(0,t.jsx)(n.code,{children:"T"})," to open multiple Dolphin tabs."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Open a terminal window in the current location"}),(0,t.jsxs)(n.td,{children:["Press ",(0,t.jsx)(n.code,{children:"Alt"})," + ",(0,t.jsx)(n.code,{children:"Shift"})," + ",(0,t.jsx)(n.code,{children:"F4"})," to open a terminal window in the location you have open."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Show/hide hidden files"}),(0,t.jsxs)(n.td,{children:["Press ",(0,t.jsx)(n.code,{children:"Ctrl"})," + ",(0,t.jsx)(n.code,{children:"H"})," to show/hide hidden files."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Show/hide the side panel"}),(0,t.jsxs)(n.td,{children:["Press ",(0,t.jsx)(n.code,{children:"F9"})," to show/hide the ",(0,t.jsx)(n.strong,{children:"Places"})," side panel."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Switch between the view modes"}),(0,t.jsxs)(n.td,{children:["Press ",(0,t.jsx)(n.code,{children:"Ctrl"})," + ",(0,t.jsx)(n.code,{children:"1"})," to display icons in ",(0,t.jsx)(n.em,{children:"icons"})," view, press ",(0,t.jsx)(n.code,{children:"Ctrl"})," + ",(0,t.jsx)(n.code,{children:"2"})," to display icons in ",(0,t.jsx)(n.em,{children:"compact"})," view, or press ",(0,t.jsx)(n.code,{children:"Ctrl"})," + ",(0,t.jsx)(n.code,{children:"3"})," to display icons in ",(0,t.jsx)(n.em,{children:"details"})," view;"]})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"context-menu",children:"Context menu"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.em,{children:"Plasma"})," desktop provides a variety of context menus. Context menus display options, settings, and actions applicable to the current context or element you select."]}),"\n",(0,t.jsx)(n.p,{children:"The following table describes some of the context menus available in Plasma."}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Context menu"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Bottom panel settings"}),(0,t.jsx)(n.td,{children:"Right-click on an empty space of the bottom panel to open the bottom panel context menu."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Widget settings"}),(0,t.jsx)(n.td,{children:"Right-click on any widget in the bottom panel to open the widget context menu."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Desktop settings"}),(0,t.jsx)(n.td,{children:"Right-click anywhere on the desktop to open the desktop context menu."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"File"}),(0,t.jsx)(n.td,{children:"Right-click a file to open the file context menu."})]})]})]})]})}function a(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},71242:(e,n,s)=>{s.d(n,{Z:()=>t});const t=s.p+"assets/images/krunner-03789ddf72481240bd795c70e63e2ab0.png"},11151:(e,n,s)=>{s.d(n,{Z:()=>c,a:()=>d});var t=s(67294);const i={},r=t.createContext(i);function d(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:d(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9995],{81754:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>d,default:()=>a,frontMatter:()=>r,metadata:()=>c,toc:()=>o});var t=s(85893),i=s(11151);const r={title:"Tips and Tricks",summary:"Helpful tips and tricks for using Plasma on Solus."},d="Tips and Tricks",c={id:"user/editions/plasma/tips-and-tricks",title:"Tips and Tricks",description:"Keyboard shortcuts",source:"@site/docs/user/editions/plasma/tips-and-tricks.md",sourceDirName:"user/editions/plasma",slug:"/user/editions/plasma/tips-and-tricks",permalink:"/docs/user/editions/plasma/tips-and-tricks",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/plasma/tips-and-tricks.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Tips and Tricks",summary:"Helpful tips and tricks for using Plasma on Solus."},sidebar:"userSidebar",previous:{title:"Configuration",permalink:"/docs/user/editions/plasma/configuration"},next:{title:"XFCE",permalink:"/docs/user/editions/xfce/"}},l={},o=[{value:"Keyboard shortcuts",id:"keyboard-shortcuts",level:2},{value:"Using KRunner",id:"using-krunner",level:2},{value:"Dolphin",id:"dolphin",level:2},{value:"Context menu",id:"context-menu",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,t.jsx)(n.h2,{id:"keyboard-shortcuts",children:"Keyboard shortcuts"}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["To see the complete list of keyboard shortcuts available on your system, open the ",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.a,{href:"/docs/user/editions/plasma/configuration#opening-system-settings",children:"System Settings"})})," screen, then go to ",(0,t.jsx)(n.strong,{children:"Workspace"})," > ",(0,t.jsx)(n.strong,{children:"Shortcuts"}),"."]})}),"\n",(0,t.jsx)(n.p,{children:"The following table shows some of the keyboard shortcuts available in Solus Plasma."}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Keyboard shortcut"}),(0,t.jsx)(n.th,{children:"Action"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"Alt"})," + ",(0,t.jsx)(n.code,{children:"F2"})]}),(0,t.jsx)(n.td,{children:"Opens KRunner"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"Alt"})," + ",(0,t.jsx)(n.code,{children:"Space"})]}),(0,t.jsx)(n.td,{children:"Opens KRunner"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"Alt"})," + ",(0,t.jsx)(n.code,{children:"F4"})]}),(0,t.jsx)(n.td,{children:"Closes the active window on the desktop"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"Alt"})," + ",(0,t.jsx)(n.code,{children:"Tab"})]}),(0,t.jsx)(n.td,{children:"Opens application switcher, switch to the next application on the list"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"Shift"})," + ",(0,t.jsx)(n.code,{children:"Alt"})," + ",(0,t.jsx)(n.code,{children:"Tab"})]}),(0,t.jsx)(n.td,{children:"Opens application switcher, switch to previous application on the list"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"Super"})}),(0,t.jsx)(n.td,{children:"Opens the application menu"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"Super"})," + ",(0,t.jsx)(n.code,{children:"L"})]}),(0,t.jsx)(n.td,{children:"Locks the screen"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"Super"})," + ",(0,t.jsx)(n.code,{children:"D"})]}),(0,t.jsx)(n.td,{children:"Shows the desktop"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"Print"})}),(0,t.jsx)(n.td,{children:"Opens the screenshot utility (Spectacle)"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"Super"})," + ",(0,t.jsx)(n.code,{children:"Print"})]}),(0,t.jsx)(n.td,{children:"Captures the active window"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"Super"})," + ",(0,t.jsx)(n.code,{children:"Shift"})," + ",(0,t.jsx)(n.code,{children:"Print"})]}),(0,t.jsx)(n.td,{children:"Captures a rectangular region of the screen"})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"using-krunner",children:"Using KRunner"}),"\n",(0,t.jsx)(n.p,{children:"KRunner is a system-wide desktop search and launcher app available on Solus Plasma. KRunner allows you to perform a variety of actions such as launching apps, executing commands, search files and open open system settings."}),"\n",(0,t.jsxs)(n.p,{children:["Open KRunner by pressing ",(0,t.jsx)(n.code,{children:"Alt"})," + ",(0,t.jsx)(n.code,{children:"F2"})," or ",(0,t.jsx)(n.code,{children:"Alt"})," + ",(0,t.jsx)(n.code,{children:"Space"}),"."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"KRunner interface",src:s(71242).Z+"",width:"723",height:"161"})}),"\n",(0,t.jsx)(n.p,{children:"The following table outlines the actions you can perform using KRunner."}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Action"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Open an application"}),(0,t.jsx)(n.td,{children:"Enter the name of the application, then select the application from the list."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Run a command"}),(0,t.jsxs)(n.td,{children:["Enter the command you want to run and press ",(0,t.jsx)(n.code,{children:"Enter"}),"."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"See the man pages of a command"}),(0,t.jsxs)(n.td,{children:["Add ",(0,t.jsx)(n.code,{children:"#"})," before a command name and press enter (Example, ",(0,t.jsx)(n.code,{children:"#wget"}),")."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Terminate a program"}),(0,t.jsxs)(n.td,{children:["Enter ",(0,t.jsx)(n.code,{children:"kill [application name]"})," and press ",(0,t.jsx)(n.code,{children:"Enter"})," (Example: ",(0,t.jsx)(n.code,{children:"kill firefox"}),")"]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Do math operations"}),(0,t.jsxs)(n.td,{children:["Enter ",(0,t.jsx)(n.code,{children:"="})," followed by the calculation you want to perform (Examples: ",(0,t.jsx)(n.code,{children:"=2*2"}),", ",(0,t.jsx)(n.code,{children:"=5!"}),", ",(0,t.jsx)(n.code,{children:"=sin(20)"}),")."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Unit conversions"}),(0,t.jsxs)(n.td,{children:["Enter ",(0,t.jsx)(n.code,{children:"[measurement] to [destination unit]"})," (Examples: ",(0,t.jsx)(n.code,{children:"200 mi to km"}),")."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Currency conversions"}),(0,t.jsxs)(n.td,{children:["Enter ",(0,t.jsx)(n.code,{children:"[amount] to [destination currency]"}),". You can use the ISO code or the name of the currencies to do the conversion (Examples: ",(0,t.jsx)(n.code,{children:"200 CAD to NOK"}),", ",(0,t.jsx)(n.code,{children:"50 koruna to yen"}),")."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Check the time of other countries or time zones"}),(0,t.jsxs)(n.td,{children:["Enter ",(0,t.jsx)(n.code,{children:"time [country]"})," or ",(0,t.jsx)(n.code,{children:"time [time zone]"})," (Examples: ",(0,t.jsx)(n.code,{children:"time finland"}),", ",(0,t.jsx)(n.code,{children:"time gmt-1"}),")."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Open files and folders"}),(0,t.jsx)(n.td,{children:"Enter the name of a file or folder, then select an entry from the list."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Switch between windows"}),(0,t.jsxs)(n.td,{children:["Enter the name of an open window and select an entry from the ",(0,t.jsx)(n.strong,{children:"Windows"})," list."]})]})]})]}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["To see a list of the currencies KRunner supports, see ",(0,t.jsx)(n.a,{href:"https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/index.en.html",children:"https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/index.en.html"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Unit and currency conversions do not require the ",(0,t.jsx)(n.code,{children:"="})," symbol."]}),"\n"]})}),"\n",(0,t.jsx)(n.h2,{id:"dolphin",children:"Dolphin"}),"\n",(0,t.jsx)(n.p,{children:"Dolphin is the file manager included by default in Solus Plasma. Dolphin has multiple features, including tabs, split views, integrated terminal, and support for various file formats and protocols."}),"\n",(0,t.jsx)(n.p,{children:"The following table describes some of the keyboard shortcuts you can use in Dolphin."}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Action"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Create a new folder"}),(0,t.jsxs)(n.td,{children:["Press ",(0,t.jsx)(n.code,{children:"F10"})," to create a new folder."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Enabling dual-pane mode"}),(0,t.jsxs)(n.td,{children:["Press ",(0,t.jsx)(n.code,{children:"F3"})," to enable dual-pane mode."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Open multiple tabs"}),(0,t.jsxs)(n.td,{children:["Press ",(0,t.jsx)(n.code,{children:"Ctrl"})," + ",(0,t.jsx)(n.code,{children:"T"})," to open multiple Dolphin tabs."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Open a terminal window in the current location"}),(0,t.jsxs)(n.td,{children:["Press ",(0,t.jsx)(n.code,{children:"Alt"})," + ",(0,t.jsx)(n.code,{children:"Shift"})," + ",(0,t.jsx)(n.code,{children:"F4"})," to open a terminal window in the location you have open."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Show/hide hidden files"}),(0,t.jsxs)(n.td,{children:["Press ",(0,t.jsx)(n.code,{children:"Ctrl"})," + ",(0,t.jsx)(n.code,{children:"H"})," to show/hide hidden files."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Show/hide the side panel"}),(0,t.jsxs)(n.td,{children:["Press ",(0,t.jsx)(n.code,{children:"F9"})," to show/hide the ",(0,t.jsx)(n.strong,{children:"Places"})," side panel."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Switch between the view modes"}),(0,t.jsxs)(n.td,{children:["Press ",(0,t.jsx)(n.code,{children:"Ctrl"})," + ",(0,t.jsx)(n.code,{children:"1"})," to display icons in ",(0,t.jsx)(n.em,{children:"icons"})," view, press ",(0,t.jsx)(n.code,{children:"Ctrl"})," + ",(0,t.jsx)(n.code,{children:"2"})," to display icons in ",(0,t.jsx)(n.em,{children:"compact"})," view, or press ",(0,t.jsx)(n.code,{children:"Ctrl"})," + ",(0,t.jsx)(n.code,{children:"3"})," to display icons in ",(0,t.jsx)(n.em,{children:"details"})," view;"]})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"context-menu",children:"Context menu"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.em,{children:"Plasma"})," desktop provides a variety of context menus. Context menus display options, settings, and actions applicable to the current context or element you select."]}),"\n",(0,t.jsx)(n.p,{children:"The following table describes some of the context menus available in Plasma."}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Context menu"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Bottom panel settings"}),(0,t.jsx)(n.td,{children:"Right-click on an empty space of the bottom panel to open the bottom panel context menu."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Widget settings"}),(0,t.jsx)(n.td,{children:"Right-click on any widget in the bottom panel to open the widget context menu."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Desktop settings"}),(0,t.jsx)(n.td,{children:"Right-click anywhere on the desktop to open the desktop context menu."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"File"}),(0,t.jsx)(n.td,{children:"Right-click a file to open the file context menu."})]})]})]})]})}function a(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},71242:(e,n,s)=>{s.d(n,{Z:()=>t});const t=s.p+"assets/images/krunner-03789ddf72481240bd795c70e63e2ab0.png"},11151:(e,n,s)=>{s.d(n,{Z:()=>c,a:()=>d});var t=s(67294);const i={},r=t.createContext(i);function d(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:d(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2b4abe09.3ece8fc5.js b/assets/js/2b4abe09.218c0bc6.js similarity index 99% rename from assets/js/2b4abe09.3ece8fc5.js rename to assets/js/2b4abe09.218c0bc6.js index ffd5a7260..76c025ebf 100644 --- a/assets/js/2b4abe09.3ece8fc5.js +++ b/assets/js/2b4abe09.218c0bc6.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2413],{45427:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>h});var s=t(85893),n=t(11151);const i={title:"Troubleshooting",summary:"Basic troubleshooting for some of the most common Solus problems."},r="Troubleshooting Common Issues",a={id:"user/troubleshooting/index",title:"Troubleshooting",description:"This guide provides some basic troubleshooting instructions for when you have an issue in Solus. Before reporting bugs, it is important to check that your Solus installation is not missing files, or suffering from a corrupted disk. You should also ensure your system is fully up to date as the bug may have already been fixed.",source:"@site/docs/user/troubleshooting/index.md",sourceDirName:"user/troubleshooting",slug:"/user/troubleshooting/",permalink:"/docs/user/troubleshooting/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/troubleshooting/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Troubleshooting",summary:"Basic troubleshooting for some of the most common Solus problems."},sidebar:"userSidebar",previous:{title:"Open Broadcaster Software (OBS)",permalink:"/docs/user/software/web/obs"},next:{title:"Boot Rescue",permalink:"/docs/user/troubleshooting/boot-rescue"}},l={},h=[{value:"Issues with Software Center or eopkg",id:"issues-with-software-center-or-eopkg",level:2},{value:"Can't install updates",id:"cant-install-updates",level:3},{value:"eopkg check shows broken packages",id:"eopkg-check-shows-broken-packages",level:3},{value:"Updated system and having issues",id:"updated-system-and-having-issues",level:2},{value:"Broken UI with Chromium applications",id:"broken-ui-with-chromium-applications",level:3},{value:"Boot into previous kernel",id:"boot-into-previous-kernel",level:3},{value:"Reverting updates",id:"reverting-updates",level:3},{value:"Boot failure",id:"boot-failure",level:2},{value:"Display manager won't start",id:"display-manager-wont-start",level:3},{value:"No Solus boot loader",id:"no-solus-boot-loader",level:3},{value:"Long boot time",id:"long-boot-time",level:2},{value:"Timeout on partition mount (90s)",id:"timeout-on-partition-mount-90s",level:3}];function c(e){const o={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.header,{children:(0,s.jsx)(o.h1,{id:"troubleshooting-common-issues",children:"Troubleshooting Common Issues"})}),"\n",(0,s.jsx)(o.p,{children:"This guide provides some basic troubleshooting instructions for when you have an issue in Solus. Before reporting bugs, it is important to check that your Solus installation is not missing files, or suffering from a corrupted disk. You should also ensure your system is fully up to date as the bug may have already been fixed."}),"\n",(0,s.jsxs)(o.p,{children:["First, perform a full system update on command line with ",(0,s.jsx)(o.code,{children:"sudo eopkg up"})," (or using the Software Center)."]}),"\n",(0,s.jsx)(o.p,{children:"Next, validate that packages are installed correctly and aren't missing files. Run this once, it will take some time. If there are no broken packages on your system, there will be no output. Otherwise, you will see packages be reinstalled."}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"sudo eopkg check | grep Broken | awk '{print $4}' | xargs -r sudo eopkg it --reinstall\n"})}),"\n",(0,s.jsx)(o.p,{children:"Reboot the system and see if the issue is resolved."}),"\n",(0,s.jsx)(o.h2,{id:"issues-with-software-center-or-eopkg",children:"Issues with Software Center or eopkg"}),"\n",(0,s.jsx)(o.h3,{id:"cant-install-updates",children:"Can't install updates"}),"\n",(0,s.jsx)(o.p,{children:"If eopkg is interrupted, the database may become corrupted. When updating you will see a message similar to:"}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsx)(o.code,{children:"30973, 'BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery - BDB0061 PANIC: Invalid argument'"})}),"\n",(0,s.jsxs)(o.p,{children:["To run database recovery, run ",(0,s.jsx)(o.code,{children:"sudo eopkg rdb"})," in the terminal and then updates should function correctly."]}),"\n",(0,s.jsxs)(o.h3,{id:"eopkg-check-shows-broken-packages",children:[(0,s.jsx)(o.code,{children:"eopkg check"})," shows broken packages"]}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.code,{children:"eopkg check"})," checks the sha256 checksums of files on disk versus what was originally installed by the original ",(0,s.jsx)(o.code,{children:".eopkg"})," file. In some cases (for example ",(0,s.jsx)(o.code,{children:".pyc"})," files), these files will be modified in the normal operation of Solus. If after reinstalling a package it remains broken, then it's likely nothing to worry about (there are no exceptions made in ",(0,s.jsx)(o.code,{children:"eopkg check"})," for files that are expected to change from use). When reinstalling broken packages, (per above) it only needs to be run once."]}),"\n",(0,s.jsx)(o.h2,{id:"updated-system-and-having-issues",children:"Updated system and having issues"}),"\n",(0,s.jsx)(o.h3,{id:"broken-ui-with-chromium-applications",children:"Broken UI with Chromium applications"}),"\n",(0,s.jsxs)(o.p,{children:["There is an ",(0,s.jsx)(o.a,{href:"https://issues.chromium.org/issues/40267041",children:"upstream bug"})," with Chromium that causes it to try to use an invalid shader cache instead of rebuilding it, crashing the GPU process. The issue is now fixed in Chromium, but it may take some time for applications to update their Chromium version."]}),"\n",(0,s.jsx)(o.p,{children:"To fix applications exhibiting this problem, run these commands to remove the shader cache:"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"find ~/.cache -name GPUCache -exec rm -rv {} +\nfind ~/.config -name GPUCache -exec rm -rv {} +\n"})}),"\n",(0,s.jsx)(o.p,{children:"And restart the application."}),"\n",(0,s.jsx)(o.h3,{id:"boot-into-previous-kernel",children:"Boot into previous kernel"}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.code,{children:"clr-boot-manager"})," by default retains the latest installed kernel, plus the currently running kernel. This means that when you receive a kernel update, there are two kernels to boot into. Sometimes there are regressions that occur in the kernel, so you are able to boot into the previous kernel if the update has caused any hardware issues (for example failing to suspend when it worked previously). When booting via EFI, the boot menu can be shown by hitting space (repeatedly) during boot."]}),"\n",(0,s.jsx)(o.h3,{id:"reverting-updates",children:"Reverting updates"}),"\n",(0,s.jsxs)(o.p,{children:["If booting into the previous kernel doesn't solve the issue, there may be an issue with the package updates. It is possible to ",(0,s.jsx)(o.a,{href:"/docs/user/package-management/history-and-rollback",children:"revert the updates"})," (this would also confirm that the issue is in the selected updates)."]}),"\n",(0,s.jsx)(o.h2,{id:"boot-failure",children:"Boot failure"}),"\n",(0,s.jsxs)(o.p,{children:["If Solus partially boots, you can generally get to a TTY using ",(0,s.jsx)(o.code,{children:"Ctrl+Alt+F2"})," to login and be able to run commands just like using a terminal. This enables you to run some commands to identify or resolve the issue."]}),"\n",(0,s.jsx)(o.h3,{id:"display-manager-wont-start",children:"Display manager won't start"}),"\n",(0,s.jsx)(o.p,{children:"A common cause of not being able to boot is due to installing the NVIDIA drivers, but not booting into the latest kernel (the only kernel which has the drivers installed). Also ensure you have the correct driver version installed for your kernel. You can check if you have booted into the latest kernel by comparing the installed package with the booted kernel (instructions for both kernels)"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"eopkg info linux-lts | head -n2; uname -a\n"})}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"eopkg info linux-current | head -n2; uname -a\n"})}),"\n",(0,s.jsx)(o.p,{children:"If the kernel version and release don't match from lines 2 and 3 of the output, then you aren't booting into the latest kernel and this is the likely cause of X not loading (particularly if you just installed the drivers). A couple of common reasons are:"}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["On a GRUB machine, a common cause for not booting the latest kernel is due to Solus not being the boot loader on the MBR. Make sure you are booting via the Solus boot loader (if possible), or update GRUB on the distro that own the boot loader, see ",(0,s.jsx)(o.a,{href:"/docs/user/troubleshooting/installation#legacybios-installation",children:"Legacy/BIOS installation"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Another possibility is that the ",(0,s.jsx)(o.code,{children:"ESP"})," has run out of space so the kernel cannot be copied over to it. You can debug why this isn't happening via ",(0,s.jsx)(o.code,{children:"sudo CBM_DEBUG=1 clr-boot-manager update"}),". This will output all information on the process, where it may be failing, or that it is working correctly."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(o.p,{children:["If these two steps fail, you can't revert the installation of the drivers via ",(0,s.jsx)(o.a,{href:"/docs/user/package-management/history-and-rollback",children:"History and Rollback"})]}),"\n",(0,s.jsx)(o.h3,{id:"no-solus-boot-loader",children:"No Solus boot loader"}),"\n",(0,s.jsxs)(o.p,{children:["If the Solus boot loader is not functioning (this has been known to be broken by the odd update of a certain OS), the boot loader can be recreated via ",(0,s.jsx)(o.a,{href:"/docs/user/troubleshooting/boot-rescue",children:"Boot Rescue"})]}),"\n",(0,s.jsx)(o.h2,{id:"long-boot-time",children:"Long boot time"}),"\n",(0,s.jsx)(o.p,{children:"There are a number of factors that can contribute to a long boot time. The boot up messages can be viewed to look for any timeouts by looking at the timestamped journal."}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"sudo journalctl -b\n"})}),"\n",(0,s.jsxs)(o.p,{children:["Notable commands to check the boot time are: ",(0,s.jsx)(o.code,{children:"systemd-analyze"})," (note that the firmware time is prior to Solus boot, so outside of our control) and ",(0,s.jsx)(o.code,{children:"systemd-analyze critical-chain"}),"."]}),"\n",(0,s.jsx)(o.h3,{id:"timeout-on-partition-mount-90s",children:"Timeout on partition mount (90s)"}),"\n",(0,s.jsxs)(o.p,{children:["If information about a device changes (UUID or mount path ",(0,s.jsx)(o.code,{children:"/dev/sda"}),"), this can cause ",(0,s.jsx)(o.code,{children:"systemd"})," to time out for 90 seconds creating a long boot process. Most frequently this happens with the swap file which can be shared across distros. Most of the devices mounted on boot will appear in ",(0,s.jsx)(o.code,{children:"/etc/fstab"})," or be a parameter in a file where configuring resume ",(0,s.jsx)(o.code,{children:"cat /etc/kernel/cmdline.d/*"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.code,{children:"cat /proc/cmdline"})," will show what parameters the kernel has booted with."]}),"\n",(0,s.jsxs)(o.p,{children:["If the devices don't match up with what's listed in ",(0,s.jsx)(o.code,{children:"ls /dev/disk/*/*"})," then it will cause a 90s timeout while it waits to see if it can be found. To fix this, you will need to remove the reference to the UUID or device path that no longer exists, or correct it to the new UUID label."]})]})}function d(e={}){const{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,o,t)=>{t.d(o,{Z:()=>a,a:()=>r});var s=t(67294);const n={},i=s.createContext(n);function r(e){const o=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2413],{45427:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>h});var s=t(85893),n=t(11151);const i={title:"Troubleshooting",summary:"Basic troubleshooting for some of the most common Solus problems."},r="Troubleshooting Common Issues",a={id:"user/troubleshooting/index",title:"Troubleshooting",description:"This guide provides some basic troubleshooting instructions for when you have an issue in Solus. Before reporting bugs, it is important to check that your Solus installation is not missing files, or suffering from a corrupted disk. You should also ensure your system is fully up to date as the bug may have already been fixed.",source:"@site/docs/user/troubleshooting/index.md",sourceDirName:"user/troubleshooting",slug:"/user/troubleshooting/",permalink:"/docs/user/troubleshooting/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/troubleshooting/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Troubleshooting",summary:"Basic troubleshooting for some of the most common Solus problems."},sidebar:"userSidebar",previous:{title:"Open Broadcaster Software (OBS)",permalink:"/docs/user/software/web/obs"},next:{title:"Boot Rescue",permalink:"/docs/user/troubleshooting/boot-rescue"}},l={},h=[{value:"Issues with Software Center or eopkg",id:"issues-with-software-center-or-eopkg",level:2},{value:"Can't install updates",id:"cant-install-updates",level:3},{value:"eopkg check shows broken packages",id:"eopkg-check-shows-broken-packages",level:3},{value:"Updated system and having issues",id:"updated-system-and-having-issues",level:2},{value:"Broken UI with Chromium applications",id:"broken-ui-with-chromium-applications",level:3},{value:"Boot into previous kernel",id:"boot-into-previous-kernel",level:3},{value:"Reverting updates",id:"reverting-updates",level:3},{value:"Boot failure",id:"boot-failure",level:2},{value:"Display manager won't start",id:"display-manager-wont-start",level:3},{value:"No Solus boot loader",id:"no-solus-boot-loader",level:3},{value:"Long boot time",id:"long-boot-time",level:2},{value:"Timeout on partition mount (90s)",id:"timeout-on-partition-mount-90s",level:3}];function c(e){const o={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.header,{children:(0,s.jsx)(o.h1,{id:"troubleshooting-common-issues",children:"Troubleshooting Common Issues"})}),"\n",(0,s.jsx)(o.p,{children:"This guide provides some basic troubleshooting instructions for when you have an issue in Solus. Before reporting bugs, it is important to check that your Solus installation is not missing files, or suffering from a corrupted disk. You should also ensure your system is fully up to date as the bug may have already been fixed."}),"\n",(0,s.jsxs)(o.p,{children:["First, perform a full system update on command line with ",(0,s.jsx)(o.code,{children:"sudo eopkg up"})," (or using the Software Center)."]}),"\n",(0,s.jsx)(o.p,{children:"Next, validate that packages are installed correctly and aren't missing files. Run this once, it will take some time. If there are no broken packages on your system, there will be no output. Otherwise, you will see packages be reinstalled."}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"sudo eopkg check | grep Broken | awk '{print $4}' | xargs -r sudo eopkg it --reinstall\n"})}),"\n",(0,s.jsx)(o.p,{children:"Reboot the system and see if the issue is resolved."}),"\n",(0,s.jsx)(o.h2,{id:"issues-with-software-center-or-eopkg",children:"Issues with Software Center or eopkg"}),"\n",(0,s.jsx)(o.h3,{id:"cant-install-updates",children:"Can't install updates"}),"\n",(0,s.jsx)(o.p,{children:"If eopkg is interrupted, the database may become corrupted. When updating you will see a message similar to:"}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsx)(o.code,{children:"30973, 'BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery - BDB0061 PANIC: Invalid argument'"})}),"\n",(0,s.jsxs)(o.p,{children:["To run database recovery, run ",(0,s.jsx)(o.code,{children:"sudo eopkg rdb"})," in the terminal and then updates should function correctly."]}),"\n",(0,s.jsxs)(o.h3,{id:"eopkg-check-shows-broken-packages",children:[(0,s.jsx)(o.code,{children:"eopkg check"})," shows broken packages"]}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.code,{children:"eopkg check"})," checks the sha256 checksums of files on disk versus what was originally installed by the original ",(0,s.jsx)(o.code,{children:".eopkg"})," file. In some cases (for example ",(0,s.jsx)(o.code,{children:".pyc"})," files), these files will be modified in the normal operation of Solus. If after reinstalling a package it remains broken, then it's likely nothing to worry about (there are no exceptions made in ",(0,s.jsx)(o.code,{children:"eopkg check"})," for files that are expected to change from use). When reinstalling broken packages, (per above) it only needs to be run once."]}),"\n",(0,s.jsx)(o.h2,{id:"updated-system-and-having-issues",children:"Updated system and having issues"}),"\n",(0,s.jsx)(o.h3,{id:"broken-ui-with-chromium-applications",children:"Broken UI with Chromium applications"}),"\n",(0,s.jsxs)(o.p,{children:["There is an ",(0,s.jsx)(o.a,{href:"https://issues.chromium.org/issues/40267041",children:"upstream bug"})," with Chromium that causes it to try to use an invalid shader cache instead of rebuilding it, crashing the GPU process. The issue is now fixed in Chromium, but it may take some time for applications to update their Chromium version."]}),"\n",(0,s.jsx)(o.p,{children:"To fix applications exhibiting this problem, run these commands to remove the shader cache:"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"find ~/.cache -name GPUCache -exec rm -rv {} +\nfind ~/.config -name GPUCache -exec rm -rv {} +\n"})}),"\n",(0,s.jsx)(o.p,{children:"And restart the application."}),"\n",(0,s.jsx)(o.h3,{id:"boot-into-previous-kernel",children:"Boot into previous kernel"}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.code,{children:"clr-boot-manager"})," by default retains the latest installed kernel, plus the currently running kernel. This means that when you receive a kernel update, there are two kernels to boot into. Sometimes there are regressions that occur in the kernel, so you are able to boot into the previous kernel if the update has caused any hardware issues (for example failing to suspend when it worked previously). When booting via EFI, the boot menu can be shown by hitting space (repeatedly) during boot."]}),"\n",(0,s.jsx)(o.h3,{id:"reverting-updates",children:"Reverting updates"}),"\n",(0,s.jsxs)(o.p,{children:["If booting into the previous kernel doesn't solve the issue, there may be an issue with the package updates. It is possible to ",(0,s.jsx)(o.a,{href:"/docs/user/package-management/history-and-rollback",children:"revert the updates"})," (this would also confirm that the issue is in the selected updates)."]}),"\n",(0,s.jsx)(o.h2,{id:"boot-failure",children:"Boot failure"}),"\n",(0,s.jsxs)(o.p,{children:["If Solus partially boots, you can generally get to a TTY using ",(0,s.jsx)(o.code,{children:"Ctrl+Alt+F2"})," to login and be able to run commands just like using a terminal. This enables you to run some commands to identify or resolve the issue."]}),"\n",(0,s.jsx)(o.h3,{id:"display-manager-wont-start",children:"Display manager won't start"}),"\n",(0,s.jsx)(o.p,{children:"A common cause of not being able to boot is due to installing the NVIDIA drivers, but not booting into the latest kernel (the only kernel which has the drivers installed). Also ensure you have the correct driver version installed for your kernel. You can check if you have booted into the latest kernel by comparing the installed package with the booted kernel (instructions for both kernels)"}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"eopkg info linux-lts | head -n2; uname -a\n"})}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"eopkg info linux-current | head -n2; uname -a\n"})}),"\n",(0,s.jsx)(o.p,{children:"If the kernel version and release don't match from lines 2 and 3 of the output, then you aren't booting into the latest kernel and this is the likely cause of X not loading (particularly if you just installed the drivers). A couple of common reasons are:"}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["On a GRUB machine, a common cause for not booting the latest kernel is due to Solus not being the boot loader on the MBR. Make sure you are booting via the Solus boot loader (if possible), or update GRUB on the distro that own the boot loader, see ",(0,s.jsx)(o.a,{href:"/docs/user/troubleshooting/installation#legacybios-installation",children:"Legacy/BIOS installation"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Another possibility is that the ",(0,s.jsx)(o.code,{children:"ESP"})," has run out of space so the kernel cannot be copied over to it. You can debug why this isn't happening via ",(0,s.jsx)(o.code,{children:"sudo CBM_DEBUG=1 clr-boot-manager update"}),". This will output all information on the process, where it may be failing, or that it is working correctly."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(o.p,{children:["If these two steps fail, you can't revert the installation of the drivers via ",(0,s.jsx)(o.a,{href:"/docs/user/package-management/history-and-rollback",children:"History and Rollback"})]}),"\n",(0,s.jsx)(o.h3,{id:"no-solus-boot-loader",children:"No Solus boot loader"}),"\n",(0,s.jsxs)(o.p,{children:["If the Solus boot loader is not functioning (this has been known to be broken by the odd update of a certain OS), the boot loader can be recreated via ",(0,s.jsx)(o.a,{href:"/docs/user/troubleshooting/boot-rescue",children:"Boot Rescue"})]}),"\n",(0,s.jsx)(o.h2,{id:"long-boot-time",children:"Long boot time"}),"\n",(0,s.jsx)(o.p,{children:"There are a number of factors that can contribute to a long boot time. The boot up messages can be viewed to look for any timeouts by looking at the timestamped journal."}),"\n",(0,s.jsx)(o.pre,{children:(0,s.jsx)(o.code,{className:"language-bash",children:"sudo journalctl -b\n"})}),"\n",(0,s.jsxs)(o.p,{children:["Notable commands to check the boot time are: ",(0,s.jsx)(o.code,{children:"systemd-analyze"})," (note that the firmware time is prior to Solus boot, so outside of our control) and ",(0,s.jsx)(o.code,{children:"systemd-analyze critical-chain"}),"."]}),"\n",(0,s.jsx)(o.h3,{id:"timeout-on-partition-mount-90s",children:"Timeout on partition mount (90s)"}),"\n",(0,s.jsxs)(o.p,{children:["If information about a device changes (UUID or mount path ",(0,s.jsx)(o.code,{children:"/dev/sda"}),"), this can cause ",(0,s.jsx)(o.code,{children:"systemd"})," to time out for 90 seconds creating a long boot process. Most frequently this happens with the swap file which can be shared across distros. Most of the devices mounted on boot will appear in ",(0,s.jsx)(o.code,{children:"/etc/fstab"})," or be a parameter in a file where configuring resume ",(0,s.jsx)(o.code,{children:"cat /etc/kernel/cmdline.d/*"}),"."]}),"\n",(0,s.jsxs)(o.p,{children:[(0,s.jsx)(o.code,{children:"cat /proc/cmdline"})," will show what parameters the kernel has booted with."]}),"\n",(0,s.jsxs)(o.p,{children:["If the devices don't match up with what's listed in ",(0,s.jsx)(o.code,{children:"ls /dev/disk/*/*"})," then it will cause a 90s timeout while it waits to see if it can be found. To fix this, you will need to remove the reference to the UUID or device path that no longer exists, or correct it to the new UUID label."]})]})}function d(e={}){const{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,o,t)=>{t.d(o,{Z:()=>a,a:()=>r});var s=t(67294);const n={},i=s.createContext(n);function r(e){const o=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),s.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2b61a93c.cf6aa1b4.js b/assets/js/2b61a93c.c529ff35.js similarity index 96% rename from assets/js/2b61a93c.cf6aa1b4.js rename to assets/js/2b61a93c.c529ff35.js index 0e893135d..8619d833c 100644 --- a/assets/js/2b61a93c.cf6aa1b4.js +++ b/assets/js/2b61a93c.c529ff35.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9897],{23065:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>d,toc:()=>c});var i=n(85893),s=n(11151);const o={title:"MATE",summary:"A quick introduction to the MATE Edition of Solus"},r="MATE Desktop",d={id:"user/editions/mate/index",title:"MATE",description:"The MATE Edition is deprecated. XFCE has been included to replace it. See the Solus 4.4 blog post here",source:"@site/docs/user/editions/mate/index.md",sourceDirName:"user/editions/mate",slug:"/user/editions/mate/",permalink:"/docs/user/editions/mate/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/mate/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"MATE",summary:"A quick introduction to the MATE Edition of Solus"},sidebar:"userSidebar",previous:{title:"Tips and Tricks",permalink:"/docs/user/editions/gnome/tips-and-tricks"},next:{title:"Configuration",permalink:"/docs/user/editions/mate/configuration"}},a={},c=[];function l(e){const t={a:"a",admonition:"admonition",blockquote:"blockquote",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"mate-desktop",children:"MATE Desktop"})}),"\n",(0,i.jsx)(t.admonition,{type:"caution",children:(0,i.jsxs)(t.p,{children:["The MATE Edition is deprecated. XFCE has been included to replace it. See the Solus 4.4 blog post ",(0,i.jsx)(t.a,{href:"https://getsol.us/2023/07/08/solus-4-4-released/",children:"here"})]})}),"\n",(0,i.jsx)(t.p,{children:"MATE Desktop is provided by the MATE Edition of Solus. They describe it as:"}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"The MATE Desktop Environment is the continuation of GNOME 2. It provides an intuitive and attractive desktop environment using traditional metaphors for Linux and other Unix-like operating\xa0systems."}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Here are some links related to this project that you may find helpful:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://mate-desktop.org/",children:"Homepage"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://mate-desktop.org/blog/",children:"News"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://mate-desktop.org/community/",children:"Support"})}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.a,{href:"configuration",children:"Go to MATE Configuration"})}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.a,{href:"tips-and-tricks",children:"Go to MATE Tips and Tricks"})})]})}function u(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>r});var i=n(67294);const s={},o=i.createContext(s);function r(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9897],{23065:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>d,toc:()=>c});var i=n(85893),s=n(11151);const o={title:"MATE",summary:"A quick introduction to the MATE Edition of Solus"},r="MATE Desktop",d={id:"user/editions/mate/index",title:"MATE",description:"The MATE Edition is deprecated. XFCE has been included to replace it. See the Solus 4.4 blog post here",source:"@site/docs/user/editions/mate/index.md",sourceDirName:"user/editions/mate",slug:"/user/editions/mate/",permalink:"/docs/user/editions/mate/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/mate/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"MATE",summary:"A quick introduction to the MATE Edition of Solus"},sidebar:"userSidebar",previous:{title:"Tips and Tricks",permalink:"/docs/user/editions/gnome/tips-and-tricks"},next:{title:"Configuration",permalink:"/docs/user/editions/mate/configuration"}},a={},c=[];function l(e){const t={a:"a",admonition:"admonition",blockquote:"blockquote",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"mate-desktop",children:"MATE Desktop"})}),"\n",(0,i.jsx)(t.admonition,{type:"caution",children:(0,i.jsxs)(t.p,{children:["The MATE Edition is deprecated. XFCE has been included to replace it. See the Solus 4.4 blog post ",(0,i.jsx)(t.a,{href:"https://getsol.us/2023/07/08/solus-4-4-released/",children:"here"})]})}),"\n",(0,i.jsx)(t.p,{children:"MATE Desktop is provided by the MATE Edition of Solus. They describe it as:"}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"The MATE Desktop Environment is the continuation of GNOME 2. It provides an intuitive and attractive desktop environment using traditional metaphors for Linux and other Unix-like operating\xa0systems."}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Here are some links related to this project that you may find helpful:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://mate-desktop.org/",children:"Homepage"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://mate-desktop.org/blog/",children:"News"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"https://mate-desktop.org/community/",children:"Support"})}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.a,{href:"configuration",children:"Go to MATE Configuration"})}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.a,{href:"tips-and-tricks",children:"Go to MATE Tips and Tricks"})})]})}function u(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>r});var i=n(67294);const s={},o=i.createContext(s);function r(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2c3e84bd.d8e1bbcf.js b/assets/js/2c3e84bd.cc61acc1.js similarity index 98% rename from assets/js/2c3e84bd.d8e1bbcf.js rename to assets/js/2c3e84bd.cc61acc1.js index 3f351b7ff..e49dd582d 100644 --- a/assets/js/2c3e84bd.d8e1bbcf.js +++ b/assets/js/2c3e84bd.cc61acc1.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8157],{12359:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var n=i(85893),s=i(11151);const o={title:"Disk Partitioning",summary:"Overview of the partitioning that the installer can perform"},r="Disk Partitioning",a={id:"user/quick-start/installation/disks",title:"Disk Partitioning",description:"Solus provides multiple ways you can install onto your system.",source:"@site/docs/user/quick-start/installation/disks.md",sourceDirName:"user/quick-start/installation",slug:"/user/quick-start/installation/disks",permalink:"/docs/user/quick-start/installation/disks",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/installation/disks.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Disk Partitioning",summary:"Overview of the partitioning that the installer can perform"},sidebar:"userSidebar",previous:{title:"Preparing to Install",permalink:"/docs/user/quick-start/installation/"},next:{title:"Booting with Secure Boot Enabled",permalink:"/docs/user/quick-start/installation/secure-boot"}},l={},c=[{value:"UEFI",id:"uefi",level:2}];function u(e){const t={br:"br",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"disk-partitioning",children:"Disk Partitioning"})}),"\n",(0,n.jsx)(t.p,{children:"Solus provides multiple ways you can install onto your system."}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Whole Drive"}),(0,n.jsx)(t.br,{}),"\n","Solus can take up the entire drive, using traditional root partitions, or with LVM-managed root partitions."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Multi-boot"}),(0,n.jsx)(t.br,{}),"\n","You can install Solus next to your existing operating system, such as Windows. ",(0,n.jsx)(t.em,{children:"If you have multiple operating systems installed, we will choose the largest option."})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Manual Partitioning"}),(0,n.jsx)(t.br,{}),"\n","You can manually configure your system. This is only recommend for advanced users which may desire to have a dedicated ",(0,n.jsx)(t.code,{children:"/home"})," partition. Note that if you manually configure your system, you will need to restart the Installer for those changes to apply appropriately.\n",(0,n.jsx)(t.strong,{children:"Note:"})," Legacy (BIOS) must use MBR partition table while Unified EFI (UEFI) must use GPT partition table."]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Alongside these options, we also provide the ability to use full-disk encryption. For the obvious reason of it being full-disk, this assumes you are installing Solus onto the entire drive."}),"\n",(0,n.jsx)(t.h2,{id:"uefi",children:"UEFI"}),"\n",(0,n.jsx)(t.p,{children:"If you are using a system with UEFI, you may need to create an EFI System Partition, also referred to as an ESP. This is not necessary if you are enabling Solus to install onto the entire disk."}),"\n",(0,n.jsxs)(t.p,{children:["To create an EFI System Partition, open up GParted and create a FAT32 partition that is 1\xa0GB in size. Next, right-click on the partition and click Manage Flags. On the Manage Flags section, enable the ",(0,n.jsx)(t.code,{children:"boot"})," and ",(0,n.jsx)(t.code,{children:"esp"})," flags."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Notes:"})}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:'Your system must be booted using Unified EFI (UEFI) mode, as opposed to a "legacy (BIOS) mode".'}),"\n",(0,n.jsx)(t.li,{children:"Your disk is required to be GPT formatted."}),"\n",(0,n.jsx)(t.li,{children:"If you cannot see your SSD drive, set the SATA configuration to AHCI."}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},11151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>r});var n=i(67294);const s={},o=n.createContext(s);function r(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8157],{12359:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var n=i(85893),s=i(11151);const o={title:"Disk Partitioning",summary:"Overview of the partitioning that the installer can perform"},r="Disk Partitioning",a={id:"user/quick-start/installation/disks",title:"Disk Partitioning",description:"Solus provides multiple ways you can install onto your system.",source:"@site/docs/user/quick-start/installation/disks.md",sourceDirName:"user/quick-start/installation",slug:"/user/quick-start/installation/disks",permalink:"/docs/user/quick-start/installation/disks",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/installation/disks.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Disk Partitioning",summary:"Overview of the partitioning that the installer can perform"},sidebar:"userSidebar",previous:{title:"Preparing to Install",permalink:"/docs/user/quick-start/installation/"},next:{title:"Booting with Secure Boot Enabled",permalink:"/docs/user/quick-start/installation/secure-boot"}},l={},c=[{value:"UEFI",id:"uefi",level:2}];function u(e){const t={br:"br",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"disk-partitioning",children:"Disk Partitioning"})}),"\n",(0,n.jsx)(t.p,{children:"Solus provides multiple ways you can install onto your system."}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Whole Drive"}),(0,n.jsx)(t.br,{}),"\n","Solus can take up the entire drive, using traditional root partitions, or with LVM-managed root partitions."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Multi-boot"}),(0,n.jsx)(t.br,{}),"\n","You can install Solus next to your existing operating system, such as Windows. ",(0,n.jsx)(t.em,{children:"If you have multiple operating systems installed, we will choose the largest option."})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Manual Partitioning"}),(0,n.jsx)(t.br,{}),"\n","You can manually configure your system. This is only recommend for advanced users which may desire to have a dedicated ",(0,n.jsx)(t.code,{children:"/home"})," partition. Note that if you manually configure your system, you will need to restart the Installer for those changes to apply appropriately.\n",(0,n.jsx)(t.strong,{children:"Note:"})," Legacy (BIOS) must use MBR partition table while Unified EFI (UEFI) must use GPT partition table."]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Alongside these options, we also provide the ability to use full-disk encryption. For the obvious reason of it being full-disk, this assumes you are installing Solus onto the entire drive."}),"\n",(0,n.jsx)(t.h2,{id:"uefi",children:"UEFI"}),"\n",(0,n.jsx)(t.p,{children:"If you are using a system with UEFI, you may need to create an EFI System Partition, also referred to as an ESP. This is not necessary if you are enabling Solus to install onto the entire disk."}),"\n",(0,n.jsxs)(t.p,{children:["To create an EFI System Partition, open up GParted and create a FAT32 partition that is 1\xa0GB in size. Next, right-click on the partition and click Manage Flags. On the Manage Flags section, enable the ",(0,n.jsx)(t.code,{children:"boot"})," and ",(0,n.jsx)(t.code,{children:"esp"})," flags."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Notes:"})}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:'Your system must be booted using Unified EFI (UEFI) mode, as opposed to a "legacy (BIOS) mode".'}),"\n",(0,n.jsx)(t.li,{children:"Your disk is required to be GPT formatted."}),"\n",(0,n.jsx)(t.li,{children:"If you cannot see your SSD drive, set the SATA configuration to AHCI."}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},11151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>r});var n=i(67294);const s={},o=n.createContext(s);function r(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/38920c38.c3bb4798.js b/assets/js/38920c38.aa4aa254.js similarity index 99% rename from assets/js/38920c38.c3bb4798.js rename to assets/js/38920c38.aa4aa254.js index 4f8fde502..e7fdbf712 100644 --- a/assets/js/38920c38.c3bb4798.js +++ b/assets/js/38920c38.aa4aa254.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[5481],{50:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>d,contentTitle:()=>l,default:()=>c,frontMatter:()=>i,metadata:()=>o,toc:()=>h});var s=n(85893),t=n(11151);const i={title:"Printers and Scanners",summary:"Guide to using printers and scanners on Solus"},l="Printers and Scanners",o={id:"user/hardware/peripherals/printers-and-scanners",title:"Printers and Scanners",description:"Drivers",source:"@site/docs/user/hardware/peripherals/printers-and-scanners.md",sourceDirName:"user/hardware/peripherals",slug:"/user/hardware/peripherals/printers-and-scanners",permalink:"/docs/user/hardware/peripherals/printers-and-scanners",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/peripherals/printers-and-scanners.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Printers and Scanners",summary:"Guide to using printers and scanners on Solus"},sidebar:"userSidebar",previous:{title:"MIDI Keyboards",permalink:"/docs/user/hardware/peripherals/midi-keyboard"},next:{title:"Package Management",permalink:"/docs/category/package-management"}},d={},h=[{value:"Drivers",id:"drivers",level:2},{value:"Brother",id:"brother",level:3},{value:"Compatibility",id:"compatibility",level:2},{value:"Brother",id:"brother-1",level:3},{value:"Brother",id:"brother-2",level:2},{value:"Network scanner",id:"network-scanner",level:3}];function a(e){const r={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(r.header,{children:(0,s.jsx)(r.h1,{id:"printers-and-scanners",children:"Printers and Scanners"})}),"\n",(0,s.jsx)(r.h1,{id:"printers",children:"Printers"}),"\n",(0,s.jsx)(r.h2,{id:"drivers",children:"Drivers"}),"\n",(0,s.jsx)(r.p,{children:"Many printers will work out-of the box on Solus. If yours doesn't, you should try installing additional drivers."}),"\n",(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Brand"}),(0,s.jsx)(r.th,{children:"Driver Package(s)"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Canon"}),(0,s.jsx)(r.td,{children:"canon-ufriilt-common"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Dymo"}),(0,s.jsx)(r.td,{children:"dymo-cups-driver"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Epson"}),(0,s.jsx)(r.td,{children:"epson-inkjet-printer-escpr"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"HP"}),(0,s.jsx)(r.td,{children:"hplip"})]})]})]}),"\n",(0,s.jsx)(r.h3,{id:"brother",children:"Brother"}),"\n",(0,s.jsxs)(r.p,{children:["The Solus repositories include ",(0,s.jsx)(r.code,{children:"brlaser"}),", an open-source driver for many Brother monochrome laser printers and multi-function devices. Compatible models are listed ",(0,s.jsx)(r.a,{href:"https://github.com/Owl-Maintain/brlaser#supported-printers",children:"here"})]}),"\n",(0,s.jsx)(r.p,{children:"Other Brother drivers are distributed by Brother for a single printer only. Because of this, you will need to install the package for your specific printer."}),"\n",(0,s.jsxs)(r.p,{children:["For example, ",(0,s.jsx)(r.code,{children:"brother-mfc1910w"})," provides drivers for the MFC-1910w."]}),"\n",(0,s.jsx)(r.h2,{id:"compatibility",children:"Compatibility"}),"\n",(0,s.jsx)(r.p,{children:"The following printers have been tested and/or suggested to function correctly by our users."}),"\n",(0,s.jsxs)(r.p,{children:["This list should not suggest that ",(0,s.jsx)(r.em,{children:"only"})," such devices listed below are compatible with Solus, as there may be devices not listed below that are in fact compatible."]}),"\n",(0,s.jsx)(r.h3,{id:"brother-1",children:"Brother"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:"Brother DCP-135C"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-1510"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-1512"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-1610W"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-7010"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-7060D"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-L2520DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-1210W"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-1212W"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-2220"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-L2315DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-L2320D"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-L2360D"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-L2375DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-1910W"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-440CN"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-9130CW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-9330CDW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-J220"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-J480DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-L2700DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-L2703DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-L2740DW"}),"\n"]}),"\n",(0,s.jsxs)(r.p,{children:["Should your printer not be on this list, and the generic ",(0,s.jsx)(r.code,{children:"brlaser"})," driver does not work, you can request your printer here for inclusion ",(0,s.jsx)(r.a,{href:"https://github.com/getsolus/packages/issues/212",children:"here"})]}),"\n",(0,s.jsx)(r.h1,{id:"scanners",children:"Scanners"}),"\n",(0,s.jsx)(r.h2,{id:"brother-2",children:"Brother"}),"\n",(0,s.jsxs)(r.p,{children:["You can connect your Brother scanner via USB or LAN to be able to scan. To get newer Brother scanners to work you will have to install the package ",(0,s.jsx)(r.code,{children:"brscan4"})]}),"\n",(0,s.jsx)(r.h3,{id:"network-scanner",children:"Network scanner"}),"\n",(0,s.jsxs)(r.p,{children:["If your scanner is networked, you need to tell ",(0,s.jsx)(r.code,{children:"saned"})," the IP of your printer. It's advised to always give your printer the same IP inside your network (that is, a static IP address). Run the following command to accomplish this:"]}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",children:"brsaneconfig4 -a name=SCANNER model=$MODEL ip=$IPOFYOURSCANNER\n"})})]})}function c(e={}){const{wrapper:r}={...(0,t.a)(),...e.components};return r?(0,s.jsx)(r,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},11151:(e,r,n)=>{n.d(r,{Z:()=>o,a:()=>l});var s=n(67294);const t={},i=s.createContext(t);function l(e){const r=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),s.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[5481],{50:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>d,contentTitle:()=>l,default:()=>c,frontMatter:()=>i,metadata:()=>o,toc:()=>h});var s=n(85893),t=n(11151);const i={title:"Printers and Scanners",summary:"Guide to using printers and scanners on Solus"},l="Printers and Scanners",o={id:"user/hardware/peripherals/printers-and-scanners",title:"Printers and Scanners",description:"Drivers",source:"@site/docs/user/hardware/peripherals/printers-and-scanners.md",sourceDirName:"user/hardware/peripherals",slug:"/user/hardware/peripherals/printers-and-scanners",permalink:"/docs/user/hardware/peripherals/printers-and-scanners",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/peripherals/printers-and-scanners.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Printers and Scanners",summary:"Guide to using printers and scanners on Solus"},sidebar:"userSidebar",previous:{title:"MIDI Keyboards",permalink:"/docs/user/hardware/peripherals/midi-keyboard"},next:{title:"Package Management",permalink:"/docs/category/package-management"}},d={},h=[{value:"Drivers",id:"drivers",level:2},{value:"Brother",id:"brother",level:3},{value:"Compatibility",id:"compatibility",level:2},{value:"Brother",id:"brother-1",level:3},{value:"Brother",id:"brother-2",level:2},{value:"Network scanner",id:"network-scanner",level:3}];function a(e){const r={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(r.header,{children:(0,s.jsx)(r.h1,{id:"printers-and-scanners",children:"Printers and Scanners"})}),"\n",(0,s.jsx)(r.h1,{id:"printers",children:"Printers"}),"\n",(0,s.jsx)(r.h2,{id:"drivers",children:"Drivers"}),"\n",(0,s.jsx)(r.p,{children:"Many printers will work out-of the box on Solus. If yours doesn't, you should try installing additional drivers."}),"\n",(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Brand"}),(0,s.jsx)(r.th,{children:"Driver Package(s)"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Canon"}),(0,s.jsx)(r.td,{children:"canon-ufriilt-common"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Dymo"}),(0,s.jsx)(r.td,{children:"dymo-cups-driver"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Epson"}),(0,s.jsx)(r.td,{children:"epson-inkjet-printer-escpr"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"HP"}),(0,s.jsx)(r.td,{children:"hplip"})]})]})]}),"\n",(0,s.jsx)(r.h3,{id:"brother",children:"Brother"}),"\n",(0,s.jsxs)(r.p,{children:["The Solus repositories include ",(0,s.jsx)(r.code,{children:"brlaser"}),", an open-source driver for many Brother monochrome laser printers and multi-function devices. Compatible models are listed ",(0,s.jsx)(r.a,{href:"https://github.com/Owl-Maintain/brlaser#supported-printers",children:"here"})]}),"\n",(0,s.jsx)(r.p,{children:"Other Brother drivers are distributed by Brother for a single printer only. Because of this, you will need to install the package for your specific printer."}),"\n",(0,s.jsxs)(r.p,{children:["For example, ",(0,s.jsx)(r.code,{children:"brother-mfc1910w"})," provides drivers for the MFC-1910w."]}),"\n",(0,s.jsx)(r.h2,{id:"compatibility",children:"Compatibility"}),"\n",(0,s.jsx)(r.p,{children:"The following printers have been tested and/or suggested to function correctly by our users."}),"\n",(0,s.jsxs)(r.p,{children:["This list should not suggest that ",(0,s.jsx)(r.em,{children:"only"})," such devices listed below are compatible with Solus, as there may be devices not listed below that are in fact compatible."]}),"\n",(0,s.jsx)(r.h3,{id:"brother-1",children:"Brother"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:"Brother DCP-135C"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-1510"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-1512"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-1610W"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-7010"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-7060D"}),"\n",(0,s.jsx)(r.li,{children:"Brother DCP-L2520DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-1210W"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-1212W"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-2220"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-L2315DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-L2320D"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-L2360D"}),"\n",(0,s.jsx)(r.li,{children:"Brother HL-L2375DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-1910W"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-440CN"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-9130CW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-9330CDW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-J220"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-J480DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-L2700DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-L2703DW"}),"\n",(0,s.jsx)(r.li,{children:"Brother MFC-L2740DW"}),"\n"]}),"\n",(0,s.jsxs)(r.p,{children:["Should your printer not be on this list, and the generic ",(0,s.jsx)(r.code,{children:"brlaser"})," driver does not work, you can request your printer here for inclusion ",(0,s.jsx)(r.a,{href:"https://github.com/getsolus/packages/issues/212",children:"here"})]}),"\n",(0,s.jsx)(r.h1,{id:"scanners",children:"Scanners"}),"\n",(0,s.jsx)(r.h2,{id:"brother-2",children:"Brother"}),"\n",(0,s.jsxs)(r.p,{children:["You can connect your Brother scanner via USB or LAN to be able to scan. To get newer Brother scanners to work you will have to install the package ",(0,s.jsx)(r.code,{children:"brscan4"})]}),"\n",(0,s.jsx)(r.h3,{id:"network-scanner",children:"Network scanner"}),"\n",(0,s.jsxs)(r.p,{children:["If your scanner is networked, you need to tell ",(0,s.jsx)(r.code,{children:"saned"})," the IP of your printer. It's advised to always give your printer the same IP inside your network (that is, a static IP address). Run the following command to accomplish this:"]}),"\n",(0,s.jsx)(r.pre,{children:(0,s.jsx)(r.code,{className:"language-bash",children:"brsaneconfig4 -a name=SCANNER model=$MODEL ip=$IPOFYOURSCANNER\n"})})]})}function c(e={}){const{wrapper:r}={...(0,t.a)(),...e.components};return r?(0,s.jsx)(r,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},11151:(e,r,n)=>{n.d(r,{Z:()=>o,a:()=>l});var s=n(67294);const t={},i=s.createContext(t);function l(e){const r=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),s.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3a2db09e.844e4be4.js b/assets/js/3a2db09e.844e4be4.js new file mode 100644 index 000000000..1579f695f --- /dev/null +++ b/assets/js/3a2db09e.844e4be4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9361],{57588:l=>{l.exports=JSON.parse('{"tags":[{"label":"housekeeping","permalink":"/blog/tags/housekeeping","count":1},{"label":"cleanup","permalink":"/blog/tags/cleanup","count":1},{"label":"devlog","permalink":"/blog/tags/devlog","count":4},{"label":"solus","permalink":"/blog/tags/solus","count":5},{"label":"pgo","permalink":"/blog/tags/pgo","count":1},{"label":"lto","permalink":"/blog/tags/lto","count":1},{"label":"packaging","permalink":"/blog/tags/packaging","count":1},{"label":"optimization","permalink":"/blog/tags/optimization","count":1},{"label":"3","permalink":"/blog/tags/3","count":1},{"label":"clang","permalink":"/blog/tags/clang","count":1},{"label":"gnu","permalink":"/blog/tags/gnu","count":1},{"label":"llvm","permalink":"/blog/tags/llvm","count":1},{"label":"glibc","permalink":"/blog/tags/glibc","count":1},{"label":"hwcaps","permalink":"/blog/tags/hwcaps","count":1},{"label":"x86_64-v3","permalink":"/blog/tags/x-86-64-v-3","count":1},{"label":"MATE","permalink":"/blog/tags/mate","count":1},{"label":"eopkg","permalink":"/blog/tags/eopkg","count":1},{"label":"moss","permalink":"/blog/tags/moss","count":1},{"label":"hello","permalink":"/blog/tags/hello","count":1},{"label":"firstpost","permalink":"/blog/tags/firstpost","count":1}]}')}}]); \ No newline at end of file diff --git a/assets/js/3a2db09e.bd0b6bc5.js b/assets/js/3a2db09e.bd0b6bc5.js deleted file mode 100644 index a0e9c275c..000000000 --- a/assets/js/3a2db09e.bd0b6bc5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9361],{57588:l=>{l.exports=JSON.parse('{"tags":[{"label":"pgo","permalink":"/blog/tags/pgo","count":1},{"label":"lto","permalink":"/blog/tags/lto","count":1},{"label":"solus","permalink":"/blog/tags/solus","count":4},{"label":"packaging","permalink":"/blog/tags/packaging","count":1},{"label":"optimization","permalink":"/blog/tags/optimization","count":1},{"label":"3","permalink":"/blog/tags/3","count":1},{"label":"clang","permalink":"/blog/tags/clang","count":1},{"label":"gnu","permalink":"/blog/tags/gnu","count":1},{"label":"llvm","permalink":"/blog/tags/llvm","count":1},{"label":"glibc","permalink":"/blog/tags/glibc","count":1},{"label":"hwcaps","permalink":"/blog/tags/hwcaps","count":1},{"label":"x86_64-v3","permalink":"/blog/tags/x-86-64-v-3","count":1},{"label":"MATE","permalink":"/blog/tags/mate","count":1},{"label":"devlog","permalink":"/blog/tags/devlog","count":3},{"label":"eopkg","permalink":"/blog/tags/eopkg","count":1},{"label":"moss","permalink":"/blog/tags/moss","count":1},{"label":"hello","permalink":"/blog/tags/hello","count":1},{"label":"firstpost","permalink":"/blog/tags/firstpost","count":1}]}')}}]); \ No newline at end of file diff --git a/assets/js/3fdfc7ff.faa6fafd.js b/assets/js/3fdfc7ff.0f2beccb.js similarity index 98% rename from assets/js/3fdfc7ff.faa6fafd.js rename to assets/js/3fdfc7ff.0f2beccb.js index 3bbf2d50f..59a6db19a 100644 --- a/assets/js/3fdfc7ff.faa6fafd.js +++ b/assets/js/3fdfc7ff.0f2beccb.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4608],{57884:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>c,metadata:()=>r,toc:()=>i});var t=n(85893),a=n(11151);const c={title:"Basics to Package Management",summary:"Basics to Package Management"},o="Basics of package management in Solus",r={id:"user/package-management/basics",title:"Basics to Package Management",description:"Solus uses the eopkg package manager. You can use eopkg to install, update, and remove software packages on your Solus system.",source:"@site/docs/user/package-management/basics.md",sourceDirName:"user/package-management",slug:"/user/package-management/basics",permalink:"/docs/user/package-management/basics",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/package-management/basics.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Basics to Package Management",summary:"Basics to Package Management"},sidebar:"userSidebar",previous:{title:"Package Management",permalink:"/docs/category/package-management"},next:{title:"History and Software Rollback",permalink:"/docs/user/package-management/history-and-rollback"}},d={},i=[];function l(e){const s={code:"code",h1:"h1",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"basics-of-package-management-in-solus",children:"Basics of package management in Solus"})}),"\n",(0,t.jsxs)(s.p,{children:["Solus uses the eopkg package manager. You can use ",(0,t.jsx)(s.code,{children:"eopkg"})," to install, update, and remove software packages on your Solus system."]}),"\n",(0,t.jsxs)(s.p,{children:["The following table lists the most common ",(0,t.jsx)(s.code,{children:"eopkg"})," commands:"]}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Action"}),(0,t.jsx)(s.th,{children:"Command"}),(0,t.jsx)(s.th,{children:"Example"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Install software"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg install PACKAGE_NAME"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg install gnome-documents gnome-music"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Reinstall software"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg install --reinstall PACKAGE_NAME"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg install --reinstall gnome-documents gnome-music"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Uninstall software"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg remove PACKAGE_NAME"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg remove gnome-documents gnome-music"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Update your system"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg upgrade"})}),(0,t.jsx)(s.td,{children:"-"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Update specific software"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg upgrade PACKAGE_NAME"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg upgrade firefox"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Search for software"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"eopkg search KEYWORD"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"eopkg search documents"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Get information on software, such as description or version"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"eopkg info PACKAGE_NAME"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"eopkg info gnome-documents"})})]})]})]})]})}function h(e={}){const{wrapper:s}={...(0,a.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,s,n)=>{n.d(s,{Z:()=>r,a:()=>o});var t=n(67294);const a={},c=t.createContext(a);function o(e){const s=t.useContext(c);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),t.createElement(c.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4608],{57884:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>c,metadata:()=>r,toc:()=>i});var t=n(85893),a=n(11151);const c={title:"Basics to Package Management",summary:"Basics to Package Management"},o="Basics of package management in Solus",r={id:"user/package-management/basics",title:"Basics to Package Management",description:"Solus uses the eopkg package manager. You can use eopkg to install, update, and remove software packages on your Solus system.",source:"@site/docs/user/package-management/basics.md",sourceDirName:"user/package-management",slug:"/user/package-management/basics",permalink:"/docs/user/package-management/basics",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/package-management/basics.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Basics to Package Management",summary:"Basics to Package Management"},sidebar:"userSidebar",previous:{title:"Package Management",permalink:"/docs/category/package-management"},next:{title:"History and Software Rollback",permalink:"/docs/user/package-management/history-and-rollback"}},d={},i=[];function l(e){const s={code:"code",h1:"h1",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"basics-of-package-management-in-solus",children:"Basics of package management in Solus"})}),"\n",(0,t.jsxs)(s.p,{children:["Solus uses the eopkg package manager. You can use ",(0,t.jsx)(s.code,{children:"eopkg"})," to install, update, and remove software packages on your Solus system."]}),"\n",(0,t.jsxs)(s.p,{children:["The following table lists the most common ",(0,t.jsx)(s.code,{children:"eopkg"})," commands:"]}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Action"}),(0,t.jsx)(s.th,{children:"Command"}),(0,t.jsx)(s.th,{children:"Example"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Install software"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg install PACKAGE_NAME"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg install gnome-documents gnome-music"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Reinstall software"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg install --reinstall PACKAGE_NAME"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg install --reinstall gnome-documents gnome-music"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Uninstall software"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg remove PACKAGE_NAME"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg remove gnome-documents gnome-music"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Update your system"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg upgrade"})}),(0,t.jsx)(s.td,{children:"-"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Update specific software"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg upgrade PACKAGE_NAME"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"sudo eopkg upgrade firefox"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Search for software"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"eopkg search KEYWORD"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"eopkg search documents"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Get information on software, such as description or version"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"eopkg info PACKAGE_NAME"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"eopkg info gnome-documents"})})]})]})]})]})}function h(e={}){const{wrapper:s}={...(0,a.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,s,n)=>{n.d(s,{Z:()=>r,a:()=>o});var t=n(67294);const a={},c=t.createContext(a);function o(e){const s=t.useContext(c);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),t.createElement(c.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3ff05326.9f3e5519.js b/assets/js/3ff05326.f1df6790.js similarity index 99% rename from assets/js/3ff05326.9f3e5519.js rename to assets/js/3ff05326.f1df6790.js index 09749113c..7058f94a4 100644 --- a/assets/js/3ff05326.9f3e5519.js +++ b/assets/js/3ff05326.f1df6790.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2775],{17430:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>t,contentTitle:()=>l,default:()=>a,frontMatter:()=>d,metadata:()=>c,toc:()=>o});var i=n(85893),r=n(11151);const d={title:"Package YAML",summary:"Learning the package.yml packaging format"},l="package.yml",c={id:"packaging/package.yml",title:"Package YAML",description:'Each package is generated from a single build file named package.yml. This file is sometimes also called a "recipe" since it provides steps for building a package. It provides all of the required metadata for the package manager, plus the packaging steps involved to produce a package. This file follows the YAML specification.',source:"@site/docs/packaging/package.yml.md",sourceDirName:"packaging",slug:"/packaging/package.yml",permalink:"/docs/packaging/package.yml",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/package.yml.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Package YAML",summary:"Learning the package.yml packaging format"},sidebar:"packagingSidebar",previous:{title:"Monitoring YAML",permalink:"/docs/packaging/monitoring.yml"},next:{title:"Packaging Practices",permalink:"/docs/packaging/packaging-practices"}},t={},o=[{value:"Format",id:"format",level:2},{value:"Keys",id:"keys",level:2},{value:"Mandatory keys",id:"mandatory-keys",level:3},{value:""source" key",id:"source-key",level:4},{value:"Optional, supported keys",id:"optional-supported-keys",level:3},{value:"Packaging step keys, optional",id:"packaging-step-keys-optional",level:3},{value:"Optimize values",id:"optimize-values",level:2},{value:"Macros",id:"macros",level:2},{value:"Usage",id:"usage",level:3},{value:"Actionable macros",id:"actionable-macros",level:3},{value:"Haskell actionable macros",id:"haskell-actionable-macros",level:3},{value:"Ninja actionable macros",id:"ninja-actionable-macros",level:3},{value:"Perl actionable macros",id:"perl-actionable-macros",level:3},{value:"Python actionable macros",id:"python-actionable-macros",level:3},{value:"Ruby actionable macros",id:"ruby-actionable-macros",level:3},{value:"Rust (cargo) actionable macros",id:"rust-cargo-actionable-macros",level:3},{value:"Qt actionable macros",id:"qt-actionable-macros",level:3},{value:"Waf actionable macros",id:"waf-actionable-macros",level:3},{value:"BOLT actionable macros",id:"bolt-actionable-macros",level:3},{value:"Variable macros",id:"variable-macros",level:3},{value:"Variables",id:"variables",level:2},{value:"Types",id:"types",level:2},{value:"string",id:"string",level:3},{value:"string(s)",id:"strings",level:3},{value:"integer",id:"integer",level:3},{value:"list",id:"list",level:3},{value:"dict",id:"dict",level:3},{value:"dict(s)",id:"dicts",level:3},{value:"Packaging practices",id:"packaging-practices",level:2}];function h(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"packageyml",children:(0,i.jsx)(s.code,{children:"package.yml"})})}),"\n",(0,i.jsxs)(s.p,{children:["Each package is generated from a single build file named ",(0,i.jsx)(s.code,{children:"package.yml"}),'. This file is sometimes also called a "recipe" since it provides steps for building a package. It provides all of the required metadata for the package manager, plus the packaging steps involved to produce a package. This file follows the YAML specification.']}),"\n",(0,i.jsx)(s.h2,{id:"format",children:"Format"}),"\n",(0,i.jsxs)(s.p,{children:["All ",(0,i.jsx)(s.code,{children:"package.yml"})," files ",(0,i.jsx)(s.strong,{children:"must"})," be valid YAML."]}),"\n",(0,i.jsxs)(s.p,{children:["The file is organised into a key\u2192value hierarchy. The ",(0,i.jsx)(s.code,{children:"ypkg"})," tool parses a ",(0,i.jsx)(s.code,{children:"package.yml"})," file to build the corresponding package in a declarative manner. As such, most of the keys are simple strings, lists or nested key\u2192value pairs. A special case consists in the packaging steps, which are scripts."]}),"\n",(0,i.jsx)(s.p,{children:"An example file follows:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-yaml",children:"name : nano\nversion : 2.9.5\nrelease : 96\nsource :\n - https://www.nano-editor.org/dist/v2.9/nano-2.9.5.tar.xz: 7b8d181cb57f42fa86a380bb9ad46abab859b60383607f731b65a9077f4b4e19\nhomepage : https://www.nano-editor.org\nlicense : GPL-3.0-or-later\nsummary : Small, friendly text editor inspired by Pico\ncomponent : system.devel\ndescription: |\n GNU nano is an easy-to-use text editor originally designed as a replacement for Pico, the ncurses-based editor from the non-free mailer package Pine (itself now available under the Apache License as Alpine).\nsetup : |\n %patch -p1 -i $pkgfiles/0001-Use-a-stateless-configuration.patch\n %reconfigure --enable-utf8 --docdir=/usr/share/doc/nano\nbuild : |\n %make\ninstall : |\n %make_install\n install -D -m 00644 $pkgfiles/nanorc $installdir/usr/share/defaults/nano/nanorc\n install -D -m 00644 $pkgfiles/git.nanorc $installdir/usr/share/nano/git.nanorc\n # https://github.com/scopatz/nanorc\n for rcFile in $pkgfiles/nanorc-extras/*.nanorc; do\n install -m 00644 $rcFile $installdir/usr/share/nano\n done\n"})}),"\n",(0,i.jsx)(s.h2,{id:"keys",children:"Keys"}),"\n",(0,i.jsxs)(s.p,{children:["Not all fields in ",(0,i.jsx)(s.code,{children:"package.yml"})," are mandatory, but a small selection are. Below is the complete list of the available fields."]}),"\n",(0,i.jsx)(s.h3,{id:"mandatory-keys",children:"Mandatory keys"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Key Name"}),(0,i.jsx)(s.th,{children:"Type"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"name"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsx)(s.td,{children:"The name of the package. This is also used as the base of all sub-package names. Unless unavoidable, this should match the upstream name."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"version"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsx)(s.td,{children:"The version of the currently packaged software. This is taken from the tarball in most cases."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"release"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"integer"})}),(0,i.jsxs)(s.td,{children:["Specifies the current release number. Updates in the package number are based on this ",(0,i.jsx)(s.code,{children:"release"})," number, ",(0,i.jsx)(s.em,{children:"not"})," the ",(0,i.jsx)(s.code,{children:"version"})," number. As such, to release an update to users, this number must be incremented by one."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"source"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"dict(s)"})}),(0,i.jsxs)(s.td,{children:["See ",(0,i.jsx)(s.a,{href:"/docs/packaging/package.yml#source-key",children:"source key"})," below."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"homepage"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsx)(s.td,{children:"Provides a link to the package's homepage, used in the Software Center."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"license"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string(s)"})}),(0,i.jsxs)(s.td,{children:["Valid upstream license(s). Try to ensure these use ",(0,i.jsx)(s.a,{href:"https://spdx.org/licenses/",children:"SPDX identifiers"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"summary"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsx)(s.td,{children:"Brief package summary, or display name."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"component"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsxs)(s.td,{children:["Component / group of packages this package belongs to. Check available components via ",(0,i.jsx)(s.code,{children:"eopkg lc"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"description"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsx)(s.td,{children:"More extensive description of the software, usually taken from the vendor website."})]})]})]}),"\n",(0,i.jsx)(s.h4,{id:"source-key",children:'"source" key'}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Tarball source","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:['Upstream source URL to the source code archive (often called the "tarball"), followed by the ',(0,i.jsx)(s.code,{children:"sha256sum"})," for the tarball, as a value."]}),"\n",(0,i.jsxs)(s.li,{children:["Example: ",(0,i.jsx)(s.code,{children:"https://www.nano-editor.org/dist/v7/nano-7.2.tar.xz : 86f3442768bd2873cec693f83cdf80b4b444ad3cc14760b74361474fc87a4526"})]}),"\n",(0,i.jsx)(s.li,{children:"Tarball sources are preferred over git sources, whenever possible, because git tags can be changed to point to different commits."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["Git source","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Git repository URL prefixed with ",(0,i.jsx)(s.code,{children:"git|"}),", followed by the git tag or commit hash, as a value."]}),"\n",(0,i.jsxs)(s.li,{children:["Example: ",(0,i.jsx)(s.code,{children:"git|https://github.com/getsolus/solus-sc.git : 6e786b3e86982272717ca4bed4f783fc43a678f3"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["Multiple sources","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["If multiple sources are listed, only the first source will be copied from the ",(0,i.jsx)(s.code,{children:"$sources"})," directory to the ",(0,i.jsx)(s.code,{children:"$workdir"})," directory."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["Renaming sources","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"If the file resulting from the source download needs to be renamed (often to avoid a name that would conflict with another source), add the preferred name to the URL as a URI fragment."}),"\n",(0,i.jsxs)(s.li,{children:["Example: ",(0,i.jsx)(s.code,{children:"https://github.com/docker/cli/archive/refs/tags/v25.0.3.tar.gz#docker-cli.tar.gz : 04ad0cea992a65db20cb1b0dbf6d1ce32c705ce879de51b22095fe8d28030815"})]}),"\n",(0,i.jsxs)(s.li,{children:["This renames the downloaded file from ",(0,i.jsx)(s.code,{children:"v25.0.3.tar.gz"})," to ",(0,i.jsx)(s.code,{children:"docker-cli.tar.gz"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["SourceForge sources","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["A proper SourceForge source looks like this, using ",(0,i.jsx)(s.code,{children:"hplip"})," as an example: ",(0,i.jsx)(s.code,{children:"https://sourceforge.net/projects/hplip/files/hplip/3.24.4/hplip-3.24.4.tar.gz"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["This URL begins with ",(0,i.jsx)(s.code,{children:"https://sourceforge.net/"}),", not ",(0,i.jsx)(s.code,{children:"https://downloads.sourceforge.net/"}),", or some other mirror."]}),"\n",(0,i.jsxs)(s.li,{children:["This URL has a path beginning with ",(0,i.jsx)(s.code,{children:"/projects/$project_name/"})]}),"\n",(0,i.jsxs)(s.li,{children:["This URL does ",(0,i.jsx)(s.em,{children:"not"})," have a trailing ",(0,i.jsx)(s.code,{children:"/download"}),", you may have to remove this by hand."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.li,{children:'The correct SourceForge tarball URLs are found under the "Files" tab, then often within a directory, when starting from a project homepage on SourceForge.'}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"optional-supported-keys",children:"Optional, supported keys"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Key Name"}),(0,i.jsx)(s.th,{children:"Type"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"clang"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"yes"})," if this package benefits from being built with Clang."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"extract"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"no"})," to disable automatic source extraction."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"autodep"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"no"})," to disable automatic binary dependency resolution at build time."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"emul32"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"yes"})," to enable an ",(0,i.jsx)(s.code,{children:"-m32"})," build (32-bit libs)."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"libsplit"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"no"})," to disable splitting of libraries into ",(0,i.jsx)(s.code,{children:"devel"})," sub-packages."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"conflicts"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string(s)"})}),(0,i.jsx)(s.td,{children:"Specify packages that cannot be installed together with this one."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"optimize"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"list"})}),(0,i.jsxs)(s.td,{children:["Specify preset keys to modify compiler and linker flags during build. You can learn more ",(0,i.jsx)(s.a,{href:"/docs/packaging/package.yml#optimize-values",children:"here"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"builddeps"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"list"})}),(0,i.jsxs)(s.td,{children:["Specify build dependencies for the package. You can learn more ",(0,i.jsx)(s.a,{href:"/docs/packaging/packaging-practices#build-dependencies",children:"here"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"rundeps"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"dict(s)"})}),(0,i.jsxs)(s.td,{children:["Specify further runtime dependencies for the packages. You can learn more ",(0,i.jsx)(s.a,{href:"/docs/packaging/packaging-practices#runtime-dependencies",children:"here"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"checkdeps"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"dict(s)"})}),(0,i.jsxs)(s.td,{children:["Specify build dependencies for the package which will ",(0,i.jsx)(s.em,{children:"not"})," be considered when determining build order for automatic builds. These dependencies should only be used during the ",(0,i.jsx)(s.code,{children:"check"})," build phase. You can learn more ",(0,i.jsx)(s.a,{href:"/docs/packaging/packaging-practices#check-dependencies",children:"here"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"replaces"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"dict(s)"})}),(0,i.jsx)(s.td,{children:"Replace one package with another, used when renaming or deprecating packages for clean upgrade paths."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"patterns"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"dict(s)"})}),(0,i.jsxs)(s.td,{children:["Allows fine grained control over file placement within the package or sub-packages. Useful for packages that are development only (i.e. ",(0,i.jsx)(s.code,{children:"/usr/bin"})," files)."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"environment"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"unicode"})}),(0,i.jsx)(s.td,{children:"Specify code that will be exported to all packaging steps of the build (i.e. exporting variables for the entire build)."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"networking"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"yes"})," to enable networking within solbuild."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"packaging-step-keys-optional",children:"Packaging step keys, optional"}),"\n",(0,i.jsxs)(s.p,{children:["The packaging steps are all considered optional, however the absence of the ",(0,i.jsx)(s.code,{children:"install"})," step will result in no package generated. Each of these keys contains content that will be placed within a script and executed within a controlled environment to perform the package build. For all intents and purposes, they are Bash scripts with a predefined environment."]}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Step Name"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"setup"})}),(0,i.jsxs)(s.td,{children:["Performed after the source extraction. This is the correct place to perform any ",(0,i.jsx)(s.code,{children:"configure"})," routine, or to ",(0,i.jsx)(s.code,{children:"patch"})," the sources."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"build"})}),(0,i.jsxs)(s.td,{children:["Use this step to run the build portion, for example, ",(0,i.jsx)(s.code,{children:"make"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"install"})}),(0,i.jsxs)(s.td,{children:["This is where you should install the files into the final packaging directory, for example, ",(0,i.jsx)(s.code,{children:"make install"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"check"})}),(0,i.jsxs)(s.td,{children:["This is where tests / checking should occur, for example, ",(0,i.jsx)(s.code,{children:"make check"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"profile"})}),(0,i.jsxs)(s.td,{children:["This is where profiling tests should be specified. ",(0,i.jsx)(s.code,{children:"ypkg"})," will handle setting flags to generate profiling data and using that data for an optimized build."]})]})]})]}),"\n",(0,i.jsx)(s.h2,{id:"optimize-values",children:"Optimize values"}),"\n",(0,i.jsxs)(s.p,{children:["One or more optimize values can be specified in a list with the ",(0,i.jsx)(s.code,{children:"optimize"})," key in the ",(0,i.jsx)(s.code,{children:"package.yml"})," file. Several values can override or conflict with each other and should be used only where they provide a performance benefit, or fix a bug in the package or build."]}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Optimize Value"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"speed"})}),(0,i.jsxs)(s.td,{children:["Optimizes the package for performance ",(0,i.jsx)(s.code,{children:"-O3"})," plus other flags."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"size"})}),(0,i.jsxs)(s.td,{children:["Optimizes the package build to minimize size ",(0,i.jsx)(s.code,{children:"-Os"}),". Not supported with clang."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"no-bind-now"})}),(0,i.jsx)(s.td,{children:"Configures the package to disable certain flags, where RELRO is unsupported."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"no-symbolic"})}),(0,i.jsxs)(s.td,{children:["Disables ",(0,i.jsx)(s.code,{children:"-Wl,-Bsymbolic-functions"})," linker flag."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"unroll-loops"})}),(0,i.jsxs)(s.td,{children:["Enables ",(0,i.jsx)(s.code,{children:"-funroll-loops"}),". Use this sparingly, only when it provides proven benefit."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"runpath"})}),(0,i.jsxs)(s.td,{children:["Enables ",(0,i.jsx)(s.code,{children:"-Wl,--enable-new-dtags"})," to make linker use RUNPATH's instead of RPATH's."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"avx256"})}),(0,i.jsxs)(s.td,{children:["Disables ",(0,i.jsx)(s.code,{children:"-mprefer-vector-width=128"})," in avx2 builds."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"thin-lto"})}),(0,i.jsxs)(s.td,{children:["Enables Thin Link Time Optimization ",(0,i.jsx)(s.code,{children:"-flto=thin"})," with a supported linker."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"lto"})}),(0,i.jsxs)(s.td,{children:["Enables Link Time Optimization ",(0,i.jsx)(s.code,{children:"-flto"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"icf-safe"})}),(0,i.jsxs)(s.td,{children:["Enables safe Identical Cold Folding ",(0,i.jsx)(s.code,{children:"--icf=safe"}),". ",(0,i.jsx)(s.code,{children:"function-sections"})," is recommended when not using clang. Uses gold linker when not using clang."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"icf-all"})}),(0,i.jsxs)(s.td,{children:["Enables Identical Cold Folding ",(0,i.jsx)(s.code,{children:"--icf=all"}),". ",(0,i.jsx)(s.code,{children:"function-sections"})," is recommended when not using clang. Uses gold linker when not using clang."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"polly"})}),(0,i.jsx)(s.td,{children:"Enables polyhedral optimizations for the clang toolchain."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"function-sections"})}),(0,i.jsx)(s.td,{children:"Generate a separate ELF section for each function. Recommended with ICF when not using clang."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"no-reorder-blocks-partition"})}),(0,i.jsx)(s.td,{children:"Disables block partition reordering with the gcc toolchain. Provided to facilitate BOLT'ed binaries/libraries."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"emit-relocs"})}),(0,i.jsx)(s.td,{children:"Instructs the linker to emit relocations. Provided to facilitate BOLT'ed binaries/libraries."})]})]})]}),"\n",(0,i.jsx)(s.h2,{id:"macros",children:"Macros"}),"\n",(0,i.jsx)(s.p,{children:"To further assist in packaging, a number of macros are available. These are simply shorthand ways to perform a normal build operation. They also ensure that the resulting package is consistent. These macros are only available in our packaging steps, as they are substituted within the script before execution."}),"\n",(0,i.jsx)(s.h3,{id:"usage",children:"Usage"}),"\n",(0,i.jsxs)(s.p,{children:["Macros are prefixed with ",(0,i.jsx)(s.code,{children:"%"}),", and are substituted before your script is executed. Macros ending with ",(0,i.jsx)(s.code,{children:"%"})," are used to provide directory names or build values to the script."]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"# Run the configure macro with the given arguments\n%configure --disable-static\n"})}),"\n",(0,i.jsx)(s.h3,{id:"actionable-macros",children:"Actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%autogen"})}),(0,i.jsxs)(s.td,{children:["Runs autogen with our ",(0,i.jsx)(s.code,{children:"%CONFOPTS%"})," to create a configure script then proceeds to run ",(0,i.jsx)(s.code,{children:"%configure"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cmake"})}),(0,i.jsx)(s.td,{children:"Configures a CMake project with the distribution specific options, such as prefix and release type."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cmake_ninja"})}),(0,i.jsxs)(s.td,{children:["Configures a CMake project with ninja so it can be used with ",(0,i.jsx)(s.code,{children:"%ninja_build"}),", ",(0,i.jsx)(s.code,{children:"%ninja_install"})," and ",(0,i.jsx)(s.code,{children:"%ninja_check"})," macros."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%configure"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"./configure"})," with our ",(0,i.jsx)(s.code,{children:"%CONFOPTS%"})," variable macro."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%configure_no_runstatedir"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"%configure"})," without the ",(0,i.jsx)(s.code,{children:"--runstatedir"})," option. Use if you encounter ",(0,i.jsx)(s.code,{children:"configure: error: unrecognized option: '--runstatedir=/run'"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%make"})}),(0,i.jsxs)(s.td,{children:["Runs the ",(0,i.jsx)(s.code,{children:"make"})," command with the job count specified in ",(0,i.jsx)(s.code,{children:"eopkg.conf"})," (",(0,i.jsx)(s.a,{href:"/docs/packaging/advanced-config/eopkg-configuration",children:"more info"}),")."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%make_install"})}),(0,i.jsxs)(s.td,{children:["Performs a ",(0,i.jsx)(s.code,{children:"make install"}),", using the ",(0,i.jsx)(s.code,{children:"DESTDIR"})," variant. Should work for the vast majority of packages."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%patch"})}),(0,i.jsx)(s.td,{children:"Sane patch macro to run in batch mode and not contaminate source tree on failure."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%apply_patches"})}),(0,i.jsxs)(s.td,{children:["Applies all patches listed in the ",(0,i.jsx)(s.code,{children:"series"})," file in ",(0,i.jsx)(s.code,{children:"./files"})," folder."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%reconfigure"})}),(0,i.jsxs)(s.td,{children:["Updates build scripts such as ",(0,i.jsx)(s.code,{children:"./configure"})," and proceeds to run ",(0,i.jsx)(s.code,{children:"%configure"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%symlink_check"})}),(0,i.jsx)(s.td,{children:"Checks for broken symlinks in the install directory and aborts the build if any are found. Must run after install macros."})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"haskell-actionable-macros",children:"Haskell actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cabal_configure"})}),(0,i.jsx)(s.td,{children:"Configures a Cabal project that requires online dependencies, like a Cargo-style build"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%haskell_configure"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"runhaskell configure"})," with prefix, libdir, etc. and ensures the necessary package.conf.d is copied to the correct location."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%haskell_build"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"runhaskell build"})," with ",(0,i.jsx)(s.code,{children:"%JOBS%"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%haskell_install"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"runhaskell copy"})," to ",(0,i.jsx)(s.code,{children:"$installdir"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%haskell_register"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"runhaskell register"})," to generate a pkg-config for package and version, then installs the conf file."]})]})]})]}),"\n",(0,i.jsxs)(s.p,{children:["Existing Haskell packages may use the old ",(0,i.jsx)(s.code,{children:"cabal_build"}),", ",(0,i.jsx)(s.code,{children:"cabal_install"}),", ",(0,i.jsx)(s.code,{children:"cabal_register"})," macros. Please use the new ",(0,i.jsx)(s.code,{children:"haskell_*"})," macros instead."]}),"\n",(0,i.jsx)(s.h3,{id:"ninja-actionable-macros",children:"Ninja actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%meson_configure"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"meson"})," with our CFLAGS and appropriate flags such as ",(0,i.jsx)(s.code,{children:"libdir"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%ninja_build"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"ninja"})," and passes our ",(0,i.jsx)(s.code,{children:"%JOBS%"})," variable. This macro obsoletes ",(0,i.jsx)(s.em,{children:"%meson_build"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%ninja_install"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"ninja install"})," and passes the appropriate ",(0,i.jsx)(s.code,{children:"DESTDIR"})," and ",(0,i.jsx)(s.code,{children:"%JOBS%"})," variable. This macro obsoletes ",(0,i.jsx)(s.em,{children:"%meson_install"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%ninja_check"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"ninja test"})," and passes our ",(0,i.jsx)(s.code,{children:"%JOBS%"})," variable. This macro obsoletes ",(0,i.jsx)(s.em,{children:"%meson_check"}),"."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"perl-actionable-macros",children:"Perl actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%perl_setup"})}),(0,i.jsxs)(s.td,{children:["Runs Perl setup scripts ",(0,i.jsx)(s.code,{children:"Build.pl"})," or ",(0,i.jsx)(s.code,{children:"Makefile.pl"})," with the appropriate variable flags."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%perl_build"})}),(0,i.jsxs)(s.td,{children:["Runs Perl build scripts or attempts ",(0,i.jsx)(s.code,{children:"%make"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%perl_install"})}),(0,i.jsxs)(s.td,{children:["Runs Perl install scripts or attempts ",(0,i.jsx)(s.code,{children:"%make_install"}),"."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"python-actionable-macros",children:"Python actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python_setup"})}),(0,i.jsx)(s.td,{children:"Runs the build portion of a setup.py using python2."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python_install"})}),(0,i.jsx)(s.td,{children:"Runs the install portion of a setup.py, to the appropriate root, using python2."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python_test"})}),(0,i.jsxs)(s.td,{children:["Without argument, runs the test portion of setup.py. With a ",(0,i.jsx)(s.code,{children:".py"}),' script, execute the script with python2. With something else execute the command "as it is". (',(0,i.jsx)(s.a,{href:"https://github.com/getsolus/ypkg/pull/1",children:"More info"}),")"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python_compile"})}),(0,i.jsxs)(s.td,{children:["Compiles ",(0,i.jsx)(s.code,{children:"*.py"})," files using python2. This is only useful where the build doesn't compile them already (indicated by availability of ",(0,i.jsx)(s.code,{children:"*.pyc"})," files)."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python3_setup"})}),(0,i.jsx)(s.td,{children:"Runs the build portion of a setup.py using python3."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python3_install"})}),(0,i.jsx)(s.td,{children:"Runs the install portion of a setup.py, to the appropriate root, using python3."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python3_test"})}),(0,i.jsxs)(s.td,{children:["Without argument, runs the test portion of setup.py. With a ",(0,i.jsx)(s.code,{children:".py"}),' script, execute the script with python3. With something else execute the command "as it is". (',(0,i.jsx)(s.a,{href:"https://github.com/getsolus/ypkg/pull/1",children:"More info"}),")"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python3_compile"})}),(0,i.jsxs)(s.td,{children:["Compiles ",(0,i.jsx)(s.code,{children:"*.py"})," files using python3. This is only useful where the build doesn't compile them already (indicated by availability of ",(0,i.jsx)(s.code,{children:"*.pyc"})," files)."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"ruby-actionable-macros",children:"Ruby actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%gem_build"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"gem build"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%gem_install"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"gem install"})," with the appropriate parameters."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"rust-cargo-actionable-macros",children:"Rust (cargo) actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cargo_fetch"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"cargo fetch --locked"})," to get dependencies."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cargo_build"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"cargo build"})," with some additional flags."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cargo_install"})}),(0,i.jsxs)(s.td,{children:["Installs the built binary to ",(0,i.jsx)(s.code,{children:"/usr/bin/PACKAGE-NAME"}),", OR to ",(0,i.jsx)(s.code,{children:"/usr/bin/ARGUMENT"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cargo_test"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"cargo test"})," with some additional flags."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"qt-actionable-macros",children:"Qt actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%qmake"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"qmake"})," for Qt5 with the appropriate make flags."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%qmake4"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"qmake"})," for Qt4, as well as adding the necessary MOC, RCC, and UIC flags since those Qt4 executables end in -qt4."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%qml_cache"})}),(0,i.jsxs)(s.td,{children:["Compiles ",(0,i.jsx)(s.code,{children:"*.qml"})," files into ",(0,i.jsx)(s.code,{children:"*.qmlc"})," so they are compiled ahead of time."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%qml6_cache"})}),(0,i.jsxs)(s.td,{children:["Same as ",(0,i.jsx)(s.code,{children:"%qml_cache"}),", but for Qt6."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"waf-actionable-macros",children:"Waf actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%waf_configure"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"waf configure"})," with prefix."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%waf_build"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"waf"})," and passes our ",(0,i.jsx)(s.code,{children:"%JOBS%"})," variable."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%waf_install"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"waf install"})," and passes the appropriate ",(0,i.jsx)(s.code,{children:"destdir"})," and ",(0,i.jsx)(s.code,{children:"%JOBS%"})," variable."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"bolt-actionable-macros",children:"BOLT actionable macros"}),"\n",(0,i.jsx)(s.p,{children:"BOLT is a post-link optimizer developed to speed up large applications. You will need to run a workload after instrumenting a binary or library. Think of it as post-link profile guided optimization."}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%bolt_instr"})}),(0,i.jsxs)(s.td,{children:["Instrument a binary or library with llvm-bolt. Requires it to be built with ",(0,i.jsx)(s.code,{children:"emit-relocs"}),", as well as ",(0,i.jsx)(s.code,{children:"no-reorder-blocks-partition"})," if not using clang."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%bolt_merge"})}),(0,i.jsx)(s.td,{children:"Merge fdata profiles into a single file after running a workload with a BOLT instrumented binary."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%bolt_opt"})}),(0,i.jsxs)(s.td,{children:["Optimize a binary using BOLT after running ",(0,i.jsx)(s.code,{children:"%bolt_merge"}),"."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"variable-macros",children:"Variable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%ARCH%"})}),(0,i.jsx)(s.td,{children:"Indicates the current build architecture."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%CC%"})}),(0,i.jsx)(s.td,{children:"C compiler."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%CFLAGS%"})}),(0,i.jsxs)(s.td,{children:["cflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%CONFOPTS%"})}),(0,i.jsxs)(s.td,{children:["Flags / options for configuration, such as ",(0,i.jsx)(s.code,{children:"--prefix=%PREFIX%"}),". ",(0,i.jsx)(s.a,{href:"https://github.com/getsolus/ypkg/blob/v33/ypkg2/rc.yml#L446-L458",children:"Full List."})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%CXX%"})}),(0,i.jsx)(s.td,{children:"C++ compiler."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%CXXFLAGS%"})}),(0,i.jsxs)(s.td,{children:["cxxflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%JOBS%"})}),(0,i.jsxs)(s.td,{children:["jobs, as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%LDFLAGS%"})}),(0,i.jsxs)(s.td,{children:["ldflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%LIBSUFFIX%"})}),(0,i.jsx)(s.td,{children:"Library suffix (either 32 for 32-bit or 64 for 64-bit)."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%PREFIX%"})}),(0,i.jsxs)(s.td,{children:["Hard-coded prefix ",(0,i.jsx)(s.code,{children:"/usr"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%YJOBS%"})}),(0,i.jsxs)(s.td,{children:["Job count without ",(0,i.jsx)(s.code,{children:"-j"})," as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%installroot%"})}),(0,i.jsx)(s.td,{children:"Hard-coded install directory."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%libdir%"})}),(0,i.jsxs)(s.td,{children:["The distribution\u2019s default library directory, i.e. ",(0,i.jsx)(s.code,{children:"/usr/lib64"})," (Alters for ",(0,i.jsx)(s.code,{children:"emul32"}),")."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%version%"})}),(0,i.jsxs)(s.td,{children:["Version of the package, as specified in the ",(0,i.jsx)(s.code,{children:"version"})," key."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%workdir%"})}),(0,i.jsx)(s.td,{children:"Hard-coded work directory (source tree)."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%kernel_version_lts%"})}),(0,i.jsxs)(s.td,{children:["Version of the ",(0,i.jsx)(s.code,{children:"linux-lts"})," kernel."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%kernel_version_current%"})}),(0,i.jsxs)(s.td,{children:["Version of the ",(0,i.jsx)(s.code,{children:"linux-current"})," kernel."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python2_version%"})}),(0,i.jsxs)(s.td,{children:["Version of the ",(0,i.jsx)(s.code,{children:"python"})," (Python 2) distribution."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python3_version%"})}),(0,i.jsxs)(s.td,{children:["Version of the ",(0,i.jsx)(s.code,{children:"python3"})," distribution."]})]})]})]}),"\n",(0,i.jsx)(s.h2,{id:"variables",children:"Variables"}),"\n",(0,i.jsx)(s.p,{children:"A set of variables are exported in our build stages. These are used to provide context and structure to the scripts."}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Variable"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$CFLAGS"})}),(0,i.jsxs)(s.td,{children:["cflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$CXXFLAGS"})}),(0,i.jsxs)(s.td,{children:["cxxflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$LDFLAGS"})}),(0,i.jsxs)(s.td,{children:["ldflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$CC"})}),(0,i.jsx)(s.td,{children:"C compiler."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$CXX"})}),(0,i.jsx)(s.td,{children:"C++ compiler."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$EMUL32BUILD"})}),(0,i.jsxs)(s.td,{children:["Set only when compiling in ",(0,i.jsx)(s.code,{children:"emul32"})," mode."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$AVX2BUILD"})}),(0,i.jsxs)(s.td,{children:["Set only when compiling in ",(0,i.jsx)(s.code,{children:"avx2"})," mode."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$PGO_GEN_BUILD"})}),(0,i.jsx)(s.td,{children:"Set during the instrumentation phase of a PGO build."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$PGO_USE_BUILD"})}),(0,i.jsx)(s.td,{children:"Set during the use phase of a PGO build."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$installdir"})}),(0,i.jsx)(s.td,{children:"The install directory, i.e. where files are installed to for packaging."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$pkgfiles"})}),(0,i.jsxs)(s.td,{children:["Refers to the ",(0,i.jsx)(s.code,{children:"./files"})," directory relative to the ",(0,i.jsx)(s.code,{children:"package.yml"})," file."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$sources"})}),(0,i.jsxs)(s.td,{children:["Refers to the directory where your source files are stored, for example, ",(0,i.jsx)(s.code,{children:"$sources/nano.tar.gz"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$workdir"})}),(0,i.jsx)(s.td,{children:"The work, or source, directory of the package build."})]})]})]}),"\n",(0,i.jsx)(s.h2,{id:"types",children:"Types"}),"\n",(0,i.jsxs)(s.p,{children:["The ",(0,i.jsx)(s.code,{children:"package.yml"})," file uses native YAML types, however it follows syntactic conventions and may accept multiple value types for a given key."]}),"\n",(0,i.jsx)(s.h3,{id:"string",children:"string"}),"\n",(0,i.jsx)(s.p,{children:"This is simply text, which does not need to be quoted."}),"\n",(0,i.jsx)(s.h3,{id:"strings",children:"string(s)"}),"\n",(0,i.jsxs)(s.p,{children:["Indicates that it is possible to use a ",(0,i.jsx)(s.code,{children:"list"})," of strings, or one single ",(0,i.jsx)(s.code,{children:"string"}),"."]}),"\n",(0,i.jsx)(s.h3,{id:"integer",children:"integer"}),"\n",(0,i.jsxs)(s.p,{children:["Whole, positive number, used in the ",(0,i.jsx)(s.code,{children:"release"})," field."]}),"\n",(0,i.jsx)(s.h3,{id:"list",children:"list"}),"\n",(0,i.jsx)(s.p,{children:"A YAML list (or array) can be expressed in multiple ways. A short array-notation would look like this:"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.code,{children:"[one, two, three]"})}),"\n",(0,i.jsx)(s.p,{children:"They can also be expressed like this:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-yaml",children:"- First Value\n- Second Value\n- Third Value\n"})}),"\n",(0,i.jsx)(s.h3,{id:"dict",children:"dict"}),"\n",(0,i.jsxs)(s.p,{children:["Known as an associative array, this is key to value mapping. These are separated by a colon (",(0,i.jsx)(s.code,{children:":"}),"), the token on the left is taken to be a key, and the token on the right is the value."]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.code,{children:"SomeKey: Some Value"})}),"\n",(0,i.jsxs)(s.p,{children:["Note that each ",(0,i.jsx)(s.code,{children:"ypkg key"})," in the YAML file is actually a dict."]}),"\n",(0,i.jsx)(s.h3,{id:"dicts",children:"dict(s)"}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.code,{children:"dict(s)"})," consists of a list of ",(0,i.jsx)(s.code,{children:"dict"}),"s and some assumptions. We primarily make use of this to express advanced information within the package. These permit you to provide no key, and a value only.\nIn this instance, the key is implicitly assumed to be the package name (for example, ",(0,i.jsx)(s.code,{children:"nano"}),"):"]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.code,{children:"- some value"})}),"\n",(0,i.jsx)(s.p,{children:"An explicit key, usually a sub-package name:"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.code,{children:"- somekey: somevalue"})}),"\n",(0,i.jsx)(s.p,{children:"A mix of both:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-yaml",children:"- somevalue\n- somekey: another value\n"})}),"\n",(0,i.jsx)(s.p,{children:"The values may also be expressed in list form, still using the same default key logic:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-yaml",children:"- [one, two, three]\n- somekey: [one, two, three]\n- key:\n - value one\n - value two\n - value three\n"})}),"\n",(0,i.jsx)(s.h2,{id:"packaging-practices",children:"Packaging practices"}),"\n",(0,i.jsxs)(s.p,{children:["The concepts in this document merely expose the syntax of a ",(0,i.jsx)(s.code,{children:"package.yml"})," file. Solus adheres to strict packaging practices and conventions which packagers must follow. They are explained in the ",(0,i.jsx)(s.a,{href:"/docs/packaging/packaging-practices",children:"Packaging Practices"})," article."]})]})}function a(e={}){const{wrapper:s}={...(0,r.a)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},11151:(e,s,n)=>{n.d(s,{Z:()=>c,a:()=>l});var i=n(67294);const r={},d=i.createContext(r);function l(e){const s=i.useContext(d);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),i.createElement(d.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2775],{17430:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>t,contentTitle:()=>l,default:()=>a,frontMatter:()=>d,metadata:()=>c,toc:()=>o});var i=n(85893),r=n(11151);const d={title:"Package YAML",summary:"Learning the package.yml packaging format"},l="package.yml",c={id:"packaging/package.yml",title:"Package YAML",description:'Each package is generated from a single build file named package.yml. This file is sometimes also called a "recipe" since it provides steps for building a package. It provides all of the required metadata for the package manager, plus the packaging steps involved to produce a package. This file follows the YAML specification.',source:"@site/docs/packaging/package.yml.md",sourceDirName:"packaging",slug:"/packaging/package.yml",permalink:"/docs/packaging/package.yml",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/package.yml.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Package YAML",summary:"Learning the package.yml packaging format"},sidebar:"packagingSidebar",previous:{title:"Monitoring YAML",permalink:"/docs/packaging/monitoring.yml"},next:{title:"Packaging Practices",permalink:"/docs/packaging/packaging-practices"}},t={},o=[{value:"Format",id:"format",level:2},{value:"Keys",id:"keys",level:2},{value:"Mandatory keys",id:"mandatory-keys",level:3},{value:""source" key",id:"source-key",level:4},{value:"Optional, supported keys",id:"optional-supported-keys",level:3},{value:"Packaging step keys, optional",id:"packaging-step-keys-optional",level:3},{value:"Optimize values",id:"optimize-values",level:2},{value:"Macros",id:"macros",level:2},{value:"Usage",id:"usage",level:3},{value:"Actionable macros",id:"actionable-macros",level:3},{value:"Haskell actionable macros",id:"haskell-actionable-macros",level:3},{value:"Ninja actionable macros",id:"ninja-actionable-macros",level:3},{value:"Perl actionable macros",id:"perl-actionable-macros",level:3},{value:"Python actionable macros",id:"python-actionable-macros",level:3},{value:"Ruby actionable macros",id:"ruby-actionable-macros",level:3},{value:"Rust (cargo) actionable macros",id:"rust-cargo-actionable-macros",level:3},{value:"Qt actionable macros",id:"qt-actionable-macros",level:3},{value:"Waf actionable macros",id:"waf-actionable-macros",level:3},{value:"BOLT actionable macros",id:"bolt-actionable-macros",level:3},{value:"Variable macros",id:"variable-macros",level:3},{value:"Variables",id:"variables",level:2},{value:"Types",id:"types",level:2},{value:"string",id:"string",level:3},{value:"string(s)",id:"strings",level:3},{value:"integer",id:"integer",level:3},{value:"list",id:"list",level:3},{value:"dict",id:"dict",level:3},{value:"dict(s)",id:"dicts",level:3},{value:"Packaging practices",id:"packaging-practices",level:2}];function h(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"packageyml",children:(0,i.jsx)(s.code,{children:"package.yml"})})}),"\n",(0,i.jsxs)(s.p,{children:["Each package is generated from a single build file named ",(0,i.jsx)(s.code,{children:"package.yml"}),'. This file is sometimes also called a "recipe" since it provides steps for building a package. It provides all of the required metadata for the package manager, plus the packaging steps involved to produce a package. This file follows the YAML specification.']}),"\n",(0,i.jsx)(s.h2,{id:"format",children:"Format"}),"\n",(0,i.jsxs)(s.p,{children:["All ",(0,i.jsx)(s.code,{children:"package.yml"})," files ",(0,i.jsx)(s.strong,{children:"must"})," be valid YAML."]}),"\n",(0,i.jsxs)(s.p,{children:["The file is organised into a key\u2192value hierarchy. The ",(0,i.jsx)(s.code,{children:"ypkg"})," tool parses a ",(0,i.jsx)(s.code,{children:"package.yml"})," file to build the corresponding package in a declarative manner. As such, most of the keys are simple strings, lists or nested key\u2192value pairs. A special case consists in the packaging steps, which are scripts."]}),"\n",(0,i.jsx)(s.p,{children:"An example file follows:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-yaml",children:"name : nano\nversion : 2.9.5\nrelease : 96\nsource :\n - https://www.nano-editor.org/dist/v2.9/nano-2.9.5.tar.xz: 7b8d181cb57f42fa86a380bb9ad46abab859b60383607f731b65a9077f4b4e19\nhomepage : https://www.nano-editor.org\nlicense : GPL-3.0-or-later\nsummary : Small, friendly text editor inspired by Pico\ncomponent : system.devel\ndescription: |\n GNU nano is an easy-to-use text editor originally designed as a replacement for Pico, the ncurses-based editor from the non-free mailer package Pine (itself now available under the Apache License as Alpine).\nsetup : |\n %patch -p1 -i $pkgfiles/0001-Use-a-stateless-configuration.patch\n %reconfigure --enable-utf8 --docdir=/usr/share/doc/nano\nbuild : |\n %make\ninstall : |\n %make_install\n install -D -m 00644 $pkgfiles/nanorc $installdir/usr/share/defaults/nano/nanorc\n install -D -m 00644 $pkgfiles/git.nanorc $installdir/usr/share/nano/git.nanorc\n # https://github.com/scopatz/nanorc\n for rcFile in $pkgfiles/nanorc-extras/*.nanorc; do\n install -m 00644 $rcFile $installdir/usr/share/nano\n done\n"})}),"\n",(0,i.jsx)(s.h2,{id:"keys",children:"Keys"}),"\n",(0,i.jsxs)(s.p,{children:["Not all fields in ",(0,i.jsx)(s.code,{children:"package.yml"})," are mandatory, but a small selection are. Below is the complete list of the available fields."]}),"\n",(0,i.jsx)(s.h3,{id:"mandatory-keys",children:"Mandatory keys"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Key Name"}),(0,i.jsx)(s.th,{children:"Type"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"name"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsx)(s.td,{children:"The name of the package. This is also used as the base of all sub-package names. Unless unavoidable, this should match the upstream name."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"version"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsx)(s.td,{children:"The version of the currently packaged software. This is taken from the tarball in most cases."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"release"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"integer"})}),(0,i.jsxs)(s.td,{children:["Specifies the current release number. Updates in the package number are based on this ",(0,i.jsx)(s.code,{children:"release"})," number, ",(0,i.jsx)(s.em,{children:"not"})," the ",(0,i.jsx)(s.code,{children:"version"})," number. As such, to release an update to users, this number must be incremented by one."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"source"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"dict(s)"})}),(0,i.jsxs)(s.td,{children:["See ",(0,i.jsx)(s.a,{href:"/docs/packaging/package.yml#source-key",children:"source key"})," below."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"homepage"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsx)(s.td,{children:"Provides a link to the package's homepage, used in the Software Center."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"license"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string(s)"})}),(0,i.jsxs)(s.td,{children:["Valid upstream license(s). Try to ensure these use ",(0,i.jsx)(s.a,{href:"https://spdx.org/licenses/",children:"SPDX identifiers"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"summary"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsx)(s.td,{children:"Brief package summary, or display name."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"component"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsxs)(s.td,{children:["Component / group of packages this package belongs to. Check available components via ",(0,i.jsx)(s.code,{children:"eopkg lc"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"description"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string"})}),(0,i.jsx)(s.td,{children:"More extensive description of the software, usually taken from the vendor website."})]})]})]}),"\n",(0,i.jsx)(s.h4,{id:"source-key",children:'"source" key'}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Tarball source","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:['Upstream source URL to the source code archive (often called the "tarball"), followed by the ',(0,i.jsx)(s.code,{children:"sha256sum"})," for the tarball, as a value."]}),"\n",(0,i.jsxs)(s.li,{children:["Example: ",(0,i.jsx)(s.code,{children:"https://www.nano-editor.org/dist/v7/nano-7.2.tar.xz : 86f3442768bd2873cec693f83cdf80b4b444ad3cc14760b74361474fc87a4526"})]}),"\n",(0,i.jsx)(s.li,{children:"Tarball sources are preferred over git sources, whenever possible, because git tags can be changed to point to different commits."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["Git source","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Git repository URL prefixed with ",(0,i.jsx)(s.code,{children:"git|"}),", followed by the git tag or commit hash, as a value."]}),"\n",(0,i.jsxs)(s.li,{children:["Example: ",(0,i.jsx)(s.code,{children:"git|https://github.com/getsolus/solus-sc.git : 6e786b3e86982272717ca4bed4f783fc43a678f3"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["Multiple sources","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["If multiple sources are listed, only the first source will be copied from the ",(0,i.jsx)(s.code,{children:"$sources"})," directory to the ",(0,i.jsx)(s.code,{children:"$workdir"})," directory."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["Renaming sources","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"If the file resulting from the source download needs to be renamed (often to avoid a name that would conflict with another source), add the preferred name to the URL as a URI fragment."}),"\n",(0,i.jsxs)(s.li,{children:["Example: ",(0,i.jsx)(s.code,{children:"https://github.com/docker/cli/archive/refs/tags/v25.0.3.tar.gz#docker-cli.tar.gz : 04ad0cea992a65db20cb1b0dbf6d1ce32c705ce879de51b22095fe8d28030815"})]}),"\n",(0,i.jsxs)(s.li,{children:["This renames the downloaded file from ",(0,i.jsx)(s.code,{children:"v25.0.3.tar.gz"})," to ",(0,i.jsx)(s.code,{children:"docker-cli.tar.gz"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["SourceForge sources","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["A proper SourceForge source looks like this, using ",(0,i.jsx)(s.code,{children:"hplip"})," as an example: ",(0,i.jsx)(s.code,{children:"https://sourceforge.net/projects/hplip/files/hplip/3.24.4/hplip-3.24.4.tar.gz"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["This URL begins with ",(0,i.jsx)(s.code,{children:"https://sourceforge.net/"}),", not ",(0,i.jsx)(s.code,{children:"https://downloads.sourceforge.net/"}),", or some other mirror."]}),"\n",(0,i.jsxs)(s.li,{children:["This URL has a path beginning with ",(0,i.jsx)(s.code,{children:"/projects/$project_name/"})]}),"\n",(0,i.jsxs)(s.li,{children:["This URL does ",(0,i.jsx)(s.em,{children:"not"})," have a trailing ",(0,i.jsx)(s.code,{children:"/download"}),", you may have to remove this by hand."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.li,{children:'The correct SourceForge tarball URLs are found under the "Files" tab, then often within a directory, when starting from a project homepage on SourceForge.'}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"optional-supported-keys",children:"Optional, supported keys"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Key Name"}),(0,i.jsx)(s.th,{children:"Type"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"clang"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"yes"})," if this package benefits from being built with Clang."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"extract"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"no"})," to disable automatic source extraction."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"autodep"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"no"})," to disable automatic binary dependency resolution at build time."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"emul32"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"yes"})," to enable an ",(0,i.jsx)(s.code,{children:"-m32"})," build (32-bit libs)."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"libsplit"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"no"})," to disable splitting of libraries into ",(0,i.jsx)(s.code,{children:"devel"})," sub-packages."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"conflicts"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"string(s)"})}),(0,i.jsx)(s.td,{children:"Specify packages that cannot be installed together with this one."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"optimize"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"list"})}),(0,i.jsxs)(s.td,{children:["Specify preset keys to modify compiler and linker flags during build. You can learn more ",(0,i.jsx)(s.a,{href:"/docs/packaging/package.yml#optimize-values",children:"here"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"builddeps"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"list"})}),(0,i.jsxs)(s.td,{children:["Specify build dependencies for the package. You can learn more ",(0,i.jsx)(s.a,{href:"/docs/packaging/packaging-practices#build-dependencies",children:"here"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"rundeps"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"dict(s)"})}),(0,i.jsxs)(s.td,{children:["Specify further runtime dependencies for the packages. You can learn more ",(0,i.jsx)(s.a,{href:"/docs/packaging/packaging-practices#runtime-dependencies",children:"here"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"checkdeps"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"dict(s)"})}),(0,i.jsxs)(s.td,{children:["Specify build dependencies for the package which will ",(0,i.jsx)(s.em,{children:"not"})," be considered when determining build order for automatic builds. These dependencies should only be used during the ",(0,i.jsx)(s.code,{children:"check"})," build phase. You can learn more ",(0,i.jsx)(s.a,{href:"/docs/packaging/packaging-practices#check-dependencies",children:"here"})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"replaces"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"dict(s)"})}),(0,i.jsx)(s.td,{children:"Replace one package with another, used when renaming or deprecating packages for clean upgrade paths."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"patterns"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"dict(s)"})}),(0,i.jsxs)(s.td,{children:["Allows fine grained control over file placement within the package or sub-packages. Useful for packages that are development only (i.e. ",(0,i.jsx)(s.code,{children:"/usr/bin"})," files)."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"environment"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"unicode"})}),(0,i.jsx)(s.td,{children:"Specify code that will be exported to all packaging steps of the build (i.e. exporting variables for the entire build)."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"networking"})}),(0,i.jsx)(s.td,{children:(0,i.jsx)(s.code,{children:"bool"})}),(0,i.jsxs)(s.td,{children:["Set to ",(0,i.jsx)(s.code,{children:"yes"})," to enable networking within solbuild."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"packaging-step-keys-optional",children:"Packaging step keys, optional"}),"\n",(0,i.jsxs)(s.p,{children:["The packaging steps are all considered optional, however the absence of the ",(0,i.jsx)(s.code,{children:"install"})," step will result in no package generated. Each of these keys contains content that will be placed within a script and executed within a controlled environment to perform the package build. For all intents and purposes, they are Bash scripts with a predefined environment."]}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Step Name"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"setup"})}),(0,i.jsxs)(s.td,{children:["Performed after the source extraction. This is the correct place to perform any ",(0,i.jsx)(s.code,{children:"configure"})," routine, or to ",(0,i.jsx)(s.code,{children:"patch"})," the sources."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"build"})}),(0,i.jsxs)(s.td,{children:["Use this step to run the build portion, for example, ",(0,i.jsx)(s.code,{children:"make"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"install"})}),(0,i.jsxs)(s.td,{children:["This is where you should install the files into the final packaging directory, for example, ",(0,i.jsx)(s.code,{children:"make install"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"check"})}),(0,i.jsxs)(s.td,{children:["This is where tests / checking should occur, for example, ",(0,i.jsx)(s.code,{children:"make check"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"profile"})}),(0,i.jsxs)(s.td,{children:["This is where profiling tests should be specified. ",(0,i.jsx)(s.code,{children:"ypkg"})," will handle setting flags to generate profiling data and using that data for an optimized build."]})]})]})]}),"\n",(0,i.jsx)(s.h2,{id:"optimize-values",children:"Optimize values"}),"\n",(0,i.jsxs)(s.p,{children:["One or more optimize values can be specified in a list with the ",(0,i.jsx)(s.code,{children:"optimize"})," key in the ",(0,i.jsx)(s.code,{children:"package.yml"})," file. Several values can override or conflict with each other and should be used only where they provide a performance benefit, or fix a bug in the package or build."]}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Optimize Value"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"speed"})}),(0,i.jsxs)(s.td,{children:["Optimizes the package for performance ",(0,i.jsx)(s.code,{children:"-O3"})," plus other flags."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"size"})}),(0,i.jsxs)(s.td,{children:["Optimizes the package build to minimize size ",(0,i.jsx)(s.code,{children:"-Os"}),". Not supported with clang."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"no-bind-now"})}),(0,i.jsx)(s.td,{children:"Configures the package to disable certain flags, where RELRO is unsupported."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"no-symbolic"})}),(0,i.jsxs)(s.td,{children:["Disables ",(0,i.jsx)(s.code,{children:"-Wl,-Bsymbolic-functions"})," linker flag."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"unroll-loops"})}),(0,i.jsxs)(s.td,{children:["Enables ",(0,i.jsx)(s.code,{children:"-funroll-loops"}),". Use this sparingly, only when it provides proven benefit."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"runpath"})}),(0,i.jsxs)(s.td,{children:["Enables ",(0,i.jsx)(s.code,{children:"-Wl,--enable-new-dtags"})," to make linker use RUNPATH's instead of RPATH's."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"avx256"})}),(0,i.jsxs)(s.td,{children:["Disables ",(0,i.jsx)(s.code,{children:"-mprefer-vector-width=128"})," in avx2 builds."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"thin-lto"})}),(0,i.jsxs)(s.td,{children:["Enables Thin Link Time Optimization ",(0,i.jsx)(s.code,{children:"-flto=thin"})," with a supported linker."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"lto"})}),(0,i.jsxs)(s.td,{children:["Enables Link Time Optimization ",(0,i.jsx)(s.code,{children:"-flto"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"icf-safe"})}),(0,i.jsxs)(s.td,{children:["Enables safe Identical Cold Folding ",(0,i.jsx)(s.code,{children:"--icf=safe"}),". ",(0,i.jsx)(s.code,{children:"function-sections"})," is recommended when not using clang. Uses gold linker when not using clang."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"icf-all"})}),(0,i.jsxs)(s.td,{children:["Enables Identical Cold Folding ",(0,i.jsx)(s.code,{children:"--icf=all"}),". ",(0,i.jsx)(s.code,{children:"function-sections"})," is recommended when not using clang. Uses gold linker when not using clang."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"polly"})}),(0,i.jsx)(s.td,{children:"Enables polyhedral optimizations for the clang toolchain."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"function-sections"})}),(0,i.jsx)(s.td,{children:"Generate a separate ELF section for each function. Recommended with ICF when not using clang."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"no-reorder-blocks-partition"})}),(0,i.jsx)(s.td,{children:"Disables block partition reordering with the gcc toolchain. Provided to facilitate BOLT'ed binaries/libraries."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"emit-relocs"})}),(0,i.jsx)(s.td,{children:"Instructs the linker to emit relocations. Provided to facilitate BOLT'ed binaries/libraries."})]})]})]}),"\n",(0,i.jsx)(s.h2,{id:"macros",children:"Macros"}),"\n",(0,i.jsx)(s.p,{children:"To further assist in packaging, a number of macros are available. These are simply shorthand ways to perform a normal build operation. They also ensure that the resulting package is consistent. These macros are only available in our packaging steps, as they are substituted within the script before execution."}),"\n",(0,i.jsx)(s.h3,{id:"usage",children:"Usage"}),"\n",(0,i.jsxs)(s.p,{children:["Macros are prefixed with ",(0,i.jsx)(s.code,{children:"%"}),", and are substituted before your script is executed. Macros ending with ",(0,i.jsx)(s.code,{children:"%"})," are used to provide directory names or build values to the script."]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"# Run the configure macro with the given arguments\n%configure --disable-static\n"})}),"\n",(0,i.jsx)(s.h3,{id:"actionable-macros",children:"Actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%autogen"})}),(0,i.jsxs)(s.td,{children:["Runs autogen with our ",(0,i.jsx)(s.code,{children:"%CONFOPTS%"})," to create a configure script then proceeds to run ",(0,i.jsx)(s.code,{children:"%configure"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cmake"})}),(0,i.jsx)(s.td,{children:"Configures a CMake project with the distribution specific options, such as prefix and release type."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cmake_ninja"})}),(0,i.jsxs)(s.td,{children:["Configures a CMake project with ninja so it can be used with ",(0,i.jsx)(s.code,{children:"%ninja_build"}),", ",(0,i.jsx)(s.code,{children:"%ninja_install"})," and ",(0,i.jsx)(s.code,{children:"%ninja_check"})," macros."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%configure"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"./configure"})," with our ",(0,i.jsx)(s.code,{children:"%CONFOPTS%"})," variable macro."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%configure_no_runstatedir"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"%configure"})," without the ",(0,i.jsx)(s.code,{children:"--runstatedir"})," option. Use if you encounter ",(0,i.jsx)(s.code,{children:"configure: error: unrecognized option: '--runstatedir=/run'"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%make"})}),(0,i.jsxs)(s.td,{children:["Runs the ",(0,i.jsx)(s.code,{children:"make"})," command with the job count specified in ",(0,i.jsx)(s.code,{children:"eopkg.conf"})," (",(0,i.jsx)(s.a,{href:"/docs/packaging/advanced-config/eopkg-configuration",children:"more info"}),")."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%make_install"})}),(0,i.jsxs)(s.td,{children:["Performs a ",(0,i.jsx)(s.code,{children:"make install"}),", using the ",(0,i.jsx)(s.code,{children:"DESTDIR"})," variant. Should work for the vast majority of packages."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%patch"})}),(0,i.jsx)(s.td,{children:"Sane patch macro to run in batch mode and not contaminate source tree on failure."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%apply_patches"})}),(0,i.jsxs)(s.td,{children:["Applies all patches listed in the ",(0,i.jsx)(s.code,{children:"series"})," file in ",(0,i.jsx)(s.code,{children:"./files"})," folder."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%reconfigure"})}),(0,i.jsxs)(s.td,{children:["Updates build scripts such as ",(0,i.jsx)(s.code,{children:"./configure"})," and proceeds to run ",(0,i.jsx)(s.code,{children:"%configure"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%symlink_check"})}),(0,i.jsx)(s.td,{children:"Checks for broken symlinks in the install directory and aborts the build if any are found. Must run after install macros."})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"haskell-actionable-macros",children:"Haskell actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cabal_configure"})}),(0,i.jsx)(s.td,{children:"Configures a Cabal project that requires online dependencies, like a Cargo-style build"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%haskell_configure"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"runhaskell configure"})," with prefix, libdir, etc. and ensures the necessary package.conf.d is copied to the correct location."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%haskell_build"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"runhaskell build"})," with ",(0,i.jsx)(s.code,{children:"%JOBS%"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%haskell_install"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"runhaskell copy"})," to ",(0,i.jsx)(s.code,{children:"$installdir"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%haskell_register"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"runhaskell register"})," to generate a pkg-config for package and version, then installs the conf file."]})]})]})]}),"\n",(0,i.jsxs)(s.p,{children:["Existing Haskell packages may use the old ",(0,i.jsx)(s.code,{children:"cabal_build"}),", ",(0,i.jsx)(s.code,{children:"cabal_install"}),", ",(0,i.jsx)(s.code,{children:"cabal_register"})," macros. Please use the new ",(0,i.jsx)(s.code,{children:"haskell_*"})," macros instead."]}),"\n",(0,i.jsx)(s.h3,{id:"ninja-actionable-macros",children:"Ninja actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%meson_configure"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"meson"})," with our CFLAGS and appropriate flags such as ",(0,i.jsx)(s.code,{children:"libdir"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%ninja_build"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"ninja"})," and passes our ",(0,i.jsx)(s.code,{children:"%JOBS%"})," variable. This macro obsoletes ",(0,i.jsx)(s.em,{children:"%meson_build"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%ninja_install"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"ninja install"})," and passes the appropriate ",(0,i.jsx)(s.code,{children:"DESTDIR"})," and ",(0,i.jsx)(s.code,{children:"%JOBS%"})," variable. This macro obsoletes ",(0,i.jsx)(s.em,{children:"%meson_install"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%ninja_check"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"ninja test"})," and passes our ",(0,i.jsx)(s.code,{children:"%JOBS%"})," variable. This macro obsoletes ",(0,i.jsx)(s.em,{children:"%meson_check"}),"."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"perl-actionable-macros",children:"Perl actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%perl_setup"})}),(0,i.jsxs)(s.td,{children:["Runs Perl setup scripts ",(0,i.jsx)(s.code,{children:"Build.pl"})," or ",(0,i.jsx)(s.code,{children:"Makefile.pl"})," with the appropriate variable flags."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%perl_build"})}),(0,i.jsxs)(s.td,{children:["Runs Perl build scripts or attempts ",(0,i.jsx)(s.code,{children:"%make"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%perl_install"})}),(0,i.jsxs)(s.td,{children:["Runs Perl install scripts or attempts ",(0,i.jsx)(s.code,{children:"%make_install"}),"."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"python-actionable-macros",children:"Python actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python_setup"})}),(0,i.jsx)(s.td,{children:"Runs the build portion of a setup.py using python2."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python_install"})}),(0,i.jsx)(s.td,{children:"Runs the install portion of a setup.py, to the appropriate root, using python2."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python_test"})}),(0,i.jsxs)(s.td,{children:["Without argument, runs the test portion of setup.py. With a ",(0,i.jsx)(s.code,{children:".py"}),' script, execute the script with python2. With something else execute the command "as it is". (',(0,i.jsx)(s.a,{href:"https://github.com/getsolus/ypkg/pull/1",children:"More info"}),")"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python_compile"})}),(0,i.jsxs)(s.td,{children:["Compiles ",(0,i.jsx)(s.code,{children:"*.py"})," files using python2. This is only useful where the build doesn't compile them already (indicated by availability of ",(0,i.jsx)(s.code,{children:"*.pyc"})," files)."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python3_setup"})}),(0,i.jsx)(s.td,{children:"Runs the build portion of a setup.py using python3."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python3_install"})}),(0,i.jsx)(s.td,{children:"Runs the install portion of a setup.py, to the appropriate root, using python3."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python3_test"})}),(0,i.jsxs)(s.td,{children:["Without argument, runs the test portion of setup.py. With a ",(0,i.jsx)(s.code,{children:".py"}),' script, execute the script with python3. With something else execute the command "as it is". (',(0,i.jsx)(s.a,{href:"https://github.com/getsolus/ypkg/pull/1",children:"More info"}),")"]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python3_compile"})}),(0,i.jsxs)(s.td,{children:["Compiles ",(0,i.jsx)(s.code,{children:"*.py"})," files using python3. This is only useful where the build doesn't compile them already (indicated by availability of ",(0,i.jsx)(s.code,{children:"*.pyc"})," files)."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"ruby-actionable-macros",children:"Ruby actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%gem_build"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"gem build"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%gem_install"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"gem install"})," with the appropriate parameters."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"rust-cargo-actionable-macros",children:"Rust (cargo) actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cargo_fetch"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"cargo fetch --locked"})," to get dependencies."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cargo_build"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"cargo build"})," with some additional flags."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cargo_install"})}),(0,i.jsxs)(s.td,{children:["Installs the built binary to ",(0,i.jsx)(s.code,{children:"/usr/bin/PACKAGE-NAME"}),", OR to ",(0,i.jsx)(s.code,{children:"/usr/bin/ARGUMENT"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%cargo_test"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"cargo test"})," with some additional flags."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"qt-actionable-macros",children:"Qt actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%qmake"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"qmake"})," for Qt5 with the appropriate make flags."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%qmake4"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"qmake"})," for Qt4, as well as adding the necessary MOC, RCC, and UIC flags since those Qt4 executables end in -qt4."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%qml_cache"})}),(0,i.jsxs)(s.td,{children:["Compiles ",(0,i.jsx)(s.code,{children:"*.qml"})," files into ",(0,i.jsx)(s.code,{children:"*.qmlc"})," so they are compiled ahead of time."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%qml6_cache"})}),(0,i.jsxs)(s.td,{children:["Same as ",(0,i.jsx)(s.code,{children:"%qml_cache"}),", but for Qt6."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"waf-actionable-macros",children:"Waf actionable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%waf_configure"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"waf configure"})," with prefix."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%waf_build"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"waf"})," and passes our ",(0,i.jsx)(s.code,{children:"%JOBS%"})," variable."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%waf_install"})}),(0,i.jsxs)(s.td,{children:["Runs ",(0,i.jsx)(s.code,{children:"waf install"})," and passes the appropriate ",(0,i.jsx)(s.code,{children:"destdir"})," and ",(0,i.jsx)(s.code,{children:"%JOBS%"})," variable."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"bolt-actionable-macros",children:"BOLT actionable macros"}),"\n",(0,i.jsx)(s.p,{children:"BOLT is a post-link optimizer developed to speed up large applications. You will need to run a workload after instrumenting a binary or library. Think of it as post-link profile guided optimization."}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%bolt_instr"})}),(0,i.jsxs)(s.td,{children:["Instrument a binary or library with llvm-bolt. Requires it to be built with ",(0,i.jsx)(s.code,{children:"emit-relocs"}),", as well as ",(0,i.jsx)(s.code,{children:"no-reorder-blocks-partition"})," if not using clang."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%bolt_merge"})}),(0,i.jsx)(s.td,{children:"Merge fdata profiles into a single file after running a workload with a BOLT instrumented binary."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%bolt_opt"})}),(0,i.jsxs)(s.td,{children:["Optimize a binary using BOLT after running ",(0,i.jsx)(s.code,{children:"%bolt_merge"}),"."]})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"variable-macros",children:"Variable macros"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Macro"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%ARCH%"})}),(0,i.jsx)(s.td,{children:"Indicates the current build architecture."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%CC%"})}),(0,i.jsx)(s.td,{children:"C compiler."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%CFLAGS%"})}),(0,i.jsxs)(s.td,{children:["cflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%CONFOPTS%"})}),(0,i.jsxs)(s.td,{children:["Flags / options for configuration, such as ",(0,i.jsx)(s.code,{children:"--prefix=%PREFIX%"}),". ",(0,i.jsx)(s.a,{href:"https://github.com/getsolus/ypkg/blob/v33/ypkg2/rc.yml#L446-L458",children:"Full List."})]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%CXX%"})}),(0,i.jsx)(s.td,{children:"C++ compiler."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%CXXFLAGS%"})}),(0,i.jsxs)(s.td,{children:["cxxflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%JOBS%"})}),(0,i.jsxs)(s.td,{children:["jobs, as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%LDFLAGS%"})}),(0,i.jsxs)(s.td,{children:["ldflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%LIBSUFFIX%"})}),(0,i.jsx)(s.td,{children:"Library suffix (either 32 for 32-bit or 64 for 64-bit)."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%PREFIX%"})}),(0,i.jsxs)(s.td,{children:["Hard-coded prefix ",(0,i.jsx)(s.code,{children:"/usr"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%YJOBS%"})}),(0,i.jsxs)(s.td,{children:["Job count without ",(0,i.jsx)(s.code,{children:"-j"})," as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%installroot%"})}),(0,i.jsx)(s.td,{children:"Hard-coded install directory."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%libdir%"})}),(0,i.jsxs)(s.td,{children:["The distribution\u2019s default library directory, i.e. ",(0,i.jsx)(s.code,{children:"/usr/lib64"})," (Alters for ",(0,i.jsx)(s.code,{children:"emul32"}),")."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%version%"})}),(0,i.jsxs)(s.td,{children:["Version of the package, as specified in the ",(0,i.jsx)(s.code,{children:"version"})," key."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%workdir%"})}),(0,i.jsx)(s.td,{children:"Hard-coded work directory (source tree)."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%kernel_version_lts%"})}),(0,i.jsxs)(s.td,{children:["Version of the ",(0,i.jsx)(s.code,{children:"linux-lts"})," kernel."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%kernel_version_current%"})}),(0,i.jsxs)(s.td,{children:["Version of the ",(0,i.jsx)(s.code,{children:"linux-current"})," kernel."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python2_version%"})}),(0,i.jsxs)(s.td,{children:["Version of the ",(0,i.jsx)(s.code,{children:"python"})," (Python 2) distribution."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"%python3_version%"})}),(0,i.jsxs)(s.td,{children:["Version of the ",(0,i.jsx)(s.code,{children:"python3"})," distribution."]})]})]})]}),"\n",(0,i.jsx)(s.h2,{id:"variables",children:"Variables"}),"\n",(0,i.jsx)(s.p,{children:"A set of variables are exported in our build stages. These are used to provide context and structure to the scripts."}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Variable"}),(0,i.jsx)(s.th,{children:"Description"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$CFLAGS"})}),(0,i.jsxs)(s.td,{children:["cflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$CXXFLAGS"})}),(0,i.jsxs)(s.td,{children:["cxxflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$LDFLAGS"})}),(0,i.jsxs)(s.td,{children:["ldflags as set in ",(0,i.jsx)(s.code,{children:"eopkg.conf"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$CC"})}),(0,i.jsx)(s.td,{children:"C compiler."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$CXX"})}),(0,i.jsx)(s.td,{children:"C++ compiler."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$EMUL32BUILD"})}),(0,i.jsxs)(s.td,{children:["Set only when compiling in ",(0,i.jsx)(s.code,{children:"emul32"})," mode."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$AVX2BUILD"})}),(0,i.jsxs)(s.td,{children:["Set only when compiling in ",(0,i.jsx)(s.code,{children:"avx2"})," mode."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$PGO_GEN_BUILD"})}),(0,i.jsx)(s.td,{children:"Set during the instrumentation phase of a PGO build."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$PGO_USE_BUILD"})}),(0,i.jsx)(s.td,{children:"Set during the use phase of a PGO build."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$installdir"})}),(0,i.jsx)(s.td,{children:"The install directory, i.e. where files are installed to for packaging."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$pkgfiles"})}),(0,i.jsxs)(s.td,{children:["Refers to the ",(0,i.jsx)(s.code,{children:"./files"})," directory relative to the ",(0,i.jsx)(s.code,{children:"package.yml"})," file."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$sources"})}),(0,i.jsxs)(s.td,{children:["Refers to the directory where your source files are stored, for example, ",(0,i.jsx)(s.code,{children:"$sources/nano.tar.gz"}),"."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:(0,i.jsx)(s.strong,{children:"$workdir"})}),(0,i.jsx)(s.td,{children:"The work, or source, directory of the package build."})]})]})]}),"\n",(0,i.jsx)(s.h2,{id:"types",children:"Types"}),"\n",(0,i.jsxs)(s.p,{children:["The ",(0,i.jsx)(s.code,{children:"package.yml"})," file uses native YAML types, however it follows syntactic conventions and may accept multiple value types for a given key."]}),"\n",(0,i.jsx)(s.h3,{id:"string",children:"string"}),"\n",(0,i.jsx)(s.p,{children:"This is simply text, which does not need to be quoted."}),"\n",(0,i.jsx)(s.h3,{id:"strings",children:"string(s)"}),"\n",(0,i.jsxs)(s.p,{children:["Indicates that it is possible to use a ",(0,i.jsx)(s.code,{children:"list"})," of strings, or one single ",(0,i.jsx)(s.code,{children:"string"}),"."]}),"\n",(0,i.jsx)(s.h3,{id:"integer",children:"integer"}),"\n",(0,i.jsxs)(s.p,{children:["Whole, positive number, used in the ",(0,i.jsx)(s.code,{children:"release"})," field."]}),"\n",(0,i.jsx)(s.h3,{id:"list",children:"list"}),"\n",(0,i.jsx)(s.p,{children:"A YAML list (or array) can be expressed in multiple ways. A short array-notation would look like this:"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.code,{children:"[one, two, three]"})}),"\n",(0,i.jsx)(s.p,{children:"They can also be expressed like this:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-yaml",children:"- First Value\n- Second Value\n- Third Value\n"})}),"\n",(0,i.jsx)(s.h3,{id:"dict",children:"dict"}),"\n",(0,i.jsxs)(s.p,{children:["Known as an associative array, this is key to value mapping. These are separated by a colon (",(0,i.jsx)(s.code,{children:":"}),"), the token on the left is taken to be a key, and the token on the right is the value."]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.code,{children:"SomeKey: Some Value"})}),"\n",(0,i.jsxs)(s.p,{children:["Note that each ",(0,i.jsx)(s.code,{children:"ypkg key"})," in the YAML file is actually a dict."]}),"\n",(0,i.jsx)(s.h3,{id:"dicts",children:"dict(s)"}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.code,{children:"dict(s)"})," consists of a list of ",(0,i.jsx)(s.code,{children:"dict"}),"s and some assumptions. We primarily make use of this to express advanced information within the package. These permit you to provide no key, and a value only.\nIn this instance, the key is implicitly assumed to be the package name (for example, ",(0,i.jsx)(s.code,{children:"nano"}),"):"]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.code,{children:"- some value"})}),"\n",(0,i.jsx)(s.p,{children:"An explicit key, usually a sub-package name:"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.code,{children:"- somekey: somevalue"})}),"\n",(0,i.jsx)(s.p,{children:"A mix of both:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-yaml",children:"- somevalue\n- somekey: another value\n"})}),"\n",(0,i.jsx)(s.p,{children:"The values may also be expressed in list form, still using the same default key logic:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-yaml",children:"- [one, two, three]\n- somekey: [one, two, three]\n- key:\n - value one\n - value two\n - value three\n"})}),"\n",(0,i.jsx)(s.h2,{id:"packaging-practices",children:"Packaging practices"}),"\n",(0,i.jsxs)(s.p,{children:["The concepts in this document merely expose the syntax of a ",(0,i.jsx)(s.code,{children:"package.yml"})," file. Solus adheres to strict packaging practices and conventions which packagers must follow. They are explained in the ",(0,i.jsx)(s.a,{href:"/docs/packaging/packaging-practices",children:"Packaging Practices"})," article."]})]})}function a(e={}){const{wrapper:s}={...(0,r.a)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},11151:(e,s,n)=>{n.d(s,{Z:()=>c,a:()=>l});var i=n(67294);const r={},d=i.createContext(r);function l(e){const s=i.useContext(d);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),i.createElement(d.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/418a6276.42385bff.js b/assets/js/418a6276.42385bff.js new file mode 100644 index 000000000..13ead6417 --- /dev/null +++ b/assets/js/418a6276.42385bff.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6160],{71697:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>r,contentTitle:()=>a,default:()=>p,frontMatter:()=>l,metadata:()=>i,toc:()=>g});var s=t(85893),n=t(11151);const l={title:"eopkg is dead, long live eopkg",slug:"eopkg-is-dead-long-live-eopkg",authors:"david",tags:["eopkg","devlog","moss","solus"],hide_table_of_contents:!1},a=void 0,i={permalink:"/blog/eopkg-is-dead-long-live-eopkg",source:"@site/devlog/2024-01-19-eopkg-is-dead.md",title:"eopkg is dead, long live eopkg",description:"Close watchers of our packages repository may have noticed some strange looking items:",date:"2024-01-19T00:00:00.000Z",tags:[{inline:!0,label:"eopkg",permalink:"/blog/tags/eopkg"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"moss",permalink:"/blog/tags/moss"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:1.645,hasTruncateMarker:!0,authors:[{name:"David Harder",title:"Solus Staff",page:{permalink:"/blog/authors/david"},socials:{github:"https://github.com/davidjharder"},imageURL:"https://avatars.githubusercontent.com/u/23007135",key:"david"}],frontMatter:{title:"eopkg is dead, long live eopkg",slug:"eopkg-is-dead-long-live-eopkg",authors:"david",tags:["eopkg","devlog","moss","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Don't call me MATE, pal!",permalink:"/blog/don't-call-me-mate-pal"},nextItem:{title:"Welcome to the Solus Devlog",permalink:"/blog/welcome-solus-devlog-v1"}},r={authorsImageUrls:[void 0]},g=[];function c(e){const o={a:"a",li:"li",p:"p",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(o.p,{children:["Close watchers of our ",(0,s.jsx)(o.a,{href:"https://github.com/getsolus/packages",children:"packages repository"})," may have noticed some strange looking items:"]}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsx)(o.li,{children:(0,s.jsx)(o.a,{href:"https://github.com/getsolus/packages/pull/1305",children:"Initial inclusion of eopkg4-bin"})}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.a,{href:"https://github.com/getsolus/packages/issues/1316",children:"Testing the eopkg4-bin package"})," Warning: Minions GIF"]}),"\n"]}),"\n",(0,s.jsx)(o.p,{children:"It's a long story."})]})}function p(e={}){const{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,o,t)=>{t.d(o,{Z:()=>i,a:()=>a});var s=t(67294);const n={},l=s.createContext(n);function a(e){const o=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function i(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),s.createElement(l.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/418a6276.bc82d44b.js b/assets/js/418a6276.bc82d44b.js deleted file mode 100644 index 18241611c..000000000 --- a/assets/js/418a6276.bc82d44b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6160],{71697:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>r,contentTitle:()=>a,default:()=>p,frontMatter:()=>l,metadata:()=>i,toc:()=>g});var s=t(85893),n=t(11151);const l={title:"eopkg is dead, long live eopkg",slug:"eopkg-is-dead-long-live-eopkg",authors:"david",tags:["eopkg","devlog","moss","solus"],hide_table_of_contents:!1},a=void 0,i={permalink:"/blog/eopkg-is-dead-long-live-eopkg",source:"@site/devlog/2024-01-19-eopkg-is-dead.md",title:"eopkg is dead, long live eopkg",description:"Close watchers of our packages repository may have noticed some strange looking items:",date:"2024-01-19T00:00:00.000Z",tags:[{inline:!0,label:"eopkg",permalink:"/blog/tags/eopkg"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"moss",permalink:"/blog/tags/moss"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:1.645,hasTruncateMarker:!0,authors:[{name:"David Harder",title:"Solus Staff",page:{permalink:"/blog/authors/david"},socials:{github:"https://github.com/davidjharder"},imageURL:"https://avatars.githubusercontent.com/u/23007135?v=4",key:"david"}],frontMatter:{title:"eopkg is dead, long live eopkg",slug:"eopkg-is-dead-long-live-eopkg",authors:"david",tags:["eopkg","devlog","moss","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Don't call me MATE, pal!",permalink:"/blog/don't-call-me-mate-pal"},nextItem:{title:"Welcome to the Solus Devlog",permalink:"/blog/welcome-solus-devlog-v1"}},r={authorsImageUrls:[void 0]},g=[];function c(e){const o={a:"a",li:"li",p:"p",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(o.p,{children:["Close watchers of our ",(0,s.jsx)(o.a,{href:"https://github.com/getsolus/packages",children:"packages repository"})," may have noticed some strange looking items:"]}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsx)(o.li,{children:(0,s.jsx)(o.a,{href:"https://github.com/getsolus/packages/pull/1305",children:"Initial inclusion of eopkg4-bin"})}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.a,{href:"https://github.com/getsolus/packages/issues/1316",children:"Testing the eopkg4-bin package"})," Warning: Minions GIF"]}),"\n"]}),"\n",(0,s.jsx)(o.p,{children:"It's a long story."})]})}function p(e={}){const{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,o,t)=>{t.d(o,{Z:()=>i,a:()=>a});var s=t(67294);const n={},l=s.createContext(n);function a(e){const o=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function i(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),s.createElement(l.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/41a4de91.c6e74657.js b/assets/js/41a4de91.ae57e1b1.js similarity index 99% rename from assets/js/41a4de91.c6e74657.js rename to assets/js/41a4de91.ae57e1b1.js index 61461b800..663f53aa0 100644 --- a/assets/js/41a4de91.c6e74657.js +++ b/assets/js/41a4de91.ae57e1b1.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7682],{31593:(e,s,o)=>{o.r(s),o.d(s,{assets:()=>d,contentTitle:()=>i,default:()=>c,frontMatter:()=>t,metadata:()=>a,toc:()=>l});var r=o(85893),n=o(11151);const t={title:"Third Party",summary:"Quick Installation guide for all of the Third Party applications Solus can help you install"},i="Third Party",a={id:"user/software/third-party/index",title:"Third Party",description:"The following applications are provided via our 3rd Party Repository to facilitate the installation and usage of them. These applications cannot be included in the primary repository due to licensing issues.",source:"@site/docs/user/software/third-party/index.md",sourceDirName:"user/software/third-party",slug:"/user/software/third-party/",permalink:"/docs/user/software/third-party/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/third-party/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Third Party",summary:"Quick Installation guide for all of the Third Party applications Solus can help you install"},sidebar:"userSidebar",previous:{title:"Sound",permalink:"/docs/user/software/sound/"},next:{title:"Snap",permalink:"/docs/user/software/third-party/snap"}},d={},l=[{value:"Browsers",id:"browsers",level:2},{value:"Google Chrome",id:"google-chrome",level:3},{value:"Google Chrome (Beta)",id:"google-chrome-beta",level:3},{value:"Google Chrome (Dev/Unstable)",id:"google-chrome-devunstable",level:3},{value:"Communication",id:"communication",level:2},{value:"Franz",id:"franz",level:3},{value:"Slack",id:"slack",level:3},{value:"Viber",id:"viber",level:3},{value:"Multimedia",id:"multimedia",level:2},{value:"Bitwig Studio",id:"bitwig-studio",level:3},{value:"Ocenaudio",id:"ocenaudio",level:3},{value:"Plex Media Server",id:"plex-media-server",level:3},{value:"SunVox",id:"sunvox",level:3},{value:"Spotify",id:"spotify",level:3},{value:"Network",id:"network",level:2},{value:"AnyDesk",id:"anydesk",level:3},{value:"Insync",id:"insync",level:3},{value:"Spideroak",id:"spideroak",level:3},{value:"Synology Cloud Station Drive",id:"synology-cloud-station-drive",level:3},{value:"TeamViewer",id:"teamviewer",level:3},{value:"Office",id:"office",level:2},{value:"Mendeley Desktop",id:"mendeley-desktop",level:3},{value:"Microsoft Core Fonts",id:"microsoft-core-fonts",level:3},{value:"Moneydance",id:"moneydance",level:3},{value:"PomoDoneApp",id:"pomodoneapp",level:3},{value:"Scrivener",id:"scrivener",level:3},{value:"Programming",id:"programming",level:2},{value:"Android Studio",id:"android-studio",level:3},{value:"CLion",id:"clion",level:3},{value:"DataGrip",id:"datagrip",level:3},{value:"GitKraken",id:"gitkraken",level:3},{value:"IDEA",id:"idea",level:3},{value:"PhpStorm",id:"phpstorm",level:3},{value:"PyCharm",id:"pycharm",level:3},{value:"Rider",id:"rider",level:3},{value:"RubyMine",id:"rubymine",level:3},{value:"Sublime Text",id:"sublime-text",level:3},{value:"WebStorm",id:"webstorm",level:3},{value:"Security",id:"security",level:2},{value:"Enpass",id:"enpass",level:3},{value:"Other",id:"other",level:2},{value:"Google Earth",id:"google-earth",level:3}];function p(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"third-party",children:"Third Party"})}),"\n",(0,r.jsx)(s.p,{children:"The following applications are provided via our 3rd Party Repository to facilitate the installation and usage of them. These applications cannot be included in the primary repository due to licensing issues."}),"\n",(0,r.jsx)(s.p,{children:"Alongside the following commands, you may also find some of these applications via the Third Party section on our Software Center."}),"\n",(0,r.jsxs)(s.p,{children:["If these instructions fail to work please ",(0,r.jsx)(s.a,{href:"https://github.com/getsolus/3rd-party/issues",children:"file an issue"}),". To upgrade once installed simply run the commands again. If there is a new version it will be installed."]}),"\n",(0,r.jsx)(s.h2,{id:"browsers",children:"Browsers"}),"\n",(0,r.jsx)(s.h3,{id:"google-chrome",children:"Google Chrome"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/web/browser/google-chrome-stable/pspec.xml\nsudo eopkg it google-chrome-*.eopkg;sudo rm google-chrome-*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"google-chrome-beta",children:"Google Chrome (Beta)"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/web/browser/google-chrome-beta/pspec.xml\nsudo eopkg it google-chrome-*.eopkg;sudo rm google-chrome-*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"google-chrome-devunstable",children:"Google Chrome (Dev/Unstable)"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/web/browser/google-chrome-unstable/pspec.xml\nsudo eopkg it google-chrome-*.eopkg;sudo rm google-chrome-*.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"communication",children:"Communication"}),"\n",(0,r.jsx)(s.h3,{id:"franz",children:"Franz"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/im/franz/pspec.xml\nsudo eopkg it franz*.eopkg;sudo rm franz*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"slack",children:"Slack"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/im/slack-desktop/pspec.xml\nsudo eopkg it slack-desktop*.eopkg;sudo rm slack-desktop*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"viber",children:"Viber"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/im/viber/pspec.xml\nsudo eopkg it viber*.eopkg;sudo rm *.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"multimedia",children:"Multimedia"}),"\n",(0,r.jsx)(s.h3,{id:"bitwig-studio",children:"Bitwig Studio"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/multimedia/music/bitwig-studio/pspec.xml\nsudo eopkg it bitwig-studio*.eopkg;sudo rm bitwig-studio*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"ocenaudio",children:"Ocenaudio"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/multimedia/music/ocenaudio/pspec.xml\nsudo eopkg it ocenaudio*.eopkg;sudo rm ocenaudio*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"plex-media-server",children:"Plex Media Server"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/multimedia/video/plexmediaserver/pspec.xml\nsudo eopkg it plexmediaserver-*.eopkg;sudo rm plexmediaserver-*.eopkg\nsudo systemd-tmpfiles --create\nsudo systemctl start plexmediaserver.service\n"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Note:"})," Optionally have it start on boot:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo systemctl enable plexmediaserver.service\n"})}),"\n",(0,r.jsx)(s.h3,{id:"sunvox",children:"SunVox"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/multimedia/music/sunvox/pspec.xml\nsudo eopkg it sunvox*.eopkg;sudo rm sunvox*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"spotify",children:"Spotify"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/multimedia/music/spotify/pspec.xml\nsudo eopkg it spotify*.eopkg;sudo rm spotify*.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"network",children:"Network"}),"\n",(0,r.jsx)(s.h3,{id:"anydesk",children:"AnyDesk"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/util/anydesk/pspec.xml\nsudo eopkg it anydesk*.eopkg;sudo rm anydesk*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"insync",children:"Insync"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/download/insync/pspec.xml\nsudo eopkg it insync*.eopkg;sudo rm insync*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"spideroak",children:"Spideroak"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/download/spideroak/pspec.xml\nsudo eopkg it spideroak*.eopkg;sudo rm spideroak*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"synology-cloud-station-drive",children:"Synology Cloud Station Drive"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/download/synology-cloud-station-drive/pspec.xml\nsudo eopkg it synology-cloud-station-drive*.eopkg;sudo rm synology-cloud-station-drive*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"teamviewer",children:"TeamViewer"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/util/teamviewer/pspec.xml\nsudo eopkg it teamviewer*.eopkg;sudo rm teamviewer*.eopkg\nsudo systemctl start teamviewerd.service\n"})}),"\n",(0,r.jsx)(s.h2,{id:"office",children:"Office"}),"\n",(0,r.jsx)(s.h3,{id:"mendeley-desktop",children:"Mendeley Desktop"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/office/mendeleydesktop/pspec.xml\nsudo eopkg it mendeleydesktop*.eopkg;sudo rm mendeleydesktop*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"microsoft-core-fonts",children:"Microsoft Core Fonts"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/desktop/font/mscorefonts/pspec.xml\nsudo eopkg it mscorefonts*.eopkg;sudo rm mscorefonts*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"moneydance",children:"Moneydance"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/office/moneydance/pspec.xml\nsudo eopkg it moneydance*.eopkg;sudo rm moneydance*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"pomodoneapp",children:"PomoDoneApp"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/office/pomodoneapp/pspec.xml\nsudo eopkg it pomodoneapp*.eopkg;sudo rm pomodoneapp*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"scrivener",children:"Scrivener"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/office/scrivener/pspec.xml\nsudo eopkg it scrivener*.eopkg;sudo rm scrivener*.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"programming",children:"Programming"}),"\n",(0,r.jsx)(s.h3,{id:"android-studio",children:"Android Studio"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/android-studio/pspec.xml\nsudo eopkg it android-studio*.eopkg;sudo rm android-studio*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"clion",children:"CLion"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/clion/pspec.xml\nsudo eopkg it clion*.eopkg;sudo rm clion*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"datagrip",children:"DataGrip"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/datagrip/pspec.xml\nsudo eopkg it datagrip*.eopkg;sudo rm datagrip*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"gitkraken",children:"GitKraken"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/gitkraken/pspec.xml\nsudo eopkg it gitkraken*.eopkg;sudo rm gitkraken*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"idea",children:"IDEA"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/idea/pspec.xml\nsudo eopkg it idea*.eopkg;sudo rm idea*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"phpstorm",children:"PhpStorm"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/phpstorm/pspec.xml\nsudo eopkg it phpstorm*.eopkg;sudo rm phpstorm*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"pycharm",children:"PyCharm"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/pycharm/pspec.xml\nsudo eopkg it pycharm*.eopkg;sudo rm pycharm*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"rider",children:"Rider"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/rider/pspec.xml\nsudo eopkg it rider*.eopkg;sudo rm rider*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"rubymine",children:"RubyMine"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/rubymine/pspec.xml\nsudo eopkg it rubymine*.eopkg;sudo rm rubymine*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"sublime-text",children:"Sublime Text"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/sublime-text/pspec.xml\nsudo eopkg it sublime*.eopkg;sudo rm sublime*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"webstorm",children:"WebStorm"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/webstorm/pspec.xml\nsudo eopkg it webstorm*.eopkg;sudo rm webstorm*.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"security",children:"Security"}),"\n",(0,r.jsx)(s.h3,{id:"enpass",children:"Enpass"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/security/enpass/pspec.xml\nsudo eopkg it enpass*.eopkg;sudo rm enpass*.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"other",children:"Other"}),"\n",(0,r.jsx)(s.h3,{id:"google-earth",children:"Google Earth"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/web/google-earth/pspec.xml\nsudo eopkg it google-earth*.eopkg;sudo rm google-earth*.eopkg\n"})})]})}function c(e={}){const{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},11151:(e,s,o)=>{o.d(s,{Z:()=>a,a:()=>i});var r=o(67294);const n={},t=r.createContext(n);function i(e){const s=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7682],{31593:(e,s,o)=>{o.r(s),o.d(s,{assets:()=>d,contentTitle:()=>i,default:()=>c,frontMatter:()=>t,metadata:()=>a,toc:()=>l});var r=o(85893),n=o(11151);const t={title:"Third Party",summary:"Quick Installation guide for all of the Third Party applications Solus can help you install"},i="Third Party",a={id:"user/software/third-party/index",title:"Third Party",description:"The following applications are provided via our 3rd Party Repository to facilitate the installation and usage of them. These applications cannot be included in the primary repository due to licensing issues.",source:"@site/docs/user/software/third-party/index.md",sourceDirName:"user/software/third-party",slug:"/user/software/third-party/",permalink:"/docs/user/software/third-party/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/third-party/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Third Party",summary:"Quick Installation guide for all of the Third Party applications Solus can help you install"},sidebar:"userSidebar",previous:{title:"Sound",permalink:"/docs/user/software/sound/"},next:{title:"Snap",permalink:"/docs/user/software/third-party/snap"}},d={},l=[{value:"Browsers",id:"browsers",level:2},{value:"Google Chrome",id:"google-chrome",level:3},{value:"Google Chrome (Beta)",id:"google-chrome-beta",level:3},{value:"Google Chrome (Dev/Unstable)",id:"google-chrome-devunstable",level:3},{value:"Communication",id:"communication",level:2},{value:"Franz",id:"franz",level:3},{value:"Slack",id:"slack",level:3},{value:"Viber",id:"viber",level:3},{value:"Multimedia",id:"multimedia",level:2},{value:"Bitwig Studio",id:"bitwig-studio",level:3},{value:"Ocenaudio",id:"ocenaudio",level:3},{value:"Plex Media Server",id:"plex-media-server",level:3},{value:"SunVox",id:"sunvox",level:3},{value:"Spotify",id:"spotify",level:3},{value:"Network",id:"network",level:2},{value:"AnyDesk",id:"anydesk",level:3},{value:"Insync",id:"insync",level:3},{value:"Spideroak",id:"spideroak",level:3},{value:"Synology Cloud Station Drive",id:"synology-cloud-station-drive",level:3},{value:"TeamViewer",id:"teamviewer",level:3},{value:"Office",id:"office",level:2},{value:"Mendeley Desktop",id:"mendeley-desktop",level:3},{value:"Microsoft Core Fonts",id:"microsoft-core-fonts",level:3},{value:"Moneydance",id:"moneydance",level:3},{value:"PomoDoneApp",id:"pomodoneapp",level:3},{value:"Scrivener",id:"scrivener",level:3},{value:"Programming",id:"programming",level:2},{value:"Android Studio",id:"android-studio",level:3},{value:"CLion",id:"clion",level:3},{value:"DataGrip",id:"datagrip",level:3},{value:"GitKraken",id:"gitkraken",level:3},{value:"IDEA",id:"idea",level:3},{value:"PhpStorm",id:"phpstorm",level:3},{value:"PyCharm",id:"pycharm",level:3},{value:"Rider",id:"rider",level:3},{value:"RubyMine",id:"rubymine",level:3},{value:"Sublime Text",id:"sublime-text",level:3},{value:"WebStorm",id:"webstorm",level:3},{value:"Security",id:"security",level:2},{value:"Enpass",id:"enpass",level:3},{value:"Other",id:"other",level:2},{value:"Google Earth",id:"google-earth",level:3}];function p(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"third-party",children:"Third Party"})}),"\n",(0,r.jsx)(s.p,{children:"The following applications are provided via our 3rd Party Repository to facilitate the installation and usage of them. These applications cannot be included in the primary repository due to licensing issues."}),"\n",(0,r.jsx)(s.p,{children:"Alongside the following commands, you may also find some of these applications via the Third Party section on our Software Center."}),"\n",(0,r.jsxs)(s.p,{children:["If these instructions fail to work please ",(0,r.jsx)(s.a,{href:"https://github.com/getsolus/3rd-party/issues",children:"file an issue"}),". To upgrade once installed simply run the commands again. If there is a new version it will be installed."]}),"\n",(0,r.jsx)(s.h2,{id:"browsers",children:"Browsers"}),"\n",(0,r.jsx)(s.h3,{id:"google-chrome",children:"Google Chrome"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/web/browser/google-chrome-stable/pspec.xml\nsudo eopkg it google-chrome-*.eopkg;sudo rm google-chrome-*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"google-chrome-beta",children:"Google Chrome (Beta)"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/web/browser/google-chrome-beta/pspec.xml\nsudo eopkg it google-chrome-*.eopkg;sudo rm google-chrome-*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"google-chrome-devunstable",children:"Google Chrome (Dev/Unstable)"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/web/browser/google-chrome-unstable/pspec.xml\nsudo eopkg it google-chrome-*.eopkg;sudo rm google-chrome-*.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"communication",children:"Communication"}),"\n",(0,r.jsx)(s.h3,{id:"franz",children:"Franz"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/im/franz/pspec.xml\nsudo eopkg it franz*.eopkg;sudo rm franz*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"slack",children:"Slack"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/im/slack-desktop/pspec.xml\nsudo eopkg it slack-desktop*.eopkg;sudo rm slack-desktop*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"viber",children:"Viber"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/im/viber/pspec.xml\nsudo eopkg it viber*.eopkg;sudo rm *.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"multimedia",children:"Multimedia"}),"\n",(0,r.jsx)(s.h3,{id:"bitwig-studio",children:"Bitwig Studio"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/multimedia/music/bitwig-studio/pspec.xml\nsudo eopkg it bitwig-studio*.eopkg;sudo rm bitwig-studio*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"ocenaudio",children:"Ocenaudio"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/multimedia/music/ocenaudio/pspec.xml\nsudo eopkg it ocenaudio*.eopkg;sudo rm ocenaudio*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"plex-media-server",children:"Plex Media Server"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/multimedia/video/plexmediaserver/pspec.xml\nsudo eopkg it plexmediaserver-*.eopkg;sudo rm plexmediaserver-*.eopkg\nsudo systemd-tmpfiles --create\nsudo systemctl start plexmediaserver.service\n"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Note:"})," Optionally have it start on boot:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo systemctl enable plexmediaserver.service\n"})}),"\n",(0,r.jsx)(s.h3,{id:"sunvox",children:"SunVox"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/multimedia/music/sunvox/pspec.xml\nsudo eopkg it sunvox*.eopkg;sudo rm sunvox*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"spotify",children:"Spotify"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/multimedia/music/spotify/pspec.xml\nsudo eopkg it spotify*.eopkg;sudo rm spotify*.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"network",children:"Network"}),"\n",(0,r.jsx)(s.h3,{id:"anydesk",children:"AnyDesk"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/util/anydesk/pspec.xml\nsudo eopkg it anydesk*.eopkg;sudo rm anydesk*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"insync",children:"Insync"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/download/insync/pspec.xml\nsudo eopkg it insync*.eopkg;sudo rm insync*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"spideroak",children:"Spideroak"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/download/spideroak/pspec.xml\nsudo eopkg it spideroak*.eopkg;sudo rm spideroak*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"synology-cloud-station-drive",children:"Synology Cloud Station Drive"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/download/synology-cloud-station-drive/pspec.xml\nsudo eopkg it synology-cloud-station-drive*.eopkg;sudo rm synology-cloud-station-drive*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"teamviewer",children:"TeamViewer"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/util/teamviewer/pspec.xml\nsudo eopkg it teamviewer*.eopkg;sudo rm teamviewer*.eopkg\nsudo systemctl start teamviewerd.service\n"})}),"\n",(0,r.jsx)(s.h2,{id:"office",children:"Office"}),"\n",(0,r.jsx)(s.h3,{id:"mendeley-desktop",children:"Mendeley Desktop"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/office/mendeleydesktop/pspec.xml\nsudo eopkg it mendeleydesktop*.eopkg;sudo rm mendeleydesktop*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"microsoft-core-fonts",children:"Microsoft Core Fonts"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/desktop/font/mscorefonts/pspec.xml\nsudo eopkg it mscorefonts*.eopkg;sudo rm mscorefonts*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"moneydance",children:"Moneydance"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/office/moneydance/pspec.xml\nsudo eopkg it moneydance*.eopkg;sudo rm moneydance*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"pomodoneapp",children:"PomoDoneApp"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/office/pomodoneapp/pspec.xml\nsudo eopkg it pomodoneapp*.eopkg;sudo rm pomodoneapp*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"scrivener",children:"Scrivener"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/office/scrivener/pspec.xml\nsudo eopkg it scrivener*.eopkg;sudo rm scrivener*.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"programming",children:"Programming"}),"\n",(0,r.jsx)(s.h3,{id:"android-studio",children:"Android Studio"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/android-studio/pspec.xml\nsudo eopkg it android-studio*.eopkg;sudo rm android-studio*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"clion",children:"CLion"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/clion/pspec.xml\nsudo eopkg it clion*.eopkg;sudo rm clion*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"datagrip",children:"DataGrip"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/datagrip/pspec.xml\nsudo eopkg it datagrip*.eopkg;sudo rm datagrip*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"gitkraken",children:"GitKraken"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/gitkraken/pspec.xml\nsudo eopkg it gitkraken*.eopkg;sudo rm gitkraken*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"idea",children:"IDEA"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/idea/pspec.xml\nsudo eopkg it idea*.eopkg;sudo rm idea*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"phpstorm",children:"PhpStorm"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/phpstorm/pspec.xml\nsudo eopkg it phpstorm*.eopkg;sudo rm phpstorm*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"pycharm",children:"PyCharm"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/pycharm/pspec.xml\nsudo eopkg it pycharm*.eopkg;sudo rm pycharm*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"rider",children:"Rider"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/rider/pspec.xml\nsudo eopkg it rider*.eopkg;sudo rm rider*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"rubymine",children:"RubyMine"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/rubymine/pspec.xml\nsudo eopkg it rubymine*.eopkg;sudo rm rubymine*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"sublime-text",children:"Sublime Text"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/sublime-text/pspec.xml\nsudo eopkg it sublime*.eopkg;sudo rm sublime*.eopkg\n"})}),"\n",(0,r.jsx)(s.h3,{id:"webstorm",children:"WebStorm"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/programming/webstorm/pspec.xml\nsudo eopkg it webstorm*.eopkg;sudo rm webstorm*.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"security",children:"Security"}),"\n",(0,r.jsx)(s.h3,{id:"enpass",children:"Enpass"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/security/enpass/pspec.xml\nsudo eopkg it enpass*.eopkg;sudo rm enpass*.eopkg\n"})}),"\n",(0,r.jsx)(s.h2,{id:"other",children:"Other"}),"\n",(0,r.jsx)(s.h3,{id:"google-earth",children:"Google Earth"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg bi --ignore-safety https://raw.githubusercontent.com/getsolus/3rd-party/master/network/web/google-earth/pspec.xml\nsudo eopkg it google-earth*.eopkg;sudo rm google-earth*.eopkg\n"})})]})}function c(e={}){const{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},11151:(e,s,o)=>{o.d(s,{Z:()=>a,a:()=>i});var r=o(67294);const n={},t=r.createContext(n);function i(e){const s=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/424f562c.8c8592ca.js b/assets/js/424f562c.8c8592ca.js deleted file mode 100644 index 66f62be1c..000000000 --- a/assets/js/424f562c.8c8592ca.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3122],{15054:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>i,default:()=>g,frontMatter:()=>n,metadata:()=>s,toc:()=>p});var a=t(85893),l=t(11151);const n={title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",slug:"solus-optimizing-packages",authors:"joey",tags:["pgo","lto","solus","packaging","optimization",3,"clang","gnu","llvm","glibc","hwcaps","x86_64-v3"],hide_table_of_contents:!1},i=void 0,s={permalink:"/blog/solus-optimizing-packages",source:"@site/devlog/2024-02-09-Intro-to-optimizing-packages-on-solus.md",title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",date:"2024-02-09T00:00:00.000Z",tags:[{inline:!0,label:"pgo",permalink:"/blog/tags/pgo"},{inline:!0,label:"lto",permalink:"/blog/tags/lto"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"},{inline:!0,label:"packaging",permalink:"/blog/tags/packaging"},{inline:!0,label:"optimization",permalink:"/blog/tags/optimization"},{inline:!0,label:"3",permalink:"/blog/tags/3"},{inline:!0,label:"clang",permalink:"/blog/tags/clang"},{inline:!0,label:"gnu",permalink:"/blog/tags/gnu"},{inline:!0,label:"llvm",permalink:"/blog/tags/llvm"},{inline:!0,label:"glibc",permalink:"/blog/tags/glibc"},{inline:!0,label:"hwcaps",permalink:"/blog/tags/hwcaps"},{inline:!0,label:"x86_64-v3",permalink:"/blog/tags/x-86-64-v-3"}],readingTime:22.32,hasTruncateMarker:!0,authors:[{name:"Joey Riches",title:"Solus Staff",page:{permalink:"/blog/authors/joey"},socials:{github:"https://github.com/joebonrichie"},imageURL:"https://avatars.githubusercontent.com/u/5338090?s=400&u=f77ed45c7e83814ce3e8bd199fc293bd5b53682b&v=4",key:"joey"}],frontMatter:{title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",slug:"solus-optimizing-packages",authors:"joey",tags:["pgo","lto","solus","packaging","optimization","3","clang","gnu","llvm","glibc","hwcaps","x86_64-v3"],hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"Don't call me MATE, pal!",permalink:"/blog/don't-call-me-mate-pal"}},c={authorsImageUrls:[void 0]},p=[];function r(e){const o={code:"code",p:"p",...(0,l.a)(),...e.components};return(0,a.jsxs)(o.p,{children:["We'll explore how to build packages with advanced compiler techniques in order to squeeze more performance out of the box for packages in Solus. We'll be using the story of how ",(0,a.jsx)(o.code,{children:"libwebp"})," was optimized for and how it led to an unexpected side quest."]})}function g(e={}){const{wrapper:o}={...(0,l.a)(),...e.components};return o?(0,a.jsx)(o,{...e,children:(0,a.jsx)(r,{...e})}):r(e)}},11151:(e,o,t)=>{t.d(o,{Z:()=>s,a:()=>i});var a=t(67294);const l={},n=a.createContext(l);function i(e){const o=a.useContext(n);return a.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function s(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),a.createElement(n.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/424f562c.af0382ed.js b/assets/js/424f562c.af0382ed.js new file mode 100644 index 000000000..cdbc99440 --- /dev/null +++ b/assets/js/424f562c.af0382ed.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3122],{15054:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>g,frontMatter:()=>n,metadata:()=>s,toc:()=>p});var l=o(85893),a=o(11151);const n={title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",slug:"solus-optimizing-packages",authors:"joey",tags:["pgo","lto","solus","packaging","optimization",3,"clang","gnu","llvm","glibc","hwcaps","x86_64-v3"],hide_table_of_contents:!1},i=void 0,s={permalink:"/blog/solus-optimizing-packages",source:"@site/devlog/2024-02-09-Intro-to-optimizing-packages-on-solus.md",title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",date:"2024-02-09T00:00:00.000Z",tags:[{inline:!0,label:"pgo",permalink:"/blog/tags/pgo"},{inline:!0,label:"lto",permalink:"/blog/tags/lto"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"},{inline:!0,label:"packaging",permalink:"/blog/tags/packaging"},{inline:!0,label:"optimization",permalink:"/blog/tags/optimization"},{inline:!0,label:"3",permalink:"/blog/tags/3"},{inline:!0,label:"clang",permalink:"/blog/tags/clang"},{inline:!0,label:"gnu",permalink:"/blog/tags/gnu"},{inline:!0,label:"llvm",permalink:"/blog/tags/llvm"},{inline:!0,label:"glibc",permalink:"/blog/tags/glibc"},{inline:!0,label:"hwcaps",permalink:"/blog/tags/hwcaps"},{inline:!0,label:"x86_64-v3",permalink:"/blog/tags/x-86-64-v-3"}],readingTime:22.32,hasTruncateMarker:!0,authors:[{name:"Joey Riches",title:"Solus Staff",page:{permalink:"/blog/authors/joey"},socials:{github:"https://github.com/joebonrichie"},imageURL:"https://avatars.githubusercontent.com/u/5338090",key:"joey"}],frontMatter:{title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",slug:"solus-optimizing-packages",authors:"joey",tags:["pgo","lto","solus","packaging","optimization","3","clang","gnu","llvm","glibc","hwcaps","x86_64-v3"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Clean, clean, clean!",permalink:"/blog/clean-clean-clean"},nextItem:{title:"Don't call me MATE, pal!",permalink:"/blog/don't-call-me-mate-pal"}},c={authorsImageUrls:[void 0]},p=[];function r(e){const t={code:"code",p:"p",...(0,a.a)(),...e.components};return(0,l.jsxs)(t.p,{children:["We'll explore how to build packages with advanced compiler techniques in order to squeeze more performance out of the box for packages in Solus. We'll be using the story of how ",(0,l.jsx)(t.code,{children:"libwebp"})," was optimized for and how it led to an unexpected side quest."]})}function g(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,l.jsx)(t,{...e,children:(0,l.jsx)(r,{...e})}):r(e)}},11151:(e,t,o)=>{o.d(t,{Z:()=>s,a:()=>i});var l=o(67294);const a={},n=l.createContext(a);function i(e){const t=l.useContext(n);return l.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),l.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/45e9d313.1a78f7ac.js b/assets/js/45e9d313.43558a74.js similarity index 98% rename from assets/js/45e9d313.1a78f7ac.js rename to assets/js/45e9d313.43558a74.js index 048a42c50..4e79d9525 100644 --- a/assets/js/45e9d313.1a78f7ac.js +++ b/assets/js/45e9d313.43558a74.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6114],{47124:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>r,toc:()=>c});var s=a(85893),n=a(11151);const o={title:"Testing a Package",summary:"Testing a Package",sidebar_position:5},i="Testing a Package",r={id:"packaging/testing-a-package",title:"Testing a Package",description:"After building a package, it must be tested against the unstable repository before a pull request can be submitted. Each pull request requires you to explain how you tested the package to make sure things work as expected.",source:"@site/docs/packaging/testing-a-package.md",sourceDirName:"packaging",slug:"/packaging/testing-a-package",permalink:"/docs/packaging/testing-a-package",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/testing-a-package.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,sidebarPosition:5,frontMatter:{title:"Testing a Package",summary:"Testing a Package",sidebar_position:5},sidebar:"packagingSidebar",previous:{title:"Updating an Existing Package",permalink:"/docs/packaging/updating-an-existing-package"},next:{title:"Submitting a Pull Request for Review",permalink:"/docs/packaging/submitting-a-pull-request"}},l={},c=[{value:"Install the .eopkg files",id:"install-the-eopkg-files",level:2},{value:"For updated packages: Return to the repository version",id:"for-updated-packages-return-to-the-repository-version",level:2},{value:"Remove the .eopkg files",id:"remove-the-eopkg-files",level:2}];function d(e){const t={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"testing-a-package",children:"Testing a Package"})}),"\n",(0,s.jsx)(t.p,{children:"After building a package, it must be tested against the unstable repository before a pull request can be submitted. Each pull request requires you to explain how you tested the package to make sure things work as expected."}),"\n",(0,s.jsxs)(t.p,{children:["You will use the ",(0,s.jsx)(t.code,{children:".eopkg"})," file(s) created by the build process for testing."]}),"\n",(0,s.jsxs)(t.h2,{id:"install-the-eopkg-files",children:["Install the ",(0,s.jsx)(t.code,{children:".eopkg"})," files"]}),"\n",(0,s.jsxs)(t.p,{children:["To install your new package, run the following command in the directory where you built the package. Include ",(0,s.jsx)(t.strong,{children:"all"})," ",(0,s.jsx)(t.code,{children:".eopkg"})," files that were built."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"sudo eopkg it *.eopkg\n"})}),"\n",(0,s.jsx)(t.p,{children:"Testing need not be very complicated. The goal is to ensure the package will reliably work for our users. Testing effort will depend on how complex the software is. At minimum, you want to ensure the application launches, and performs basic functionality as expected."}),"\n",(0,s.jsx)(t.p,{children:"For example, if you were updating a text editor, you would want to make sure you can open, create and save files. If you know of issues the package has had in the past, it's a good idea to test that as well to make sure there are no regressions. There are plenty of historical pull requests to review if you want more detail."}),"\n",(0,s.jsx)(t.h2,{id:"for-updated-packages-return-to-the-repository-version",children:"For updated packages: Return to the repository version"}),"\n",(0,s.jsxs)(t.p,{children:["It is a good idea to uninstall the package you built, and return to the repository version, once you are done testing. To do this, run the following command on the main application. For example, if you just built and tested ",(0,s.jsx)(t.code,{children:"tree"}),":"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"sudo eopkg it --reinstall tree\n"})}),"\n",(0,s.jsxs)(t.h2,{id:"remove-the-eopkg-files",children:["Remove the ",(0,s.jsx)(t.code,{children:".eopkg"})," files"]}),"\n",(0,s.jsxs)(t.p,{children:["Before you can submit your pull request, you need to remove the ",(0,s.jsx)(t.code,{children:".eopkg"})," files. All repository packages are built by a dedicated build server from the source files provided in your pull request."]}),"\n",(0,s.jsx)(t.p,{children:"To remove these files, run:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"go-task clean\n"})})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,t,a)=>{a.d(t,{Z:()=>r,a:()=>i});var s=a(67294);const n={},o=s.createContext(n);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6114],{47124:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>r,toc:()=>c});var s=a(85893),n=a(11151);const o={title:"Testing a Package",summary:"Testing a Package",sidebar_position:5},i="Testing a Package",r={id:"packaging/testing-a-package",title:"Testing a Package",description:"After building a package, it must be tested against the unstable repository before a pull request can be submitted. Each pull request requires you to explain how you tested the package to make sure things work as expected.",source:"@site/docs/packaging/testing-a-package.md",sourceDirName:"packaging",slug:"/packaging/testing-a-package",permalink:"/docs/packaging/testing-a-package",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/testing-a-package.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,sidebarPosition:5,frontMatter:{title:"Testing a Package",summary:"Testing a Package",sidebar_position:5},sidebar:"packagingSidebar",previous:{title:"Updating an Existing Package",permalink:"/docs/packaging/updating-an-existing-package"},next:{title:"Submitting a Pull Request for Review",permalink:"/docs/packaging/submitting-a-pull-request"}},l={},c=[{value:"Install the .eopkg files",id:"install-the-eopkg-files",level:2},{value:"For updated packages: Return to the repository version",id:"for-updated-packages-return-to-the-repository-version",level:2},{value:"Remove the .eopkg files",id:"remove-the-eopkg-files",level:2}];function d(e){const t={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"testing-a-package",children:"Testing a Package"})}),"\n",(0,s.jsx)(t.p,{children:"After building a package, it must be tested against the unstable repository before a pull request can be submitted. Each pull request requires you to explain how you tested the package to make sure things work as expected."}),"\n",(0,s.jsxs)(t.p,{children:["You will use the ",(0,s.jsx)(t.code,{children:".eopkg"})," file(s) created by the build process for testing."]}),"\n",(0,s.jsxs)(t.h2,{id:"install-the-eopkg-files",children:["Install the ",(0,s.jsx)(t.code,{children:".eopkg"})," files"]}),"\n",(0,s.jsxs)(t.p,{children:["To install your new package, run the following command in the directory where you built the package. Include ",(0,s.jsx)(t.strong,{children:"all"})," ",(0,s.jsx)(t.code,{children:".eopkg"})," files that were built."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"sudo eopkg it *.eopkg\n"})}),"\n",(0,s.jsx)(t.p,{children:"Testing need not be very complicated. The goal is to ensure the package will reliably work for our users. Testing effort will depend on how complex the software is. At minimum, you want to ensure the application launches, and performs basic functionality as expected."}),"\n",(0,s.jsx)(t.p,{children:"For example, if you were updating a text editor, you would want to make sure you can open, create and save files. If you know of issues the package has had in the past, it's a good idea to test that as well to make sure there are no regressions. There are plenty of historical pull requests to review if you want more detail."}),"\n",(0,s.jsx)(t.h2,{id:"for-updated-packages-return-to-the-repository-version",children:"For updated packages: Return to the repository version"}),"\n",(0,s.jsxs)(t.p,{children:["It is a good idea to uninstall the package you built, and return to the repository version, once you are done testing. To do this, run the following command on the main application. For example, if you just built and tested ",(0,s.jsx)(t.code,{children:"tree"}),":"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"sudo eopkg it --reinstall tree\n"})}),"\n",(0,s.jsxs)(t.h2,{id:"remove-the-eopkg-files",children:["Remove the ",(0,s.jsx)(t.code,{children:".eopkg"})," files"]}),"\n",(0,s.jsxs)(t.p,{children:["Before you can submit your pull request, you need to remove the ",(0,s.jsx)(t.code,{children:".eopkg"})," files. All repository packages are built by a dedicated build server from the source files provided in your pull request."]}),"\n",(0,s.jsx)(t.p,{children:"To remove these files, run:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"go-task clean\n"})})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,t,a)=>{a.d(t,{Z:()=>r,a:()=>i});var s=a(67294);const n={},o=s.createContext(n);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/46a65d96.99a6e32d.js b/assets/js/46a65d96.97bfd57f.js similarity index 98% rename from assets/js/46a65d96.99a6e32d.js rename to assets/js/46a65d96.97bfd57f.js index 7c43e432c..242d01d2d 100644 --- a/assets/js/46a65d96.99a6e32d.js +++ b/assets/js/46a65d96.97bfd57f.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8092],{82758:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>i,contentTitle:()=>d,default:()=>h,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var o=r(85893),t=r(11151);const n={title:"Repository Management",summary:"Repository Management"},d="Repository management",a={id:"user/package-management/repo-management",title:"Repository Management",description:"Solus offers two main software sources: stable (shannon) and unstable. The eopkg package manager can use multiple sources on your system, which is helpful if you use a source provided by another vendor.",source:"@site/docs/user/package-management/repo-management.md",sourceDirName:"user/package-management",slug:"/user/package-management/repo-management",permalink:"/docs/user/package-management/repo-management",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/package-management/repo-management.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Repository Management",summary:"Repository Management"},sidebar:"userSidebar",previous:{title:"History and Software Rollback",permalink:"/docs/user/package-management/history-and-rollback"},next:{title:"Privacy Policy",permalink:"/docs/user/privacy"}},i={},c=[{value:"Official repositories",id:"official-repositories",level:2},{value:"Repository management commands",id:"repository-management-commands",level:2}];function l(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"repository-management",children:"Repository management"})}),"\n",(0,o.jsxs)(s.p,{children:["Solus offers two main software sources: stable (shannon) and unstable. The ",(0,o.jsx)(s.code,{children:"eopkg"})," package manager can use multiple sources on your system, which is helpful if you use a source provided by another vendor."]}),"\n",(0,o.jsx)(s.h2,{id:"official-repositories",children:"Official repositories"}),"\n",(0,o.jsx)(s.p,{children:"The official Solus repositories are:"}),"\n",(0,o.jsxs)(s.table,{children:[(0,o.jsx)(s.thead,{children:(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.th,{children:"Repository"}),(0,o.jsx)(s.th,{children:"URL"}),(0,o.jsx)(s.th,{children:"Notes"})]})}),(0,o.jsxs)(s.tbody,{children:[(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Stable (shannon)"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"https://cdn.getsol.us/repo/shannon/eopkg-index.xml.xz"})}),(0,o.jsx)(s.td,{children:"Default software source."})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Unstable"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz"})}),(0,o.jsx)(s.td,{children:"Only use this source if build Solus packages or you test new software before it moves to the stable source."})]})]})]}),"\n",(0,o.jsxs)(s.admonition,{type:"danger",children:[(0,o.jsxs)(s.p,{children:["Updating your system while using the ",(0,o.jsx)(s.strong,{children:"unstable"})," source might be risky."]}),(0,o.jsxs)(s.p,{children:["Before updating, check the ",(0,o.jsx)(s.a,{href:"https://matrix.to/#/#solus-packaging:matrix.org",children:"#solus-packaging"})," Matrix room."]})]}),"\n",(0,o.jsx)(s.h2,{id:"repository-management-commands",children:"Repository management commands"}),"\n",(0,o.jsxs)(s.p,{children:["The following table lists the ",(0,o.jsx)(s.code,{children:"eopkg"})," commands you can use to manage your software sources."]}),"\n",(0,o.jsxs)(s.table,{children:[(0,o.jsx)(s.thead,{children:(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.th,{children:"Action"}),(0,o.jsx)(s.th,{children:"Command"}),(0,o.jsx)(s.th,{children:"Example"})]})}),(0,o.jsxs)(s.tbody,{children:[(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Add a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg add-repo NAME URL"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg add-repo Example https://example.com/repo/eopkg-index.xml.xz"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Remove a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg remove-repo NAME"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg remove-repo Example"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Enable a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg enable-repo NAME"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg enable-repo Example"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Disable a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg disable-repo NAME"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg disable-repo Example"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Update a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg update-repo NAME"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg update-repo Example"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Update all repositories"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg update-repo"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg update-repo"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"List repositories added to your system"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"eopkg list-repo"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"eopkg list-repo"})})]})]})]})]})}function h(e={}){const{wrapper:s}={...(0,t.a)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},11151:(e,s,r)=>{r.d(s,{Z:()=>a,a:()=>d});var o=r(67294);const t={},n=o.createContext(t);function d(e){const s=o.useContext(n);return o.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),o.createElement(n.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8092],{82758:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>i,contentTitle:()=>d,default:()=>h,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var o=r(85893),t=r(11151);const n={title:"Repository Management",summary:"Repository Management"},d="Repository management",a={id:"user/package-management/repo-management",title:"Repository Management",description:"Solus offers two main software sources: stable (shannon) and unstable. The eopkg package manager can use multiple sources on your system, which is helpful if you use a source provided by another vendor.",source:"@site/docs/user/package-management/repo-management.md",sourceDirName:"user/package-management",slug:"/user/package-management/repo-management",permalink:"/docs/user/package-management/repo-management",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/package-management/repo-management.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Repository Management",summary:"Repository Management"},sidebar:"userSidebar",previous:{title:"History and Software Rollback",permalink:"/docs/user/package-management/history-and-rollback"},next:{title:"Privacy Policy",permalink:"/docs/user/privacy"}},i={},c=[{value:"Official repositories",id:"official-repositories",level:2},{value:"Repository management commands",id:"repository-management-commands",level:2}];function l(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"repository-management",children:"Repository management"})}),"\n",(0,o.jsxs)(s.p,{children:["Solus offers two main software sources: stable (shannon) and unstable. The ",(0,o.jsx)(s.code,{children:"eopkg"})," package manager can use multiple sources on your system, which is helpful if you use a source provided by another vendor."]}),"\n",(0,o.jsx)(s.h2,{id:"official-repositories",children:"Official repositories"}),"\n",(0,o.jsx)(s.p,{children:"The official Solus repositories are:"}),"\n",(0,o.jsxs)(s.table,{children:[(0,o.jsx)(s.thead,{children:(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.th,{children:"Repository"}),(0,o.jsx)(s.th,{children:"URL"}),(0,o.jsx)(s.th,{children:"Notes"})]})}),(0,o.jsxs)(s.tbody,{children:[(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Stable (shannon)"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"https://cdn.getsol.us/repo/shannon/eopkg-index.xml.xz"})}),(0,o.jsx)(s.td,{children:"Default software source."})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Unstable"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz"})}),(0,o.jsx)(s.td,{children:"Only use this source if build Solus packages or you test new software before it moves to the stable source."})]})]})]}),"\n",(0,o.jsxs)(s.admonition,{type:"danger",children:[(0,o.jsxs)(s.p,{children:["Updating your system while using the ",(0,o.jsx)(s.strong,{children:"unstable"})," source might be risky."]}),(0,o.jsxs)(s.p,{children:["Before updating, check the ",(0,o.jsx)(s.a,{href:"https://matrix.to/#/#solus-packaging:matrix.org",children:"#solus-packaging"})," Matrix room."]})]}),"\n",(0,o.jsx)(s.h2,{id:"repository-management-commands",children:"Repository management commands"}),"\n",(0,o.jsxs)(s.p,{children:["The following table lists the ",(0,o.jsx)(s.code,{children:"eopkg"})," commands you can use to manage your software sources."]}),"\n",(0,o.jsxs)(s.table,{children:[(0,o.jsx)(s.thead,{children:(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.th,{children:"Action"}),(0,o.jsx)(s.th,{children:"Command"}),(0,o.jsx)(s.th,{children:"Example"})]})}),(0,o.jsxs)(s.tbody,{children:[(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Add a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg add-repo NAME URL"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg add-repo Example https://example.com/repo/eopkg-index.xml.xz"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Remove a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg remove-repo NAME"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg remove-repo Example"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Enable a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg enable-repo NAME"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg enable-repo Example"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Disable a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg disable-repo NAME"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg disable-repo Example"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Update a repository"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg update-repo NAME"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg update-repo Example"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"Update all repositories"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg update-repo"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"sudo eopkg update-repo"})})]}),(0,o.jsxs)(s.tr,{children:[(0,o.jsx)(s.td,{children:"List repositories added to your system"}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"eopkg list-repo"})}),(0,o.jsx)(s.td,{children:(0,o.jsx)(s.code,{children:"eopkg list-repo"})})]})]})]})]})}function h(e={}){const{wrapper:s}={...(0,t.a)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},11151:(e,s,r)=>{r.d(s,{Z:()=>a,a:()=>d});var o=r(67294);const t={},n=o.createContext(t);function d(e){const s=o.useContext(n);return o.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),o.createElement(n.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4802fa93.42ab49a1.js b/assets/js/4802fa93.42ab49a1.js deleted file mode 100644 index 3c3d0839c..000000000 --- a/assets/js/4802fa93.42ab49a1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1774],{48815:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>r,contentTitle:()=>a,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>h});var n=o(85893),s=o(11151);const i={title:"Don't call me MATE, pal!",slug:"don't-call-me-mate-pal",authors:"david",tags:["MATE","devlog","solus"],hide_table_of_contents:!1},a=void 0,l={permalink:"/blog/don't-call-me-mate-pal",source:"@site/devlog/2024-01-29-dont-call-me-mate.md",title:"Don't call me MATE, pal!",description:"Back in our 4.4 release post we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we're getting ready to ship the Solus MATE Transition Tool to move existing users off of MATE.",date:"2024-01-29T00:00:00.000Z",tags:[{inline:!0,label:"MATE",permalink:"/blog/tags/mate"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:2.645,hasTruncateMarker:!0,authors:[{name:"David Harder",title:"Solus Staff",page:{permalink:"/blog/authors/david"},socials:{github:"https://github.com/davidjharder"},imageURL:"https://avatars.githubusercontent.com/u/23007135?v=4",key:"david"}],frontMatter:{title:"Don't call me MATE, pal!",slug:"don't-call-me-mate-pal",authors:"david",tags:["MATE","devlog","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Intro to Optimizing Packages on Solus",permalink:"/blog/solus-optimizing-packages"},nextItem:{title:"eopkg is dead, long live eopkg",permalink:"/blog/eopkg-is-dead-long-live-eopkg"}},r={authorsImageUrls:[void 0]},h=[{value:"The problem",id:"the-problem",level:2},{value:"Introducing the Solus MATE Transition Tool",id:"introducing-the-solus-mate-transition-tool",level:2},{value:"How the Mate Transition Tool is actually part of our Python2 work",id:"how-the-mate-transition-tool-is-actually-part-of-our-python2-work",level:2}];function d(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["Back in our ",(0,n.jsx)(t.a,{href:"https://getsol.us/2023/07/08/solus-4-4-released/",children:"4.4 release post"})," we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we're getting ready to ship the ",(0,n.jsx)(t.em,{children:"Solus MATE Transition Tool"})," to move existing users off of MATE."]}),"\n",(0,n.jsx)(t.h2,{id:"the-problem",children:"The problem"}),"\n",(0,n.jsxs)(t.p,{children:["MATE and XFCE are similar enough that eager Solusians can, and have, installed XCFE on their MATE machines with nothing more than a couple of ",(0,n.jsx)(t.code,{children:"eopkg"})," commands. We're pretty sure our resident ",(0,n.jsx)(t.code,{children:"bash"})," script enthusiast (ermo) could hammer out a working transition script in an evening. But we want a more polished experience. We know ",(0,n.jsx)(t.em,{children:"you"})," follow Solus news; after all, you're reading this. However, we assume there are users who dutifully update their systems, but have no interest in keeping up with our blog posts. How do we get their attention and prompt them to move away from MATE?"]}),"\n",(0,n.jsx)(t.h2,{id:"introducing-the-solus-mate-transition-tool",children:"Introducing the Solus MATE Transition Tool"}),"\n",(0,n.jsxs)(t.p,{children:["We're pleased to show off the ",(0,n.jsx)(t.em,{children:"MATE Transition Tool"}),", which we plan to include in normal updates to MATE systems in the coming weeks. Most of the work on this tool was done by Joey; more on his efforts in the section below. Here's how MATE users will encounter the tool:"]}),"\n",(0,n.jsx)(t.admonition,{type:"note",children:(0,n.jsx)(t.p,{children:"These screenshots are current as of the publishing of this post, we may change things as we continue testing."})}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Users will get a notification on every start-up informing them that they need to transition away from MATE."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Notification: Solus Transition Service",src:o(64792).Z+"",width:"812",height:"333"})}),"\n",(0,n.jsxs)(t.ol,{start:"2",children:["\n",(0,n.jsx)(t.li,{children:"Clicking on that notification will launch the Solus MATE Transition Tool."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"MATE Transition Tool Launch",src:o(46311).Z+"",width:"1134",height:"673"})}),"\n",(0,n.jsxs)(t.ol,{start:"3",children:["\n",(0,n.jsx)(t.li,{children:"Users select either Solus Budgie or Solus XFCE. The tool installs the selected edition, removes MATE, and prompts for a reboot"}),"\n",(0,n.jsx)(t.li,{children:"The tool removes itself after a successful transition."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Simple. At least, that's what we want users to think."}),"\n",(0,n.jsx)(t.h2,{id:"how-the-mate-transition-tool-is-actually-part-of-our-python2-work",children:"How the Mate Transition Tool is actually part of our Python2 work"}),"\n",(0,n.jsxs)(t.p,{children:["The story of the MATE Transition Tool is actually tied up in our fight to drag ",(0,n.jsx)(t.code,{children:"eopkg"})," into the current decade. As I wrote previously, we're somewhat embarrassed by the amount of Solus tooling which ",(0,n.jsx)(t.em,{children:"still"})," relies on Python2. One such tool is the Solus Software Center ",(0,n.jsx)(t.code,{children:"solus-sc"}),". A while back, the team decided the sane thing to do was to ditch ",(0,n.jsx)(t.code,{children:"solus-sc"})," in favor of ",(0,n.jsx)(t.em,{children:"KDE Discover"})," and ",(0,n.jsx)(t.em,{children:"GNOME Software"})," . This would have the additional benefit of promoting flatpak applications to first-class citizens. The problem is ",(0,n.jsx)(t.em,{children:"Discover"})," and ",(0,n.jsx)(t.em,{children:"Software"})," have no way to talk to our package manager ",(0,n.jsx)(t.code,{children:"eopkg"}),". We need an API. Luckily, other projects have encountered the same issue, leading to ",(0,n.jsx)(t.a,{href:"https://www.freedesktop.org/software/PackageKit/pk-intro.html",children:(0,n.jsx)(t.code,{children:"packagekit"})}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["Joey has been doing the dirty work of bolting ",(0,n.jsx)(t.code,{children:"packagekit"})," support onto ",(0,n.jsx)(t.code,{children:"eopkg"}),", and saw an opportunity: If ",(0,n.jsx)(t.code,{children:"eopkg"})," could be upgraded to understand some of ",(0,n.jsx)(t.code,{children:"packagekit"}),", then he could write a special-purpose application to move users off MATE without asking them to run scary bash scripts (sorry ermo). We're rather pleased with this solution. MATE users get a simple transition and Solus gets closer to checking ",(0,n.jsx)(t.code,{children:"solus-sc"})," off ",(0,n.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/270",children:"the list."})]})]})}function c(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},46311:(e,t,o)=>{o.d(t,{Z:()=>n});const n=o.p+"assets/images/MTT-launch-9408fee2f5bfdf5d356638dab8047dd0.png"},64792:(e,t,o)=>{o.d(t,{Z:()=>n});const n=o.p+"assets/images/notification-1be98b16b9621bf36eac8d89defb71e6.png"},11151:(e,t,o)=>{o.d(t,{Z:()=>l,a:()=>a});var n=o(67294);const s={},i=n.createContext(s);function a(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4802fa93.68b985c8.js b/assets/js/4802fa93.68b985c8.js new file mode 100644 index 000000000..4503975c0 --- /dev/null +++ b/assets/js/4802fa93.68b985c8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1774],{48815:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>r,contentTitle:()=>a,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>h});var n=o(85893),s=o(11151);const i={title:"Don't call me MATE, pal!",slug:"don't-call-me-mate-pal",authors:"david",tags:["MATE","devlog","solus"],hide_table_of_contents:!1},a=void 0,l={permalink:"/blog/don't-call-me-mate-pal",source:"@site/devlog/2024-01-29-dont-call-me-mate.md",title:"Don't call me MATE, pal!",description:"Back in our 4.4 release post we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we're getting ready to ship the Solus MATE Transition Tool to move existing users off of MATE.",date:"2024-01-29T00:00:00.000Z",tags:[{inline:!0,label:"MATE",permalink:"/blog/tags/mate"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:2.645,hasTruncateMarker:!0,authors:[{name:"David Harder",title:"Solus Staff",page:{permalink:"/blog/authors/david"},socials:{github:"https://github.com/davidjharder"},imageURL:"https://avatars.githubusercontent.com/u/23007135",key:"david"}],frontMatter:{title:"Don't call me MATE, pal!",slug:"don't-call-me-mate-pal",authors:"david",tags:["MATE","devlog","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Intro to Optimizing Packages on Solus",permalink:"/blog/solus-optimizing-packages"},nextItem:{title:"eopkg is dead, long live eopkg",permalink:"/blog/eopkg-is-dead-long-live-eopkg"}},r={authorsImageUrls:[void 0]},h=[{value:"The problem",id:"the-problem",level:2},{value:"Introducing the Solus MATE Transition Tool",id:"introducing-the-solus-mate-transition-tool",level:2},{value:"How the Mate Transition Tool is actually part of our Python2 work",id:"how-the-mate-transition-tool-is-actually-part-of-our-python2-work",level:2}];function d(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["Back in our ",(0,n.jsx)(t.a,{href:"https://getsol.us/2023/07/08/solus-4-4-released/",children:"4.4 release post"})," we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we're getting ready to ship the ",(0,n.jsx)(t.em,{children:"Solus MATE Transition Tool"})," to move existing users off of MATE."]}),"\n",(0,n.jsx)(t.h2,{id:"the-problem",children:"The problem"}),"\n",(0,n.jsxs)(t.p,{children:["MATE and XFCE are similar enough that eager Solusians can, and have, installed XCFE on their MATE machines with nothing more than a couple of ",(0,n.jsx)(t.code,{children:"eopkg"})," commands. We're pretty sure our resident ",(0,n.jsx)(t.code,{children:"bash"})," script enthusiast (ermo) could hammer out a working transition script in an evening. But we want a more polished experience. We know ",(0,n.jsx)(t.em,{children:"you"})," follow Solus news; after all, you're reading this. However, we assume there are users who dutifully update their systems, but have no interest in keeping up with our blog posts. How do we get their attention and prompt them to move away from MATE?"]}),"\n",(0,n.jsx)(t.h2,{id:"introducing-the-solus-mate-transition-tool",children:"Introducing the Solus MATE Transition Tool"}),"\n",(0,n.jsxs)(t.p,{children:["We're pleased to show off the ",(0,n.jsx)(t.em,{children:"MATE Transition Tool"}),", which we plan to include in normal updates to MATE systems in the coming weeks. Most of the work on this tool was done by Joey; more on his efforts in the section below. Here's how MATE users will encounter the tool:"]}),"\n",(0,n.jsx)(t.admonition,{type:"note",children:(0,n.jsx)(t.p,{children:"These screenshots are current as of the publishing of this post, we may change things as we continue testing."})}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Users will get a notification on every start-up informing them that they need to transition away from MATE."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Notification: Solus Transition Service",src:o(64792).Z+"",width:"812",height:"333"})}),"\n",(0,n.jsxs)(t.ol,{start:"2",children:["\n",(0,n.jsx)(t.li,{children:"Clicking on that notification will launch the Solus MATE Transition Tool."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"MATE Transition Tool Launch",src:o(46311).Z+"",width:"1134",height:"673"})}),"\n",(0,n.jsxs)(t.ol,{start:"3",children:["\n",(0,n.jsx)(t.li,{children:"Users select either Solus Budgie or Solus XFCE. The tool installs the selected edition, removes MATE, and prompts for a reboot"}),"\n",(0,n.jsx)(t.li,{children:"The tool removes itself after a successful transition."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Simple. At least, that's what we want users to think."}),"\n",(0,n.jsx)(t.h2,{id:"how-the-mate-transition-tool-is-actually-part-of-our-python2-work",children:"How the Mate Transition Tool is actually part of our Python2 work"}),"\n",(0,n.jsxs)(t.p,{children:["The story of the MATE Transition Tool is actually tied up in our fight to drag ",(0,n.jsx)(t.code,{children:"eopkg"})," into the current decade. As I wrote previously, we're somewhat embarrassed by the amount of Solus tooling which ",(0,n.jsx)(t.em,{children:"still"})," relies on Python2. One such tool is the Solus Software Center ",(0,n.jsx)(t.code,{children:"solus-sc"}),". A while back, the team decided the sane thing to do was to ditch ",(0,n.jsx)(t.code,{children:"solus-sc"})," in favor of ",(0,n.jsx)(t.em,{children:"KDE Discover"})," and ",(0,n.jsx)(t.em,{children:"GNOME Software"})," . This would have the additional benefit of promoting flatpak applications to first-class citizens. The problem is ",(0,n.jsx)(t.em,{children:"Discover"})," and ",(0,n.jsx)(t.em,{children:"Software"})," have no way to talk to our package manager ",(0,n.jsx)(t.code,{children:"eopkg"}),". We need an API. Luckily, other projects have encountered the same issue, leading to ",(0,n.jsx)(t.a,{href:"https://www.freedesktop.org/software/PackageKit/pk-intro.html",children:(0,n.jsx)(t.code,{children:"packagekit"})}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["Joey has been doing the dirty work of bolting ",(0,n.jsx)(t.code,{children:"packagekit"})," support onto ",(0,n.jsx)(t.code,{children:"eopkg"}),", and saw an opportunity: If ",(0,n.jsx)(t.code,{children:"eopkg"})," could be upgraded to understand some of ",(0,n.jsx)(t.code,{children:"packagekit"}),", then he could write a special-purpose application to move users off MATE without asking them to run scary bash scripts (sorry ermo). We're rather pleased with this solution. MATE users get a simple transition and Solus gets closer to checking ",(0,n.jsx)(t.code,{children:"solus-sc"})," off ",(0,n.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/270",children:"the list."})]})]})}function c(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},46311:(e,t,o)=>{o.d(t,{Z:()=>n});const n=o.p+"assets/images/MTT-launch-9408fee2f5bfdf5d356638dab8047dd0.png"},64792:(e,t,o)=>{o.d(t,{Z:()=>n});const n=o.p+"assets/images/notification-1be98b16b9621bf36eac8d89defb71e6.png"},11151:(e,t,o)=>{o.d(t,{Z:()=>l,a:()=>a});var n=o(67294);const s={},i=n.createContext(s);function a(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/49b71c16.14dff61b.js b/assets/js/49b71c16.dfd61da5.js similarity index 99% rename from assets/js/49b71c16.14dff61b.js rename to assets/js/49b71c16.dfd61da5.js index 77615463a..64ca26419 100644 --- a/assets/js/49b71c16.14dff61b.js +++ b/assets/js/49b71c16.dfd61da5.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3783],{99937:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>c,metadata:()=>d,toc:()=>r});var s=i(85893),a=i(11151);const c={title:"Packaging Practices",summary:"Learning the best packaging practices"},t="Packaging Practices",d={id:"packaging/packaging-practices",title:"Packaging Practices",description:"The primary goal of ypkg is ease of maintenance. In order to do so we ensure packages in the binary repository adhere to a strict set of conventions and practices.",source:"@site/docs/packaging/packaging-practices.md",sourceDirName:"packaging",slug:"/packaging/packaging-practices",permalink:"/docs/packaging/packaging-practices",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/packaging-practices.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Packaging Practices",summary:"Learning the best packaging practices"},sidebar:"packagingSidebar",previous:{title:"Package YAML",permalink:"/docs/packaging/package.yml"},next:{title:"Procedures",permalink:"/docs/category/procedures"}},l={},r=[{value:"Package naming",id:"package-naming",level:2},{value:"The devel subpackage",id:"the-devel-subpackage",level:3},{value:"The docs subpackage",id:"the-docs-subpackage",level:3},{value:"The 32bit subpackage",id:"the-32bit-subpackage",level:3},{value:"The utils subpackage",id:"the-utils-subpackage",level:3},{value:"Maintenance",id:"maintenance",level:2},{value:"Licenses",id:"licenses",level:2},{value:"Build dependencies",id:"build-dependencies",level:2},{value:"Background",id:"background",level:3},{value:"Finding what package provides a pkgconfig dependency (if any)",id:"finding-what-package-provides-a-pkgconfig-dependency-if-any",level:3},{value:"Using pkgconfig dependencies",id:"using-pkgconfig-dependencies",level:3},{value:"Using explicitly named dependencies",id:"using-explicitly-named-dependencies",level:3},{value:"Runtime dependencies",id:"runtime-dependencies",level:2},{value:"Check dependencies",id:"check-dependencies",level:2},{value:"Example",id:"example",level:3},{value:"Patching / extra files",id:"patching--extra-files",level:2},{value:"Applying a patch",id:"applying-a-patch",level:3},{value:"Handling multiple patches",id:"handling-multiple-patches",level:4},{value:"Installing extra files",id:"installing-extra-files",level:2},{value:"Patterns",id:"patterns",level:2},{value:"Replace / rename",id:"replace--rename",level:2}];function o(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"packaging-practices",children:"Packaging Practices"})}),"\n",(0,s.jsxs)(n.p,{children:["The primary goal of ",(0,s.jsx)(n.code,{children:"ypkg"})," is ease of maintenance. In order to do so we ensure packages in the binary repository adhere to a strict set of conventions and practices."]}),"\n",(0,s.jsx)(n.p,{children:"The next few sections will detail these."}),"\n",(0,s.jsx)(n.h2,{id:"package-naming",children:"Package naming"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"ypkg"})," tool does not allow for custom subpackages or subpackage naming, and will enforce its own policy. This can be eased somewhat through the use of ",(0,s.jsx)(n.code,{children:"patterns"}),", however the available subpackage names are limited."]}),"\n",(0,s.jsxs)(n.p,{children:["We request you use (where possible) the upstream source name for your package. Subpackage names (when generated) are constructed by using the ",(0,s.jsx)(n.code,{children:"name"})," value first, then applying the subpackage name as such:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"pkgname-$subpackage"})}),"\n",(0,s.jsxs)(n.p,{children:["Subpackages are fully automatic with ",(0,s.jsx)(n.code,{children:"ypkg"}),", and are created based on file patterns. All subpackages automatically depend on the main package, to ensure correct operation. In the following explanations, ",(0,s.jsx)(n.code,{children:"$lib"})," is used to refer to the host library directory, i.e. ",(0,s.jsx)(n.code,{children:"lib"})," or ",(0,s.jsx)(n.code,{children:"lib64"})," (or ",(0,s.jsx)(n.code,{children:"lib32"})," on ",(0,s.jsx)(n.code,{children:"emul32"})," builds)."]}),"\n",(0,s.jsx)(n.p,{children:"For the libraries / packages of the following programming languages, you should typically use the following template for it."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Language"}),(0,s.jsx)(n.th,{children:"Prefix"}),(0,s.jsx)(n.th,{children:"Example"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Haskell"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"haskell-"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"text-binary"})," would be ",(0,s.jsx)(n.code,{children:"haskell-text-binary"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Perl"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"perl-"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"algorithm-diff"})," would be ",(0,s.jsx)(n.code,{children:"perl-algorithm-diff"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Python"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"python-"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"wikipedia"})," would be ",(0,s.jsx)(n.code,{children:"python-wikipedia"})," ",(0,s.jsx)(n.strong,{children:"even if only Python3 is enabled"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Ruby"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"ruby-"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"gssapi"})," would be ",(0,s.jsx)(n.code,{children:"ruby-gssapi"})]})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"the-devel-subpackage",children:"The devel subpackage"}),"\n",(0,s.jsxs)(n.p,{children:["This is invariably created for packages that provide libraries and development headers. The following rules will result in files being placed in a ",(0,s.jsx)(n.code,{children:"devel"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"/usr/include\n/usr/$lib/lib*.so\n/usr/$lib/lib*.a\n/usr/share/man/man3\n/usr/share/pkgconfig\n/usr/$lib/pkgconfig\n/usr/share/cmake\n/usr/share/vala\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Note that for some packages, ",(0,s.jsx)(n.code,{children:"/usr/$lib/lib*.so"})," files are not symlinks. In this instance, the main package will be broken with no library files present. This can quickly be determined by looking at the resulting ",(0,s.jsx)(n.code,{children:"pspec_*.xml"})," file generated after running the build.\nIf this happens, simply override with ",(0,s.jsx)(n.code,{children:"patterns"})," or set ",(0,s.jsx)(n.code,{children:"libsplit"})," to \u201cno\u201d."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"A note on static archives"}),": Unless it is absolutely unavoidable, you should disable static libraries within your build. This is usually fixed by adding ",(0,s.jsx)(n.code,{children:"--disable-static"})," to your configure routine. If ",(0,s.jsx)(n.code,{children:"*.a"})," files are shown in your packaging request, it will be questioned, as they can pose a greater security risk if packages link against these static archives."]}),"\n",(0,s.jsx)(n.h3,{id:"the-docs-subpackage",children:"The docs subpackage"}),"\n",(0,s.jsxs)(n.p,{children:["Currently there is only one pattern which is forced into a ",(0,s.jsx)(n.code,{children:"docs"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"/usr/share/gtk-doc/html\n"})}),"\n",(0,s.jsxs)(n.p,{children:["If required, you can use ",(0,s.jsx)(n.code,{children:"patterns"})," to move other files into the ",(0,s.jsx)(n.code,{children:"docs"})," subpackage, reducing the size of the main package."]}),"\n",(0,s.jsx)(n.h3,{id:"the-32bit-subpackage",children:"The 32bit subpackage"}),"\n",(0,s.jsxs)(n.p,{children:["This subpackage is only generated during an ",(0,s.jsx)(n.code,{children:"emul32"})," build. The following paths will automatically be placed into a ",(0,s.jsx)(n.code,{children:"32bit"})," subpackage"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"/usr/lib32/lib*.so\n/usr/lib32/lib*.so.*\n/usr/lib32/lib*.a\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Note the same static archive rules apply to ",(0,s.jsx)(n.code,{children:"32bit"})," packages. These packages aren\u2019t as heavily split as we try to discourage their use, though they must be provided in some instances."]}),"\n",(0,s.jsx)(n.h3,{id:"the-utils-subpackage",children:"The utils subpackage"}),"\n",(0,s.jsxs)(n.p,{children:["This is not an automatic subpackage, you must use ",(0,s.jsx)(n.code,{children:"patterns"})," to utilize it. It is provided for instances that it may not be suitable to have binaries present, i.e. for a library package."]}),"\n",(0,s.jsx)(n.h2,{id:"maintenance",children:"Maintenance"}),"\n",(0,s.jsxs)(n.p,{children:["When submitting a changed ",(0,s.jsx)(n.code,{children:"package.yml"}),", it must be accompanied by its corresponding ",(0,s.jsx)(n.code,{children:"pspec_*.xml"})," file, which was generated at build time. This machine file allows the repository maintainers to evaluate the package condition."]}),"\n",(0,s.jsxs)(n.p,{children:["When providing a new version of a package, or a fix, always ensure you increment the ",(0,s.jsx)(n.code,{children:"release"})," number by 1. This ensures that users of your package are correctly updated to the latest version."]}),"\n",(0,s.jsxs)(n.p,{children:["Never submit a package without having first tested it, and ensuring it builds within ",(0,s.jsx)(n.code,{children:"solbuild"}),", a clean chroot environment."]}),"\n",(0,s.jsx)(n.h2,{id:"licenses",children:"Licenses"}),"\n",(0,s.jsxs)(n.p,{children:["All new packages or updates to packages should abide by the ",(0,s.jsx)(n.a,{href:"https://spdx.org/licenses/",children:"SPDX 3.x"})," definitions, with the following policy:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-only"})," licenses, such as ",(0,s.jsx)(n.code,{children:"GPL-2.0-only"}),", should ",(0,s.jsx)(n.strong,{children:"only be declared"}),' as such when the upstream explicitly states "only", otherwise it should always be ',(0,s.jsx)(n.code,{children:"-or-later"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"build-dependencies",children:"Build dependencies"}),"\n",(0,s.jsxs)(n.admonition,{type:"note",children:[(0,s.jsxs)(n.p,{children:["Build dependencies should be ordered according to the following rules in ",(0,s.jsx)(n.code,{children:"package.yml"}),":"]}),(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies before explicitly named dependencies"]}),"\n",(0,s.jsxs)(n.li,{children:["Each of these two groups in so-called ASCIIbetical order (that is, alphabetical order with all uppercase letters before lowercase letters, and digits/punctuation before letters, ",(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/ASCII#Character_order",children:"see here"}),")"]}),"\n"]}),(0,s.jsx)(n.p,{children:"Example:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"builddeps :\n - pkgconfig(MYGUI)\n - pkgconfig(Qt5Core)\n - pkgconfig(ayatana-appindicator-0.1)\n - pkgconfig(dri)\n - pkgconfig(gtk+-3.0)\n - The-Powder-Toy\n - abcMIDI\n - abcm2ps\n - git\n - python-poetry\n - swig\n"})})]}),"\n",(0,s.jsx)(n.h3,{id:"background",children:"Background"}),"\n",(0,s.jsx)(n.p,{children:"Most software packages that you build will, in one way or another, depend on another software package to provide specific functionality. This is usually achieved by using a library."}),"\n",(0,s.jsx)(n.p,{children:"Any package that is submitted to our repositories is always built in a clean chroot environment. Therefore, any dependencies required to build that package in a reproducible and sane fashion must be listed."}),"\n",(0,s.jsxs)(n.p,{children:["This is achieved by populating the ",(0,s.jsx)(n.code,{children:"builddeps"})," key with a list of build dependencies. We support two kinds of build dependencies: explicitly named, or ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies."]}),"\n",(0,s.jsxs)(n.p,{children:["We prefer the use of ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies. Most modern software will use the ",(0,s.jsx)(n.code,{children:"pkg-config"})," tool (package configuration) to determine which files are required to build the current software. This may include compiler flags, library to link against and where the package headers are located."]}),"\n",(0,s.jsxs)(n.p,{children:["An obvious advantage to supporting ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies is that there is a 1:1 mapping between the name requested by the build and the name used within the ",(0,s.jsx)(n.code,{children:"package.yml"}),". Instead of trying to hunt down the package providing that dependency, you simply list the same name. Any package in the repository will export information about the ",(0,s.jsx)(n.code,{children:".pc"})," files (for ",(0,s.jsx)(n.code,{children:"pkg-config"}),") it contains, enabling you to use those as a build dependency."]}),"\n",(0,s.jsxs)(n.p,{children:["A secondary advantage is that this allows for easily switching or replacing a providing package. When no ",(0,s.jsx)(n.code,{children:"pkgconfig"})," name is available (some packages do not provide these, or it doesn\u2019t make sense for them to), you may use the explicit package name. Always ensure you select the correct package, i.e. the ",(0,s.jsx)(n.code,{children:"-devel"})," subpackage. This provides the necessary symlinks and headers to build packages."]}),"\n",(0,s.jsx)(n.h3,{id:"finding-what-package-provides-a-pkgconfig-dependency-if-any",children:"Finding what package provides a pkgconfig dependency (if any)"}),"\n",(0,s.jsxs)(n.p,{children:["You can use ",(0,s.jsx)(n.code,{children:"go-task"})," to find packages that satisfy ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies. It can search for multiple dependencies at once."]}),"\n",(0,s.jsxs)(n.p,{children:["As an example, if you know a package has the build dependencies ",(0,s.jsx)(n.code,{children:"Qt5Core"})," and ",(0,s.jsx)(n.code,{children:"Qt6Core"}),", you would run:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"go-task pkgconfig -- Qt5Core Qt6Core\n"})}),"\n",(0,s.jsx)(n.p,{children:"This will output:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"pkgconfig(Qt5Core) found in: qt5-base-devel\npkgconfig(Qt6Core) found in: qt6-base-devel\n"})}),"\n",(0,s.jsxs)(n.p,{children:["You can also determine if there are ",(0,s.jsx)(n.code,{children:"pkgconfigs"})," available from a ",(0,s.jsx)(n.code,{children:"-devel"})," package by doing ",(0,s.jsx)(n.code,{children:"eopkg info (name)"})," and looking for the ",(0,s.jsx)(n.code,{children:"Provides"})," key."]}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"eopkg info libgtk-3-devel\n"})}),"\n",(0,s.jsx)(n.p,{children:"In output:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"Provides: pkgconfig(gtk+-3.0) pkgconfig(gdk-3.0) pkgconfig(gdk-wayland-3.0) pkgconfig(gail-3.0) pkgconfig(gdk-x11-3.0) pkgconfig(gtk+-unix-print-3.0)\npkgconfig(gtk+-wayland-3.0) pkgconfig(gtk+-x11-3.0)\n"})}),"\n",(0,s.jsx)(n.h3,{id:"using-pkgconfig-dependencies",children:"Using pkgconfig dependencies"}),"\n",(0,s.jsxs)(n.p,{children:["In the ",(0,s.jsx)(n.code,{children:"builddeps"})," list, use the ",(0,s.jsx)(n.code,{children:"pkgconfig(name)"})," syntax. For example, to add ",(0,s.jsx)(n.code,{children:"gtk+-3.0"})," to the build dependencies, you would do the following:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"builddeps:\n - pkgconfig(gtk+-3.0)\n"})}),"\n",(0,s.jsxs)(n.p,{children:["At build time the appropriate provider package is selected, in this instance ",(0,s.jsx)(n.code,{children:"libgtk-3-devel"})]}),"\n",(0,s.jsx)(n.h3,{id:"using-explicitly-named-dependencies",children:"Using explicitly named dependencies"}),"\n",(0,s.jsxs)(n.p,{children:["When there is not a ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependency available, use an explicitly named dependency.\nSimply list the package name."]}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["When a ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependency is available you will be asked to use that instead."]})}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"builddeps:\n - stk-devel\n"})}),"\n",(0,s.jsx)(n.h2,{id:"runtime-dependencies",children:"Runtime dependencies"}),"\n",(0,s.jsxs)(n.p,{children:["Runtime dependencies are extra packages that a package needs in order to function correctly. A common example of this is other libraries. Solus ",(0,s.jsx)(n.code,{children:"eopkg"})," packages will automatically add any binary dependencies at runtime, so that you do not have to."]}),"\n",(0,s.jsxs)(n.p,{children:["All ",(0,s.jsx)(n.code,{children:"devel"})," subpackages automatically depend on their parent package. On top of this, if they provide a ",(0,s.jsx)(n.code,{children:".pc"})," pkg-config file, we export this information, and automatically determine the packages this particular package would need to be able to build against correctly. As such, the majority of dependencies for builds are automatically resolved."]}),"\n",(0,s.jsx)(n.p,{children:"In certain instances, binary dependencies aren\u2019t enough. An example of this might be an extra Python package, or a font, something that is not accounted for by binary checks."}),"\n",(0,s.jsxs)(n.p,{children:["To account for this, you may add extra explicit runtime dependencies to your package. These are taken from the optional ",(0,s.jsx)(n.code,{children:"rundeps"})," ypkg key."]}),"\n",(0,s.jsxs)(n.p,{children:["This key uses the ",(0,s.jsx)(n.code,{children:"dict(s)"})," type, and the default key is the current package ",(0,s.jsx)(n.code,{children:"name"}),". You may express a different subpackage to apply dependencies to by using that name as a key, i.e. ",(0,s.jsx)(n.code,{children:"devel"}),", or ",(0,s.jsx)(n.code,{children:"docs"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"This would add the \u201cpython-gobject\u201d runtime dependency to the main package:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"rundeps:\n - python-gobject\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This would add the same dependency, as well as adding it to the ",(0,s.jsx)(n.code,{children:"devel"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"rundeps:\n - python-gobject\n - devel: python-gobject\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Remember this uses the ",(0,s.jsx)(n.code,{children:"dict(s)"})," type, which is very flexible. You can equally express this as follows (adding more deps as an example):"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"rundeps:\n - python-gobject\n - devel:\n - somepackage\n - someotherpackage\n"})}),"\n",(0,s.jsx)(n.h2,{id:"check-dependencies",children:"Check dependencies"}),"\n",(0,s.jsxs)(n.p,{children:["Check dependencies are a special kind of build dependency reserved for automatic package testing by ",(0,s.jsx)(n.code,{children:"solbuild"}),". Check dependencies should only be used during the ",(0,s.jsx)(n.code,{children:"check"})," build phase.\nWhen a package is part of an automatic build sequence, these dependencies will ",(0,s.jsx)(n.strong,{children:"not"})," be considered when determining build order."]}),"\n",(0,s.jsx)(n.h3,{id:"example",children:"Example"}),"\n",(0,s.jsxs)(n.p,{children:["The package ",(0,s.jsx)(n.code,{children:"cbindgen"})," includes ",(0,s.jsx)(n.code,{children:"cython"})," in ",(0,s.jsx)(n.code,{children:"checkdeps"})," to run tests in the ",(0,s.jsx)(n.code,{children:"check"})," phase."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://github.com/getsolus/packages/blob/main/packages/c/cbindgen/package.yml",children:"cbindgen package.yml file"})}),"\n",(0,s.jsx)(n.h2,{id:"patching--extra-files",children:"Patching / extra files"}),"\n",(0,s.jsxs)(n.p,{children:["Files that may be required during the build can be accessed via the ",(0,s.jsx)(n.code,{children:"$pkgfiles"})," variable. Note that you must store your files in the ",(0,s.jsx)(n.code,{children:"./files"})," directory relative to your ",(0,s.jsx)(n.code,{children:"package.yml"})]}),"\n",(0,s.jsxs)(n.p,{children:["Both patches and extra files (such as systemd units) are stored in this directory. Note that if your patch is to address a ",(0,s.jsx)(n.strong,{children:"CVE"}),", you must use the following naming scheme: ",(0,s.jsx)(n.code,{children:"./files/security/cve-xxxx-xxxx.patch"})]}),"\n",(0,s.jsxs)(n.p,{children:["Where ",(0,s.jsx)(n.code,{children:"xxxx-xxxx"})," is replaced with the full CVE ID. Complying with this simple rule ensures that we can know at any time the security status of packages when using tools such as ",(0,s.jsx)(n.code,{children:"cve-check-tool"}),"\nkept\nSolus tooling allows the use of ",(0,s.jsx)(n.code,{children:"./files/security/cve-xxxx-xxxx.nopatch"})," (which isn't applied in the build) to indicate that a CVE has been validated as not applicable to the Solus package. This can be because another patch resolves this CVE, or there is a false positive via ",(0,s.jsx)(n.code,{children:"cve-check-tool"}),". The contents of the file can describe why it doesn't apply without requiring a patch (i.e. Resolved by cve-xxxx-xxxx.patch)."]}),"\n",(0,s.jsx)(n.h3,{id:"applying-a-patch",children:"Applying a patch"}),"\n",(0,s.jsxs)(n.p,{children:["It is common practice to apply the patch file(s) within the ",(0,s.jsx)(n.code,{children:"setup"})," section of your build staging. We can achieve this using the ",(0,s.jsx)(n.code,{children:"%patch"})," macro, and the ",(0,s.jsx)(n.code,{children:"$pkgfiles"})," variable. In this example, the required file is located at ",(0,s.jsx)(n.code,{children:"./files/0002-Sample-commit-2.patch"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"%patch -p1 -i $pkgfiles/0002-Sample-commit-2.patch\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Note you use the macro as you would normally use the ",(0,s.jsx)(n.code,{children:"patch"})," command, however use of the macro ensures it performs a clean batch-mode patch."]}),"\n",(0,s.jsxs)(n.p,{children:["If you are using compressed patches, i.e. for the ",(0,s.jsx)(n.code,{children:"bash"})," or ",(0,s.jsx)(n.code,{children:"readline"})," packages, you can pipe the call through ",(0,s.jsx)(n.code,{children:"zcat"})," or similar:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"zcat $pkgfiles/bash43-032.gz | %patch -p0\n"})}),"\n",(0,s.jsx)(n.h4,{id:"handling-multiple-patches",children:"Handling multiple patches"}),"\n",(0,s.jsxs)(n.p,{children:["In the event you need to apply multiple patches, such as a multitude of CVE patches, it may be sensible to use our ",(0,s.jsx)(n.code,{children:"%apply_patches"})," macro, which will apply all the patches listed in a ",(0,s.jsx)(n.code,{children:"series"})," file in your package's ",(0,s.jsx)(n.code,{children:"./files"})," folder. Example below:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"security/cve-xxxx-xxxx.patch\nfix-silliness.patch\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Both of the files above will be applied using stripping number ",(0,s.jsx)(n.code,{children:"-p1"}),". If you need to use a different stripping number, like ",(0,s.jsx)(n.code,{children:"-p4"}),", you can write:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"security/cve-xxxx-xxxx.patch -p4\nfix-silliness.patch\n"})}),"\n",(0,s.jsx)(n.h2,{id:"installing-extra-files",children:"Installing extra files"}),"\n",(0,s.jsxs)(n.p,{children:["We recommend using patches where possible first, as they ensure correct maintenance and will be updated across package versions. If you must install extra files into the directory, please use the ",(0,s.jsx)(n.code,{children:"install"})," command, ensuring you set the correct permissions. Again, files are accessible from the ",(0,s.jsx)(n.code,{children:"./files"})," directory, relative to ",(0,s.jsx)(n.code,{children:"package.yml"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["This is an example of installing a custom profile file, seen in the ",(0,s.jsx)(n.code,{children:"bash"})," package:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"install -m 0644 $pkgfiles/profile $installdir/etc/profile\n"})}),"\n",(0,s.jsx)(n.h2,{id:"patterns",children:"Patterns"}),"\n",(0,s.jsxs)(n.p,{children:["In most instances, ",(0,s.jsx)(n.code,{children:"ypkg"})," will assign the correct location for files, whether it be in the main ",(0,s.jsx)(n.code,{children:"name"})," package, or a subpackage. However there may be instances where the default does not match the intended behaviour."]}),"\n",(0,s.jsx)(n.p,{children:"In these instances it is possible to override the default assignment by way of patterns. These are simply a list of paths or globs to ensure a particular file, or set of files, end up in the desired location."}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"patterns"})," key expects a ",(0,s.jsx)(n.code,{children:"dict(s)"})," argument. The default key for each pattern is assumed to be the ",(0,s.jsx)(n.code,{children:"name"})," of the package, so omitting the name would place files into the main package. The value should be a path or pattern you wish to match, ensuring files go to a specific location."]}),"\n",(0,s.jsxs)(n.p,{children:["In this example from ",(0,s.jsx)(n.code,{children:"libjpeg-turbo"}),", we move all documentation into the ",(0,s.jsx)(n.code,{children:"docs"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"patterns:\n - docs: [/usr/share/man]\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This example, taken from the ",(0,s.jsx)(n.code,{children:"wayland"})," package, ensures the binaries from ",(0,s.jsx)(n.code,{children:"/usr/bin"})," and the directory ",(0,s.jsx)(n.code,{children:"/usr/share/wayland"})," are located in the ",(0,s.jsx)(n.code,{children:"devel"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"patterns:\n - devel:\n - /usr/bin\n - /usr/share/wayland\n"})}),"\n",(0,s.jsx)(n.h2,{id:"replace--rename",children:"Replace / rename"}),"\n",(0,s.jsxs)(n.p,{children:["In some situations, it may be required to replace one package with another, or to rename an existing package. In these instances you should coordinate with a repository maintainer to ensure the replaced package is marked ",(0,s.jsx)(n.strong,{children:"Obsolete"})," within the index. This will ensure correct upgrade paths for users."]}),"\n",(0,s.jsxs)(n.p,{children:["Note that to retire a package, you must also coordinate with a repository maintainer. An ",(0,s.jsx)(n.strong,{children:"Obsolete"})," package is removed by the package manager when the user upgrades. As such, correct upgrade paths need to be established."]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"replaces"})," ypkg key uses the ",(0,s.jsx)(n.code,{children:"dict(s)"})," type, and the default key is assumed to be the current package ",(0,s.jsx)(n.code,{children:"name"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["In this example, we rename the ",(0,s.jsx)(n.code,{children:"libgeoclue*"})," packages to use the correct names, and ensure a working upgrade path."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"replaces:\n - devel: libgeoclue-devel\n - libgeoclue\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"name"})," of this package is ",(0,s.jsx)(n.code,{children:"geoclue"}),", and the new package names are now:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"geoclue"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"geoclue-devel"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Given the ",(0,s.jsx)(n.code,{children:"replaces"})," values above, ",(0,s.jsx)(n.code,{children:"geoclue"})," now replaces ",(0,s.jsx)(n.code,{children:"libgeoclue"}),", and ",(0,s.jsx)(n.code,{children:"geoclue-devel"})," replaces ",(0,s.jsx)(n.code,{children:"libgeoclue-devel"}),". This is entirely transparent to the user, with a seamless update replacing the old packages with the new renamed packages."]}),"\n",(0,s.jsxs)(n.p,{children:["The repository maintainer marked the old names as ",(0,s.jsx)(n.strong,{children:"Obsolete"})," in the index."]})]})}function h(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}},11151:(e,n,i)=>{i.d(n,{Z:()=>d,a:()=>t});var s=i(67294);const a={},c=s.createContext(a);function t(e){const n=s.useContext(c);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:t(e.components),s.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3783],{99937:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>c,metadata:()=>d,toc:()=>r});var s=i(85893),a=i(11151);const c={title:"Packaging Practices",summary:"Learning the best packaging practices"},t="Packaging Practices",d={id:"packaging/packaging-practices",title:"Packaging Practices",description:"The primary goal of ypkg is ease of maintenance. In order to do so we ensure packages in the binary repository adhere to a strict set of conventions and practices.",source:"@site/docs/packaging/packaging-practices.md",sourceDirName:"packaging",slug:"/packaging/packaging-practices",permalink:"/docs/packaging/packaging-practices",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/packaging-practices.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Packaging Practices",summary:"Learning the best packaging practices"},sidebar:"packagingSidebar",previous:{title:"Package YAML",permalink:"/docs/packaging/package.yml"},next:{title:"Procedures",permalink:"/docs/category/procedures"}},l={},r=[{value:"Package naming",id:"package-naming",level:2},{value:"The devel subpackage",id:"the-devel-subpackage",level:3},{value:"The docs subpackage",id:"the-docs-subpackage",level:3},{value:"The 32bit subpackage",id:"the-32bit-subpackage",level:3},{value:"The utils subpackage",id:"the-utils-subpackage",level:3},{value:"Maintenance",id:"maintenance",level:2},{value:"Licenses",id:"licenses",level:2},{value:"Build dependencies",id:"build-dependencies",level:2},{value:"Background",id:"background",level:3},{value:"Finding what package provides a pkgconfig dependency (if any)",id:"finding-what-package-provides-a-pkgconfig-dependency-if-any",level:3},{value:"Using pkgconfig dependencies",id:"using-pkgconfig-dependencies",level:3},{value:"Using explicitly named dependencies",id:"using-explicitly-named-dependencies",level:3},{value:"Runtime dependencies",id:"runtime-dependencies",level:2},{value:"Check dependencies",id:"check-dependencies",level:2},{value:"Example",id:"example",level:3},{value:"Patching / extra files",id:"patching--extra-files",level:2},{value:"Applying a patch",id:"applying-a-patch",level:3},{value:"Handling multiple patches",id:"handling-multiple-patches",level:4},{value:"Installing extra files",id:"installing-extra-files",level:2},{value:"Patterns",id:"patterns",level:2},{value:"Replace / rename",id:"replace--rename",level:2}];function o(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"packaging-practices",children:"Packaging Practices"})}),"\n",(0,s.jsxs)(n.p,{children:["The primary goal of ",(0,s.jsx)(n.code,{children:"ypkg"})," is ease of maintenance. In order to do so we ensure packages in the binary repository adhere to a strict set of conventions and practices."]}),"\n",(0,s.jsx)(n.p,{children:"The next few sections will detail these."}),"\n",(0,s.jsx)(n.h2,{id:"package-naming",children:"Package naming"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"ypkg"})," tool does not allow for custom subpackages or subpackage naming, and will enforce its own policy. This can be eased somewhat through the use of ",(0,s.jsx)(n.code,{children:"patterns"}),", however the available subpackage names are limited."]}),"\n",(0,s.jsxs)(n.p,{children:["We request you use (where possible) the upstream source name for your package. Subpackage names (when generated) are constructed by using the ",(0,s.jsx)(n.code,{children:"name"})," value first, then applying the subpackage name as such:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.code,{children:"pkgname-$subpackage"})}),"\n",(0,s.jsxs)(n.p,{children:["Subpackages are fully automatic with ",(0,s.jsx)(n.code,{children:"ypkg"}),", and are created based on file patterns. All subpackages automatically depend on the main package, to ensure correct operation. In the following explanations, ",(0,s.jsx)(n.code,{children:"$lib"})," is used to refer to the host library directory, i.e. ",(0,s.jsx)(n.code,{children:"lib"})," or ",(0,s.jsx)(n.code,{children:"lib64"})," (or ",(0,s.jsx)(n.code,{children:"lib32"})," on ",(0,s.jsx)(n.code,{children:"emul32"})," builds)."]}),"\n",(0,s.jsx)(n.p,{children:"For the libraries / packages of the following programming languages, you should typically use the following template for it."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Language"}),(0,s.jsx)(n.th,{children:"Prefix"}),(0,s.jsx)(n.th,{children:"Example"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Haskell"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"haskell-"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"text-binary"})," would be ",(0,s.jsx)(n.code,{children:"haskell-text-binary"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Perl"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"perl-"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"algorithm-diff"})," would be ",(0,s.jsx)(n.code,{children:"perl-algorithm-diff"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Python"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"python-"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"wikipedia"})," would be ",(0,s.jsx)(n.code,{children:"python-wikipedia"})," ",(0,s.jsx)(n.strong,{children:"even if only Python3 is enabled"})]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Ruby"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"ruby-"})}),(0,s.jsxs)(n.td,{children:[(0,s.jsx)(n.code,{children:"gssapi"})," would be ",(0,s.jsx)(n.code,{children:"ruby-gssapi"})]})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"the-devel-subpackage",children:"The devel subpackage"}),"\n",(0,s.jsxs)(n.p,{children:["This is invariably created for packages that provide libraries and development headers. The following rules will result in files being placed in a ",(0,s.jsx)(n.code,{children:"devel"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"/usr/include\n/usr/$lib/lib*.so\n/usr/$lib/lib*.a\n/usr/share/man/man3\n/usr/share/pkgconfig\n/usr/$lib/pkgconfig\n/usr/share/cmake\n/usr/share/vala\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Note that for some packages, ",(0,s.jsx)(n.code,{children:"/usr/$lib/lib*.so"})," files are not symlinks. In this instance, the main package will be broken with no library files present. This can quickly be determined by looking at the resulting ",(0,s.jsx)(n.code,{children:"pspec_*.xml"})," file generated after running the build.\nIf this happens, simply override with ",(0,s.jsx)(n.code,{children:"patterns"})," or set ",(0,s.jsx)(n.code,{children:"libsplit"})," to \u201cno\u201d."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"A note on static archives"}),": Unless it is absolutely unavoidable, you should disable static libraries within your build. This is usually fixed by adding ",(0,s.jsx)(n.code,{children:"--disable-static"})," to your configure routine. If ",(0,s.jsx)(n.code,{children:"*.a"})," files are shown in your packaging request, it will be questioned, as they can pose a greater security risk if packages link against these static archives."]}),"\n",(0,s.jsx)(n.h3,{id:"the-docs-subpackage",children:"The docs subpackage"}),"\n",(0,s.jsxs)(n.p,{children:["Currently there is only one pattern which is forced into a ",(0,s.jsx)(n.code,{children:"docs"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"/usr/share/gtk-doc/html\n"})}),"\n",(0,s.jsxs)(n.p,{children:["If required, you can use ",(0,s.jsx)(n.code,{children:"patterns"})," to move other files into the ",(0,s.jsx)(n.code,{children:"docs"})," subpackage, reducing the size of the main package."]}),"\n",(0,s.jsx)(n.h3,{id:"the-32bit-subpackage",children:"The 32bit subpackage"}),"\n",(0,s.jsxs)(n.p,{children:["This subpackage is only generated during an ",(0,s.jsx)(n.code,{children:"emul32"})," build. The following paths will automatically be placed into a ",(0,s.jsx)(n.code,{children:"32bit"})," subpackage"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"/usr/lib32/lib*.so\n/usr/lib32/lib*.so.*\n/usr/lib32/lib*.a\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Note the same static archive rules apply to ",(0,s.jsx)(n.code,{children:"32bit"})," packages. These packages aren\u2019t as heavily split as we try to discourage their use, though they must be provided in some instances."]}),"\n",(0,s.jsx)(n.h3,{id:"the-utils-subpackage",children:"The utils subpackage"}),"\n",(0,s.jsxs)(n.p,{children:["This is not an automatic subpackage, you must use ",(0,s.jsx)(n.code,{children:"patterns"})," to utilize it. It is provided for instances that it may not be suitable to have binaries present, i.e. for a library package."]}),"\n",(0,s.jsx)(n.h2,{id:"maintenance",children:"Maintenance"}),"\n",(0,s.jsxs)(n.p,{children:["When submitting a changed ",(0,s.jsx)(n.code,{children:"package.yml"}),", it must be accompanied by its corresponding ",(0,s.jsx)(n.code,{children:"pspec_*.xml"})," file, which was generated at build time. This machine file allows the repository maintainers to evaluate the package condition."]}),"\n",(0,s.jsxs)(n.p,{children:["When providing a new version of a package, or a fix, always ensure you increment the ",(0,s.jsx)(n.code,{children:"release"})," number by 1. This ensures that users of your package are correctly updated to the latest version."]}),"\n",(0,s.jsxs)(n.p,{children:["Never submit a package without having first tested it, and ensuring it builds within ",(0,s.jsx)(n.code,{children:"solbuild"}),", a clean chroot environment."]}),"\n",(0,s.jsx)(n.h2,{id:"licenses",children:"Licenses"}),"\n",(0,s.jsxs)(n.p,{children:["All new packages or updates to packages should abide by the ",(0,s.jsx)(n.a,{href:"https://spdx.org/licenses/",children:"SPDX 3.x"})," definitions, with the following policy:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"-only"})," licenses, such as ",(0,s.jsx)(n.code,{children:"GPL-2.0-only"}),", should ",(0,s.jsx)(n.strong,{children:"only be declared"}),' as such when the upstream explicitly states "only", otherwise it should always be ',(0,s.jsx)(n.code,{children:"-or-later"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"build-dependencies",children:"Build dependencies"}),"\n",(0,s.jsxs)(n.admonition,{type:"note",children:[(0,s.jsxs)(n.p,{children:["Build dependencies should be ordered according to the following rules in ",(0,s.jsx)(n.code,{children:"package.yml"}),":"]}),(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies before explicitly named dependencies"]}),"\n",(0,s.jsxs)(n.li,{children:["Each of these two groups in so-called ASCIIbetical order (that is, alphabetical order with all uppercase letters before lowercase letters, and digits/punctuation before letters, ",(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/ASCII#Character_order",children:"see here"}),")"]}),"\n"]}),(0,s.jsx)(n.p,{children:"Example:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"builddeps :\n - pkgconfig(MYGUI)\n - pkgconfig(Qt5Core)\n - pkgconfig(ayatana-appindicator-0.1)\n - pkgconfig(dri)\n - pkgconfig(gtk+-3.0)\n - The-Powder-Toy\n - abcMIDI\n - abcm2ps\n - git\n - python-poetry\n - swig\n"})})]}),"\n",(0,s.jsx)(n.h3,{id:"background",children:"Background"}),"\n",(0,s.jsx)(n.p,{children:"Most software packages that you build will, in one way or another, depend on another software package to provide specific functionality. This is usually achieved by using a library."}),"\n",(0,s.jsx)(n.p,{children:"Any package that is submitted to our repositories is always built in a clean chroot environment. Therefore, any dependencies required to build that package in a reproducible and sane fashion must be listed."}),"\n",(0,s.jsxs)(n.p,{children:["This is achieved by populating the ",(0,s.jsx)(n.code,{children:"builddeps"})," key with a list of build dependencies. We support two kinds of build dependencies: explicitly named, or ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies."]}),"\n",(0,s.jsxs)(n.p,{children:["We prefer the use of ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies. Most modern software will use the ",(0,s.jsx)(n.code,{children:"pkg-config"})," tool (package configuration) to determine which files are required to build the current software. This may include compiler flags, library to link against and where the package headers are located."]}),"\n",(0,s.jsxs)(n.p,{children:["An obvious advantage to supporting ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies is that there is a 1:1 mapping between the name requested by the build and the name used within the ",(0,s.jsx)(n.code,{children:"package.yml"}),". Instead of trying to hunt down the package providing that dependency, you simply list the same name. Any package in the repository will export information about the ",(0,s.jsx)(n.code,{children:".pc"})," files (for ",(0,s.jsx)(n.code,{children:"pkg-config"}),") it contains, enabling you to use those as a build dependency."]}),"\n",(0,s.jsxs)(n.p,{children:["A secondary advantage is that this allows for easily switching or replacing a providing package. When no ",(0,s.jsx)(n.code,{children:"pkgconfig"})," name is available (some packages do not provide these, or it doesn\u2019t make sense for them to), you may use the explicit package name. Always ensure you select the correct package, i.e. the ",(0,s.jsx)(n.code,{children:"-devel"})," subpackage. This provides the necessary symlinks and headers to build packages."]}),"\n",(0,s.jsx)(n.h3,{id:"finding-what-package-provides-a-pkgconfig-dependency-if-any",children:"Finding what package provides a pkgconfig dependency (if any)"}),"\n",(0,s.jsxs)(n.p,{children:["You can use ",(0,s.jsx)(n.code,{children:"go-task"})," to find packages that satisfy ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependencies. It can search for multiple dependencies at once."]}),"\n",(0,s.jsxs)(n.p,{children:["As an example, if you know a package has the build dependencies ",(0,s.jsx)(n.code,{children:"Qt5Core"})," and ",(0,s.jsx)(n.code,{children:"Qt6Core"}),", you would run:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"go-task pkgconfig -- Qt5Core Qt6Core\n"})}),"\n",(0,s.jsx)(n.p,{children:"This will output:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"pkgconfig(Qt5Core) found in: qt5-base-devel\npkgconfig(Qt6Core) found in: qt6-base-devel\n"})}),"\n",(0,s.jsxs)(n.p,{children:["You can also determine if there are ",(0,s.jsx)(n.code,{children:"pkgconfigs"})," available from a ",(0,s.jsx)(n.code,{children:"-devel"})," package by doing ",(0,s.jsx)(n.code,{children:"eopkg info (name)"})," and looking for the ",(0,s.jsx)(n.code,{children:"Provides"})," key."]}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"eopkg info libgtk-3-devel\n"})}),"\n",(0,s.jsx)(n.p,{children:"In output:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"Provides: pkgconfig(gtk+-3.0) pkgconfig(gdk-3.0) pkgconfig(gdk-wayland-3.0) pkgconfig(gail-3.0) pkgconfig(gdk-x11-3.0) pkgconfig(gtk+-unix-print-3.0)\npkgconfig(gtk+-wayland-3.0) pkgconfig(gtk+-x11-3.0)\n"})}),"\n",(0,s.jsx)(n.h3,{id:"using-pkgconfig-dependencies",children:"Using pkgconfig dependencies"}),"\n",(0,s.jsxs)(n.p,{children:["In the ",(0,s.jsx)(n.code,{children:"builddeps"})," list, use the ",(0,s.jsx)(n.code,{children:"pkgconfig(name)"})," syntax. For example, to add ",(0,s.jsx)(n.code,{children:"gtk+-3.0"})," to the build dependencies, you would do the following:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"builddeps:\n - pkgconfig(gtk+-3.0)\n"})}),"\n",(0,s.jsxs)(n.p,{children:["At build time the appropriate provider package is selected, in this instance ",(0,s.jsx)(n.code,{children:"libgtk-3-devel"})]}),"\n",(0,s.jsx)(n.h3,{id:"using-explicitly-named-dependencies",children:"Using explicitly named dependencies"}),"\n",(0,s.jsxs)(n.p,{children:["When there is not a ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependency available, use an explicitly named dependency.\nSimply list the package name."]}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["When a ",(0,s.jsx)(n.code,{children:"pkgconfig"})," dependency is available you will be asked to use that instead."]})}),"\n",(0,s.jsx)(n.p,{children:"Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"builddeps:\n - stk-devel\n"})}),"\n",(0,s.jsx)(n.h2,{id:"runtime-dependencies",children:"Runtime dependencies"}),"\n",(0,s.jsxs)(n.p,{children:["Runtime dependencies are extra packages that a package needs in order to function correctly. A common example of this is other libraries. Solus ",(0,s.jsx)(n.code,{children:"eopkg"})," packages will automatically add any binary dependencies at runtime, so that you do not have to."]}),"\n",(0,s.jsxs)(n.p,{children:["All ",(0,s.jsx)(n.code,{children:"devel"})," subpackages automatically depend on their parent package. On top of this, if they provide a ",(0,s.jsx)(n.code,{children:".pc"})," pkg-config file, we export this information, and automatically determine the packages this particular package would need to be able to build against correctly. As such, the majority of dependencies for builds are automatically resolved."]}),"\n",(0,s.jsx)(n.p,{children:"In certain instances, binary dependencies aren\u2019t enough. An example of this might be an extra Python package, or a font, something that is not accounted for by binary checks."}),"\n",(0,s.jsxs)(n.p,{children:["To account for this, you may add extra explicit runtime dependencies to your package. These are taken from the optional ",(0,s.jsx)(n.code,{children:"rundeps"})," ypkg key."]}),"\n",(0,s.jsxs)(n.p,{children:["This key uses the ",(0,s.jsx)(n.code,{children:"dict(s)"})," type, and the default key is the current package ",(0,s.jsx)(n.code,{children:"name"}),". You may express a different subpackage to apply dependencies to by using that name as a key, i.e. ",(0,s.jsx)(n.code,{children:"devel"}),", or ",(0,s.jsx)(n.code,{children:"docs"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"This would add the \u201cpython-gobject\u201d runtime dependency to the main package:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"rundeps:\n - python-gobject\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This would add the same dependency, as well as adding it to the ",(0,s.jsx)(n.code,{children:"devel"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"rundeps:\n - python-gobject\n - devel: python-gobject\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Remember this uses the ",(0,s.jsx)(n.code,{children:"dict(s)"})," type, which is very flexible. You can equally express this as follows (adding more deps as an example):"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:"rundeps:\n - python-gobject\n - devel:\n - somepackage\n - someotherpackage\n"})}),"\n",(0,s.jsx)(n.h2,{id:"check-dependencies",children:"Check dependencies"}),"\n",(0,s.jsxs)(n.p,{children:["Check dependencies are a special kind of build dependency reserved for automatic package testing by ",(0,s.jsx)(n.code,{children:"solbuild"}),". Check dependencies should only be used during the ",(0,s.jsx)(n.code,{children:"check"})," build phase.\nWhen a package is part of an automatic build sequence, these dependencies will ",(0,s.jsx)(n.strong,{children:"not"})," be considered when determining build order."]}),"\n",(0,s.jsx)(n.h3,{id:"example",children:"Example"}),"\n",(0,s.jsxs)(n.p,{children:["The package ",(0,s.jsx)(n.code,{children:"cbindgen"})," includes ",(0,s.jsx)(n.code,{children:"cython"})," in ",(0,s.jsx)(n.code,{children:"checkdeps"})," to run tests in the ",(0,s.jsx)(n.code,{children:"check"})," phase."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://github.com/getsolus/packages/blob/main/packages/c/cbindgen/package.yml",children:"cbindgen package.yml file"})}),"\n",(0,s.jsx)(n.h2,{id:"patching--extra-files",children:"Patching / extra files"}),"\n",(0,s.jsxs)(n.p,{children:["Files that may be required during the build can be accessed via the ",(0,s.jsx)(n.code,{children:"$pkgfiles"})," variable. Note that you must store your files in the ",(0,s.jsx)(n.code,{children:"./files"})," directory relative to your ",(0,s.jsx)(n.code,{children:"package.yml"})]}),"\n",(0,s.jsxs)(n.p,{children:["Both patches and extra files (such as systemd units) are stored in this directory. Note that if your patch is to address a ",(0,s.jsx)(n.strong,{children:"CVE"}),", you must use the following naming scheme: ",(0,s.jsx)(n.code,{children:"./files/security/cve-xxxx-xxxx.patch"})]}),"\n",(0,s.jsxs)(n.p,{children:["Where ",(0,s.jsx)(n.code,{children:"xxxx-xxxx"})," is replaced with the full CVE ID. Complying with this simple rule ensures that we can know at any time the security status of packages when using tools such as ",(0,s.jsx)(n.code,{children:"cve-check-tool"}),"\nkept\nSolus tooling allows the use of ",(0,s.jsx)(n.code,{children:"./files/security/cve-xxxx-xxxx.nopatch"})," (which isn't applied in the build) to indicate that a CVE has been validated as not applicable to the Solus package. This can be because another patch resolves this CVE, or there is a false positive via ",(0,s.jsx)(n.code,{children:"cve-check-tool"}),". The contents of the file can describe why it doesn't apply without requiring a patch (i.e. Resolved by cve-xxxx-xxxx.patch)."]}),"\n",(0,s.jsx)(n.h3,{id:"applying-a-patch",children:"Applying a patch"}),"\n",(0,s.jsxs)(n.p,{children:["It is common practice to apply the patch file(s) within the ",(0,s.jsx)(n.code,{children:"setup"})," section of your build staging. We can achieve this using the ",(0,s.jsx)(n.code,{children:"%patch"})," macro, and the ",(0,s.jsx)(n.code,{children:"$pkgfiles"})," variable. In this example, the required file is located at ",(0,s.jsx)(n.code,{children:"./files/0002-Sample-commit-2.patch"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"%patch -p1 -i $pkgfiles/0002-Sample-commit-2.patch\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Note you use the macro as you would normally use the ",(0,s.jsx)(n.code,{children:"patch"})," command, however use of the macro ensures it performs a clean batch-mode patch."]}),"\n",(0,s.jsxs)(n.p,{children:["If you are using compressed patches, i.e. for the ",(0,s.jsx)(n.code,{children:"bash"})," or ",(0,s.jsx)(n.code,{children:"readline"})," packages, you can pipe the call through ",(0,s.jsx)(n.code,{children:"zcat"})," or similar:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"zcat $pkgfiles/bash43-032.gz | %patch -p0\n"})}),"\n",(0,s.jsx)(n.h4,{id:"handling-multiple-patches",children:"Handling multiple patches"}),"\n",(0,s.jsxs)(n.p,{children:["In the event you need to apply multiple patches, such as a multitude of CVE patches, it may be sensible to use our ",(0,s.jsx)(n.code,{children:"%apply_patches"})," macro, which will apply all the patches listed in a ",(0,s.jsx)(n.code,{children:"series"})," file in your package's ",(0,s.jsx)(n.code,{children:"./files"})," folder. Example below:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"security/cve-xxxx-xxxx.patch\nfix-silliness.patch\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Both of the files above will be applied using stripping number ",(0,s.jsx)(n.code,{children:"-p1"}),". If you need to use a different stripping number, like ",(0,s.jsx)(n.code,{children:"-p4"}),", you can write:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"security/cve-xxxx-xxxx.patch -p4\nfix-silliness.patch\n"})}),"\n",(0,s.jsx)(n.h2,{id:"installing-extra-files",children:"Installing extra files"}),"\n",(0,s.jsxs)(n.p,{children:["We recommend using patches where possible first, as they ensure correct maintenance and will be updated across package versions. If you must install extra files into the directory, please use the ",(0,s.jsx)(n.code,{children:"install"})," command, ensuring you set the correct permissions. Again, files are accessible from the ",(0,s.jsx)(n.code,{children:"./files"})," directory, relative to ",(0,s.jsx)(n.code,{children:"package.yml"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["This is an example of installing a custom profile file, seen in the ",(0,s.jsx)(n.code,{children:"bash"})," package:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"install -m 0644 $pkgfiles/profile $installdir/etc/profile\n"})}),"\n",(0,s.jsx)(n.h2,{id:"patterns",children:"Patterns"}),"\n",(0,s.jsxs)(n.p,{children:["In most instances, ",(0,s.jsx)(n.code,{children:"ypkg"})," will assign the correct location for files, whether it be in the main ",(0,s.jsx)(n.code,{children:"name"})," package, or a subpackage. However there may be instances where the default does not match the intended behaviour."]}),"\n",(0,s.jsx)(n.p,{children:"In these instances it is possible to override the default assignment by way of patterns. These are simply a list of paths or globs to ensure a particular file, or set of files, end up in the desired location."}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"patterns"})," key expects a ",(0,s.jsx)(n.code,{children:"dict(s)"})," argument. The default key for each pattern is assumed to be the ",(0,s.jsx)(n.code,{children:"name"})," of the package, so omitting the name would place files into the main package. The value should be a path or pattern you wish to match, ensuring files go to a specific location."]}),"\n",(0,s.jsxs)(n.p,{children:["In this example from ",(0,s.jsx)(n.code,{children:"libjpeg-turbo"}),", we move all documentation into the ",(0,s.jsx)(n.code,{children:"docs"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"patterns:\n - docs: [/usr/share/man]\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This example, taken from the ",(0,s.jsx)(n.code,{children:"wayland"})," package, ensures the binaries from ",(0,s.jsx)(n.code,{children:"/usr/bin"})," and the directory ",(0,s.jsx)(n.code,{children:"/usr/share/wayland"})," are located in the ",(0,s.jsx)(n.code,{children:"devel"})," subpackage:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"patterns:\n - devel:\n - /usr/bin\n - /usr/share/wayland\n"})}),"\n",(0,s.jsx)(n.h2,{id:"replace--rename",children:"Replace / rename"}),"\n",(0,s.jsxs)(n.p,{children:["In some situations, it may be required to replace one package with another, or to rename an existing package. In these instances you should coordinate with a repository maintainer to ensure the replaced package is marked ",(0,s.jsx)(n.strong,{children:"Obsolete"})," within the index. This will ensure correct upgrade paths for users."]}),"\n",(0,s.jsxs)(n.p,{children:["Note that to retire a package, you must also coordinate with a repository maintainer. An ",(0,s.jsx)(n.strong,{children:"Obsolete"})," package is removed by the package manager when the user upgrades. As such, correct upgrade paths need to be established."]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"replaces"})," ypkg key uses the ",(0,s.jsx)(n.code,{children:"dict(s)"})," type, and the default key is assumed to be the current package ",(0,s.jsx)(n.code,{children:"name"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["In this example, we rename the ",(0,s.jsx)(n.code,{children:"libgeoclue*"})," packages to use the correct names, and ensure a working upgrade path."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"replaces:\n - devel: libgeoclue-devel\n - libgeoclue\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"name"})," of this package is ",(0,s.jsx)(n.code,{children:"geoclue"}),", and the new package names are now:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"geoclue"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"geoclue-devel"})}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Given the ",(0,s.jsx)(n.code,{children:"replaces"})," values above, ",(0,s.jsx)(n.code,{children:"geoclue"})," now replaces ",(0,s.jsx)(n.code,{children:"libgeoclue"}),", and ",(0,s.jsx)(n.code,{children:"geoclue-devel"})," replaces ",(0,s.jsx)(n.code,{children:"libgeoclue-devel"}),". This is entirely transparent to the user, with a seamless update replacing the old packages with the new renamed packages."]}),"\n",(0,s.jsxs)(n.p,{children:["The repository maintainer marked the old names as ",(0,s.jsx)(n.strong,{children:"Obsolete"})," in the index."]})]})}function h(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}},11151:(e,n,i)=>{i.d(n,{Z:()=>d,a:()=>t});var s=i(67294);const a={},c=s.createContext(a);function t(e){const n=s.useContext(c);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:t(e.components),s.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/513b6405.07a2f1ca.js b/assets/js/513b6405.4ada61ee.js similarity index 99% rename from assets/js/513b6405.07a2f1ca.js rename to assets/js/513b6405.4ada61ee.js index fd2045351..9c4be8f5e 100644 --- a/assets/js/513b6405.07a2f1ca.js +++ b/assets/js/513b6405.4ada61ee.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4278],{38033:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var t=s(85893),n=s(11151);const o={title:"Prepare for Packaging",summary:"Quick guide on getting your system set up for packaging on Solus",sidebar_position:1},r="Prepare for packaging",a={id:"packaging/prepare-for-packaging",title:"Prepare for Packaging",description:"Switch to the Unstable repository",source:"@site/docs/packaging/prepare-for-packaging.md",sourceDirName:"packaging",slug:"/packaging/prepare-for-packaging",permalink:"/docs/packaging/prepare-for-packaging",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/prepare-for-packaging.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,sidebarPosition:1,frontMatter:{title:"Prepare for Packaging",summary:"Quick guide on getting your system set up for packaging on Solus",sidebar_position:1},sidebar:"packagingSidebar",previous:{title:"Packaging Overview",permalink:"/docs/packaging/"},next:{title:"Update Your Development Environment",permalink:"/docs/packaging/update-dev-environment"}},l={},c=[{value:"Switch to the Unstable repository",id:"switch-to-the-unstable-repository",level:2},{value:"Setting up the packager file",id:"setting-up-the-packager-file",level:2},{value:"Installing development tools",id:"installing-development-tools",level:2},{value:"Setting up a GitHub account and Git",id:"setting-up-a-github-account-and-git",level:2},{value:"Configure github-cli.",id:"configure-github-cli",level:3},{value:"Git identity setup",id:"git-identity-setup",level:3},{value:"Setting up solbuild",id:"setting-up-solbuild",level:2},{value:"Updating solbuild",id:"updating-solbuild",level:3},{value:"Fork the getsolus/packages repository",id:"fork-the-getsoluspackages-repository",level:2},{value:"Clone your forked package repository",id:"clone-your-forked-package-repository",level:2},{value:"Initialize git hooks",id:"initialize-git-hooks",level:2},{value:"Set up repository helper functions (optional)",id:"set-up-repository-helper-functions-optional",level:2},{value:"bash",id:"bash",level:3},{value:"fish",id:"fish",level:3},{value:"zsh",id:"zsh",level:3},{value:"Building packages",id:"building-packages",level:2}];function d(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"prepare-for-packaging",children:"Prepare for packaging"})}),"\n",(0,t.jsx)(i.h2,{id:"switch-to-the-unstable-repository",children:"Switch to the Unstable repository"}),"\n",(0,t.jsx)(i.p,{children:'Packages need to be built and tested against the "unstable" repository. If you don\'t want to switch your primary system to unstable, you can do your packaging work in a VM. We have Virtual Machine Manager and other similar tools in the Solus repository.'}),"\n",(0,t.jsxs)(i.p,{children:["Refer to ",(0,t.jsx)(i.a,{href:"/docs/user/package-management/repo-management",children:"Repository Management"})," to see how to add and switch to unstable."]}),"\n",(0,t.jsx)(i.h2,{id:"setting-up-the-packager-file",children:"Setting up the packager file"}),"\n",(0,t.jsx)(i.p,{children:"In order to utilize the build system, you must first set up a configuration file that has your packager details."}),"\n",(0,t.jsxs)(i.p,{children:["This file lives in the ",(0,t.jsx)(i.code,{children:".config/solus"})," folder of your home directory. You will need to create the ",(0,t.jsx)(i.code,{children:".config/solus"})," folder as well as the inner ",(0,t.jsx)(i.code,{children:"packager"})," file. Inside the packager file, you need two keys, ",(0,t.jsx)(i.code,{children:"Name"})," and ",(0,t.jsx)(i.code,{children:"Email"}),". This is used when generating the machine file so that the packager details are stored within the resulting binary package."]}),"\n",(0,t.jsxs)(i.p,{children:["Name and email address are mandatory. You must use your real first and last name(s) for accountability purposes.\nA ",(0,t.jsx)(i.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"})," contact is optional but recommended."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-ini",children:"[Packager]\nName=Your Name Here\nEmail=your.email@address\nMatrix=@username:matrix.org\n"})}),"\n",(0,t.jsx)(i.h2,{id:"installing-development-tools",children:"Installing development tools"}),"\n",(0,t.jsx)(i.p,{children:"We need to install a few things in order to get started with packaging:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"git"})," is used for version control of the Solus sources"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"github-cli"})," is used to make working with GitHub easier"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"go-task"})," is used by our build tools for scripting"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"jq"})," is used by our optional ",(0,t.jsx)(i.a,{href:"#set-up-repository-helper-functions-optional",children:"Helper Functions"})]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"solbuild"})," is a lightweight container environment for building packages repeatably"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"solbuild-config-unstable"})," sets up solbuild for working with the ",(0,t.jsx)(i.code,{children:"unstable"})," repository"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"ypkg"})," is the program that actually builds packages"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"yq"})," is used by the ",(0,t.jsx)(i.code,{children:"go-task add-monitoring"})," command to create new ",(0,t.jsx)(i.a,{href:"/docs/packaging/monitoring.yml",children:(0,t.jsx)(i.code,{children:"monitoring.yml"})})," files"]}),"\n"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo eopkg it git github-cli go-task jq solbuild solbuild-config-unstable ypkg yq\n"})}),"\n",(0,t.jsx)(i.h2,{id:"setting-up-a-github-account-and-git",children:"Setting up a GitHub account and Git"}),"\n",(0,t.jsxs)(i.p,{children:["The Solus source repositories for the package repository currently reside on ",(0,t.jsx)(i.a,{href:"https://github.com/getsolus/packages",children:"github.com/getsolus/packages"}),". You will need a GitHub account to submit patches and file issues. You can create a GitHub account ",(0,t.jsx)(i.a,{href:"https://github.com/signup",children:"here"}),". Note that you will also need to set up ",(0,t.jsx)(i.a,{href:"https://docs.github.com/en/authentication/securing-your-account-with-two-factor-authentication-2fa",children:"2FA"})," (two-factor authentication) for your account."]}),"\n",(0,t.jsxs)(i.h3,{id:"configure-github-cli",children:["Configure ",(0,t.jsx)(i.code,{children:"github-cli"}),"."]}),"\n",(0,t.jsxs)(i.p,{children:["Once you have a GitHub account, you need to configure ",(0,t.jsx)(i.code,{children:"github-cli"})," to work with it. At minimum, you need to run ",(0,t.jsx)(i.code,{children:"gh auth login"}),". Have your GitHub credentials and 2FA (two-factor authentication) mechanism at hand."]}),"\n",(0,t.jsxs)(i.p,{children:["See the ",(0,t.jsx)(i.a,{href:"https://docs.github.com/en/github-cli/github-cli/quickstart",children:"GitHub CLI quickstart"})," for some common uses of the tool."]}),"\n",(0,t.jsx)(i.h3,{id:"git-identity-setup",children:"Git identity setup"}),"\n",(0,t.jsxs)(i.p,{children:["If you have not used git before, you should set your git identity in your global git config file (",(0,t.jsx)(i.code,{children:"~/.gitconfig"}),"). Use the following commands:"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:'git config --global user.name "John Doe"\ngit config --global user.email johndoe@example.com\n'})}),"\n",(0,t.jsxs)(i.p,{children:["See the ",(0,t.jsx)(i.a,{href:"https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup",children:"Git Book"})," for more first-time setup options."]}),"\n",(0,t.jsx)(i.h2,{id:"setting-up-solbuild",children:"Setting up solbuild"}),"\n",(0,t.jsxs)(i.p,{children:["The ",(0,t.jsx)(i.code,{children:"solbuild"})," tool must first be initialized with a base image. All builds thereafter will use this as a base, and construct a temporary overlay root to save on time and disk space in builds."]}),"\n",(0,t.jsx)(i.p,{children:"Initialize solbuild via:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo solbuild init\n"})}),"\n",(0,t.jsx)(i.p,{children:"This will take some time as it downloads and prepares the image."}),"\n",(0,t.jsx)(i.h3,{id:"updating-solbuild",children:"Updating solbuild"}),"\n",(0,t.jsx)(i.p,{children:"It is a good idea to keep the base image updated. It will help reduce build times by not having to repeatedly download updates to packages in the base image, and will strictly need to pull down the packages your build needs."}),"\n",(0,t.jsx)(i.p,{children:"To update solbuild, run:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo solbuild update\n"})}),"\n",(0,t.jsx)(i.h2,{id:"fork-the-getsoluspackages-repository",children:"Fork the getsolus/packages repository"}),"\n",(0,t.jsxs)(i.p,{children:["Create your own fork of ",(0,t.jsx)(i.a,{href:"https://github.com/getsolus/packages",children:"getsolus/packages"})," using the GitHub web UI or ",(0,t.jsxs)(i.a,{href:"https://cli.github.com/manual/gh_repo_fork",children:[(0,t.jsx)(i.code,{children:"gh"})," cli tool"]})," from the ",(0,t.jsx)(i.code,{children:"github-cli"})," package. It will be forked to ",(0,t.jsx)(i.code,{children:"github.com/yourgithubaccount/packages"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"clone-your-forked-package-repository",children:"Clone your forked package repository"}),"\n",(0,t.jsxs)(i.p,{children:["Create a local clone of the package repository you just forked. Here we are using the name ",(0,t.jsx)(i.code,{children:"solus-packages"})," and cloning it into our home directoy. The rest of the documentation will presume this structure. You can choose a different name and path but will have to make sure to replace it in every command that refers to the ",(0,t.jsx)(i.code,{children:"solus-packages"})," directory."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"gh repo clone packages ~/solus-packages\n"})}),"\n",(0,t.jsx)(i.h2,{id:"initialize-git-hooks",children:"Initialize git hooks"}),"\n",(0,t.jsx)(i.p,{children:"Initialize Git hooks for working with the repository by running:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"go-task -d ~/solus-packages init\n"})}),"\n",(0,t.jsx)(i.p,{children:"This makes it easy to create commits in the correct format, and will warn you about issues with changes you commit."}),"\n",(0,t.jsx)(i.h2,{id:"set-up-repository-helper-functions-optional",children:"Set up repository helper functions (optional)"}),"\n",(0,t.jsx)(i.p,{children:"The helper functions are a collection of shell scripts that help you navigate the packages repository more quickly, and perform some specialized searches."}),"\n",(0,t.jsx)(i.p,{children:"After cloning your repository, create a symlink to source the helper functions for your shell. Then, start a new instance of the shell."}),"\n",(0,t.jsx)(i.h3,{id:"bash",children:"bash"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"mkdir -p ~/.bashrc.d\nln -s ~/solus-packages/common/Scripts/helpers.sh ~/.bashrc.d/solus-monorepo-helpers.sh\n"})}),"\n",(0,t.jsx)(i.h3,{id:"fish",children:"fish"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"mkdir -p ~/.config/fish/conf.d\nln -s ~/solus-packages/common/Scripts/helpers.fish ~/.config/fish/conf.d/solus.fish\n"})}),"\n",(0,t.jsx)(i.h3,{id:"zsh",children:"zsh"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:'mkdir -p ~/.zshrc.d\nprintf "\\nfpath=(~/.zshrc.d \\$fpath)" >> ~/.zshrc\nsource ~/.zshrc\nln -s ~/solus-packages/common/Scripts/helpers.zsh ~/.zshrc.d/solus-monorepo-helpers.zsh\n'})}),"\n",(0,t.jsx)(i.hr,{}),"\n",(0,t.jsx)(i.p,{children:"You should now have the following available from your shell:"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Function"}),(0,t.jsx)(i.th,{children:"Description"}),(0,t.jsx)(i.th,{children:"Usage"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"cpesearch"})}),(0,t.jsxs)(i.td,{children:["Search for CPE Names for packages. For use when writing the ",(0,t.jsx)(i.a,{href:"/docs/packaging/monitoring.yml",children:(0,t.jsx)(i.code,{children:"monitoring.yml"})})," file for a package"]}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"cpesearch search-term"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"goroot"})}),(0,t.jsx)(i.td,{children:"When in the Solus packages repository, change directory to the root directory."}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"goroot"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"gotopkg"})}),(0,t.jsxs)(i.td,{children:["Change directory to any Solus package. You can type part of the package name then double press ",(0,t.jsx)(i.code,{children:"Tab"})," to get autocompletion for this function."]}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"gotopkg firefox"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"gotosoluspkgs"})}),(0,t.jsx)(i.td,{children:"Change directory to the Solus packages repository from anywhere on the filesystem."}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"gotosoluspkgs"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"whatprovides"})}),(0,t.jsxs)(i.td,{children:["Find out what package provides a library by reading the ",(0,t.jsx)(i.code,{children:"abi_libs"})," files."]}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"whatprovides libfoobar.so.1"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"whatuses"})}),(0,t.jsxs)(i.td,{children:["Find out what packages use a library by reading the ",(0,t.jsx)(i.code,{children:"abi_used_libs"})," files."]}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"whatuses libfoobar.so.1"})})]})]})]}),"\n",(0,t.jsx)(i.h2,{id:"building-packages",children:"Building packages"}),"\n",(0,t.jsxs)(i.p,{children:["Your system is now set up for package work.\nIf you are new to packaging, see ",(0,t.jsx)(i.a,{href:"/docs/packaging/your-first-package-update",children:"Your First Package Update"}),"."]})]})}function h(e={}){const{wrapper:i}={...(0,n.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},11151:(e,i,s)=>{s.d(i,{Z:()=>a,a:()=>r});var t=s(67294);const n={},o=t.createContext(n);function r(e){const i=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),t.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4278],{38033:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var t=s(85893),n=s(11151);const o={title:"Prepare for Packaging",summary:"Quick guide on getting your system set up for packaging on Solus",sidebar_position:1},r="Prepare for packaging",a={id:"packaging/prepare-for-packaging",title:"Prepare for Packaging",description:"Switch to the Unstable repository",source:"@site/docs/packaging/prepare-for-packaging.md",sourceDirName:"packaging",slug:"/packaging/prepare-for-packaging",permalink:"/docs/packaging/prepare-for-packaging",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/prepare-for-packaging.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,sidebarPosition:1,frontMatter:{title:"Prepare for Packaging",summary:"Quick guide on getting your system set up for packaging on Solus",sidebar_position:1},sidebar:"packagingSidebar",previous:{title:"Packaging Overview",permalink:"/docs/packaging/"},next:{title:"Update Your Development Environment",permalink:"/docs/packaging/update-dev-environment"}},l={},c=[{value:"Switch to the Unstable repository",id:"switch-to-the-unstable-repository",level:2},{value:"Setting up the packager file",id:"setting-up-the-packager-file",level:2},{value:"Installing development tools",id:"installing-development-tools",level:2},{value:"Setting up a GitHub account and Git",id:"setting-up-a-github-account-and-git",level:2},{value:"Configure github-cli.",id:"configure-github-cli",level:3},{value:"Git identity setup",id:"git-identity-setup",level:3},{value:"Setting up solbuild",id:"setting-up-solbuild",level:2},{value:"Updating solbuild",id:"updating-solbuild",level:3},{value:"Fork the getsolus/packages repository",id:"fork-the-getsoluspackages-repository",level:2},{value:"Clone your forked package repository",id:"clone-your-forked-package-repository",level:2},{value:"Initialize git hooks",id:"initialize-git-hooks",level:2},{value:"Set up repository helper functions (optional)",id:"set-up-repository-helper-functions-optional",level:2},{value:"bash",id:"bash",level:3},{value:"fish",id:"fish",level:3},{value:"zsh",id:"zsh",level:3},{value:"Building packages",id:"building-packages",level:2}];function d(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"prepare-for-packaging",children:"Prepare for packaging"})}),"\n",(0,t.jsx)(i.h2,{id:"switch-to-the-unstable-repository",children:"Switch to the Unstable repository"}),"\n",(0,t.jsx)(i.p,{children:'Packages need to be built and tested against the "unstable" repository. If you don\'t want to switch your primary system to unstable, you can do your packaging work in a VM. We have Virtual Machine Manager and other similar tools in the Solus repository.'}),"\n",(0,t.jsxs)(i.p,{children:["Refer to ",(0,t.jsx)(i.a,{href:"/docs/user/package-management/repo-management",children:"Repository Management"})," to see how to add and switch to unstable."]}),"\n",(0,t.jsx)(i.h2,{id:"setting-up-the-packager-file",children:"Setting up the packager file"}),"\n",(0,t.jsx)(i.p,{children:"In order to utilize the build system, you must first set up a configuration file that has your packager details."}),"\n",(0,t.jsxs)(i.p,{children:["This file lives in the ",(0,t.jsx)(i.code,{children:".config/solus"})," folder of your home directory. You will need to create the ",(0,t.jsx)(i.code,{children:".config/solus"})," folder as well as the inner ",(0,t.jsx)(i.code,{children:"packager"})," file. Inside the packager file, you need two keys, ",(0,t.jsx)(i.code,{children:"Name"})," and ",(0,t.jsx)(i.code,{children:"Email"}),". This is used when generating the machine file so that the packager details are stored within the resulting binary package."]}),"\n",(0,t.jsxs)(i.p,{children:["Name and email address are mandatory. You must use your real first and last name(s) for accountability purposes.\nA ",(0,t.jsx)(i.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"})," contact is optional but recommended."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-ini",children:"[Packager]\nName=Your Name Here\nEmail=your.email@address\nMatrix=@username:matrix.org\n"})}),"\n",(0,t.jsx)(i.h2,{id:"installing-development-tools",children:"Installing development tools"}),"\n",(0,t.jsx)(i.p,{children:"We need to install a few things in order to get started with packaging:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"git"})," is used for version control of the Solus sources"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"github-cli"})," is used to make working with GitHub easier"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"go-task"})," is used by our build tools for scripting"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"jq"})," is used by our optional ",(0,t.jsx)(i.a,{href:"#set-up-repository-helper-functions-optional",children:"Helper Functions"})]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"solbuild"})," is a lightweight container environment for building packages repeatably"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"solbuild-config-unstable"})," sets up solbuild for working with the ",(0,t.jsx)(i.code,{children:"unstable"})," repository"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"ypkg"})," is the program that actually builds packages"]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.code,{children:"yq"})," is used by the ",(0,t.jsx)(i.code,{children:"go-task add-monitoring"})," command to create new ",(0,t.jsx)(i.a,{href:"/docs/packaging/monitoring.yml",children:(0,t.jsx)(i.code,{children:"monitoring.yml"})})," files"]}),"\n"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo eopkg it git github-cli go-task jq solbuild solbuild-config-unstable ypkg yq\n"})}),"\n",(0,t.jsx)(i.h2,{id:"setting-up-a-github-account-and-git",children:"Setting up a GitHub account and Git"}),"\n",(0,t.jsxs)(i.p,{children:["The Solus source repositories for the package repository currently reside on ",(0,t.jsx)(i.a,{href:"https://github.com/getsolus/packages",children:"github.com/getsolus/packages"}),". You will need a GitHub account to submit patches and file issues. You can create a GitHub account ",(0,t.jsx)(i.a,{href:"https://github.com/signup",children:"here"}),". Note that you will also need to set up ",(0,t.jsx)(i.a,{href:"https://docs.github.com/en/authentication/securing-your-account-with-two-factor-authentication-2fa",children:"2FA"})," (two-factor authentication) for your account."]}),"\n",(0,t.jsxs)(i.h3,{id:"configure-github-cli",children:["Configure ",(0,t.jsx)(i.code,{children:"github-cli"}),"."]}),"\n",(0,t.jsxs)(i.p,{children:["Once you have a GitHub account, you need to configure ",(0,t.jsx)(i.code,{children:"github-cli"})," to work with it. At minimum, you need to run ",(0,t.jsx)(i.code,{children:"gh auth login"}),". Have your GitHub credentials and 2FA (two-factor authentication) mechanism at hand."]}),"\n",(0,t.jsxs)(i.p,{children:["See the ",(0,t.jsx)(i.a,{href:"https://docs.github.com/en/github-cli/github-cli/quickstart",children:"GitHub CLI quickstart"})," for some common uses of the tool."]}),"\n",(0,t.jsx)(i.h3,{id:"git-identity-setup",children:"Git identity setup"}),"\n",(0,t.jsxs)(i.p,{children:["If you have not used git before, you should set your git identity in your global git config file (",(0,t.jsx)(i.code,{children:"~/.gitconfig"}),"). Use the following commands:"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:'git config --global user.name "John Doe"\ngit config --global user.email johndoe@example.com\n'})}),"\n",(0,t.jsxs)(i.p,{children:["See the ",(0,t.jsx)(i.a,{href:"https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup",children:"Git Book"})," for more first-time setup options."]}),"\n",(0,t.jsx)(i.h2,{id:"setting-up-solbuild",children:"Setting up solbuild"}),"\n",(0,t.jsxs)(i.p,{children:["The ",(0,t.jsx)(i.code,{children:"solbuild"})," tool must first be initialized with a base image. All builds thereafter will use this as a base, and construct a temporary overlay root to save on time and disk space in builds."]}),"\n",(0,t.jsx)(i.p,{children:"Initialize solbuild via:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo solbuild init\n"})}),"\n",(0,t.jsx)(i.p,{children:"This will take some time as it downloads and prepares the image."}),"\n",(0,t.jsx)(i.h3,{id:"updating-solbuild",children:"Updating solbuild"}),"\n",(0,t.jsx)(i.p,{children:"It is a good idea to keep the base image updated. It will help reduce build times by not having to repeatedly download updates to packages in the base image, and will strictly need to pull down the packages your build needs."}),"\n",(0,t.jsx)(i.p,{children:"To update solbuild, run:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo solbuild update\n"})}),"\n",(0,t.jsx)(i.h2,{id:"fork-the-getsoluspackages-repository",children:"Fork the getsolus/packages repository"}),"\n",(0,t.jsxs)(i.p,{children:["Create your own fork of ",(0,t.jsx)(i.a,{href:"https://github.com/getsolus/packages",children:"getsolus/packages"})," using the GitHub web UI or ",(0,t.jsxs)(i.a,{href:"https://cli.github.com/manual/gh_repo_fork",children:[(0,t.jsx)(i.code,{children:"gh"})," cli tool"]})," from the ",(0,t.jsx)(i.code,{children:"github-cli"})," package. It will be forked to ",(0,t.jsx)(i.code,{children:"github.com/yourgithubaccount/packages"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"clone-your-forked-package-repository",children:"Clone your forked package repository"}),"\n",(0,t.jsxs)(i.p,{children:["Create a local clone of the package repository you just forked. Here we are using the name ",(0,t.jsx)(i.code,{children:"solus-packages"})," and cloning it into our home directoy. The rest of the documentation will presume this structure. You can choose a different name and path but will have to make sure to replace it in every command that refers to the ",(0,t.jsx)(i.code,{children:"solus-packages"})," directory."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"gh repo clone packages ~/solus-packages\n"})}),"\n",(0,t.jsx)(i.h2,{id:"initialize-git-hooks",children:"Initialize git hooks"}),"\n",(0,t.jsx)(i.p,{children:"Initialize Git hooks for working with the repository by running:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"go-task -d ~/solus-packages init\n"})}),"\n",(0,t.jsx)(i.p,{children:"This makes it easy to create commits in the correct format, and will warn you about issues with changes you commit."}),"\n",(0,t.jsx)(i.h2,{id:"set-up-repository-helper-functions-optional",children:"Set up repository helper functions (optional)"}),"\n",(0,t.jsx)(i.p,{children:"The helper functions are a collection of shell scripts that help you navigate the packages repository more quickly, and perform some specialized searches."}),"\n",(0,t.jsx)(i.p,{children:"After cloning your repository, create a symlink to source the helper functions for your shell. Then, start a new instance of the shell."}),"\n",(0,t.jsx)(i.h3,{id:"bash",children:"bash"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"mkdir -p ~/.bashrc.d\nln -s ~/solus-packages/common/Scripts/helpers.sh ~/.bashrc.d/solus-monorepo-helpers.sh\n"})}),"\n",(0,t.jsx)(i.h3,{id:"fish",children:"fish"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"mkdir -p ~/.config/fish/conf.d\nln -s ~/solus-packages/common/Scripts/helpers.fish ~/.config/fish/conf.d/solus.fish\n"})}),"\n",(0,t.jsx)(i.h3,{id:"zsh",children:"zsh"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:'mkdir -p ~/.zshrc.d\nprintf "\\nfpath=(~/.zshrc.d \\$fpath)" >> ~/.zshrc\nsource ~/.zshrc\nln -s ~/solus-packages/common/Scripts/helpers.zsh ~/.zshrc.d/solus-monorepo-helpers.zsh\n'})}),"\n",(0,t.jsx)(i.hr,{}),"\n",(0,t.jsx)(i.p,{children:"You should now have the following available from your shell:"}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Function"}),(0,t.jsx)(i.th,{children:"Description"}),(0,t.jsx)(i.th,{children:"Usage"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"cpesearch"})}),(0,t.jsxs)(i.td,{children:["Search for CPE Names for packages. For use when writing the ",(0,t.jsx)(i.a,{href:"/docs/packaging/monitoring.yml",children:(0,t.jsx)(i.code,{children:"monitoring.yml"})})," file for a package"]}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"cpesearch search-term"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"goroot"})}),(0,t.jsx)(i.td,{children:"When in the Solus packages repository, change directory to the root directory."}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"goroot"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"gotopkg"})}),(0,t.jsxs)(i.td,{children:["Change directory to any Solus package. You can type part of the package name then double press ",(0,t.jsx)(i.code,{children:"Tab"})," to get autocompletion for this function."]}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"gotopkg firefox"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"gotosoluspkgs"})}),(0,t.jsx)(i.td,{children:"Change directory to the Solus packages repository from anywhere on the filesystem."}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"gotosoluspkgs"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"whatprovides"})}),(0,t.jsxs)(i.td,{children:["Find out what package provides a library by reading the ",(0,t.jsx)(i.code,{children:"abi_libs"})," files."]}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"whatprovides libfoobar.so.1"})})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:(0,t.jsx)(i.strong,{children:"whatuses"})}),(0,t.jsxs)(i.td,{children:["Find out what packages use a library by reading the ",(0,t.jsx)(i.code,{children:"abi_used_libs"})," files."]}),(0,t.jsx)(i.td,{children:(0,t.jsx)(i.code,{children:"whatuses libfoobar.so.1"})})]})]})]}),"\n",(0,t.jsx)(i.h2,{id:"building-packages",children:"Building packages"}),"\n",(0,t.jsxs)(i.p,{children:["Your system is now set up for package work.\nIf you are new to packaging, see ",(0,t.jsx)(i.a,{href:"/docs/packaging/your-first-package-update",children:"Your First Package Update"}),"."]})]})}function h(e={}){const{wrapper:i}={...(0,n.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},11151:(e,i,s)=>{s.d(i,{Z:()=>a,a:()=>r});var t=s(67294);const n={},o=t.createContext(n);function r(e){const i=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),t.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/528b6a6b.6bd7ed5f.js b/assets/js/528b6a6b.37e18ccf.js similarity index 98% rename from assets/js/528b6a6b.6bd7ed5f.js rename to assets/js/528b6a6b.37e18ccf.js index efd32f17a..2340ccc81 100644 --- a/assets/js/528b6a6b.6bd7ed5f.js +++ b/assets/js/528b6a6b.37e18ccf.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7822],{61661:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>u,contentTitle:()=>o,default:()=>c,frontMatter:()=>n,metadata:()=>i,toc:()=>l});var r=t(85893),a=t(11151);const n={title:"KSysGuard",summary:"Quick Start guide to KSysGuard on Solus"},o="KSysGuard",i={id:"user/software/utilities/ksysguard",title:"KSysGuard",description:"KSysGuard, also known as KDE System Guard and KDE System Monitor, is designed to make simple process control available to a user without needing to do any special setup.",source:"@site/docs/user/software/utilities/ksysguard.md",sourceDirName:"user/software/utilities",slug:"/user/software/utilities/ksysguard",permalink:"/docs/user/software/utilities/ksysguard",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/utilities/ksysguard.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"KSysGuard",summary:"Quick Start guide to KSysGuard on Solus"},sidebar:"userSidebar",previous:{title:"Utilities",permalink:"/docs/category/utilities"},next:{title:"KDE Wallet",permalink:"/docs/user/software/utilities/kwallet"}},u={},l=[{value:"Installation",id:"installation",level:2},{value:"Use KSysGuard as a non-root user",id:"use-ksysguard-as-a-non-root-user",level:2},{value:"Usage",id:"usage",level:2}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"ksysguard",children:"KSysGuard"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.a,{href:"https://userbase.kde.org/KSysGuard",children:"KSysGuard"}),", also known as KDE System Guard and KDE System Monitor, is designed to make simple process control available to a user without needing to do any special setup."]}),"\n",(0,r.jsx)(s.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(s.p,{children:"KSysGuard is usually installed as part of the KDE Plasma Desktop environment, but can be installed from the Software Center or via terminal:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg it ksysguard\n"})}),"\n",(0,r.jsx)(s.h2,{id:"use-ksysguard-as-a-non-root-user",children:"Use KSysGuard as a non-root user"}),"\n",(0,r.jsx)(s.p,{children:"The per process networking plugin requires elevated access to your system. To enable the plugin as non-root user, execute these commands:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:'sudo setcap "CAP_NET_RAW=+ep" "/usr/lib64/kf5/ksysguard/ksgrd_network_helper"\n'})}),"\n",(0,r.jsx)(s.h2,{id:"usage",children:"Usage"}),"\n",(0,r.jsxs)(s.p,{children:["KSysGuard ",(0,r.jsx)(s.a,{href:"https://userbase.kde.org/KSysGuard",children:"User\u2019s Guide"})," or the KDE Help Centre (open khelp on your Plasma Desktop)."]})]})}function c(e={}){const{wrapper:s}={...(0,a.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>i,a:()=>o});var r=t(67294);const a={},n=r.createContext(a);function o(e){const s=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(n.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7822],{61661:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>u,contentTitle:()=>o,default:()=>c,frontMatter:()=>n,metadata:()=>i,toc:()=>l});var r=t(85893),a=t(11151);const n={title:"KSysGuard",summary:"Quick Start guide to KSysGuard on Solus"},o="KSysGuard",i={id:"user/software/utilities/ksysguard",title:"KSysGuard",description:"KSysGuard, also known as KDE System Guard and KDE System Monitor, is designed to make simple process control available to a user without needing to do any special setup.",source:"@site/docs/user/software/utilities/ksysguard.md",sourceDirName:"user/software/utilities",slug:"/user/software/utilities/ksysguard",permalink:"/docs/user/software/utilities/ksysguard",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/utilities/ksysguard.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"KSysGuard",summary:"Quick Start guide to KSysGuard on Solus"},sidebar:"userSidebar",previous:{title:"Utilities",permalink:"/docs/category/utilities"},next:{title:"KDE Wallet",permalink:"/docs/user/software/utilities/kwallet"}},u={},l=[{value:"Installation",id:"installation",level:2},{value:"Use KSysGuard as a non-root user",id:"use-ksysguard-as-a-non-root-user",level:2},{value:"Usage",id:"usage",level:2}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"ksysguard",children:"KSysGuard"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.a,{href:"https://userbase.kde.org/KSysGuard",children:"KSysGuard"}),", also known as KDE System Guard and KDE System Monitor, is designed to make simple process control available to a user without needing to do any special setup."]}),"\n",(0,r.jsx)(s.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(s.p,{children:"KSysGuard is usually installed as part of the KDE Plasma Desktop environment, but can be installed from the Software Center or via terminal:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"sudo eopkg it ksysguard\n"})}),"\n",(0,r.jsx)(s.h2,{id:"use-ksysguard-as-a-non-root-user",children:"Use KSysGuard as a non-root user"}),"\n",(0,r.jsx)(s.p,{children:"The per process networking plugin requires elevated access to your system. To enable the plugin as non-root user, execute these commands:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:'sudo setcap "CAP_NET_RAW=+ep" "/usr/lib64/kf5/ksysguard/ksgrd_network_helper"\n'})}),"\n",(0,r.jsx)(s.h2,{id:"usage",children:"Usage"}),"\n",(0,r.jsxs)(s.p,{children:["KSysGuard ",(0,r.jsx)(s.a,{href:"https://userbase.kde.org/KSysGuard",children:"User\u2019s Guide"})," or the KDE Help Centre (open khelp on your Plasma Desktop)."]})]})}function c(e={}){const{wrapper:s}={...(0,a.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>i,a:()=>o});var r=t(67294);const a={},n=r.createContext(a);function o(e){const s=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(n.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/533eefa9.2deb3749.js b/assets/js/533eefa9.69b673fa.js similarity index 99% rename from assets/js/533eefa9.2deb3749.js rename to assets/js/533eefa9.69b673fa.js index 3cd6128ef..ac25d52b5 100644 --- a/assets/js/533eefa9.2deb3749.js +++ b/assets/js/533eefa9.69b673fa.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4002],{99023:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>a});var s=n(85893),t=n(11151);const l={title:"Preparing to Install",summary:"Installation Guide for multiple operating systems"},r="Preparing to install",o={id:"user/quick-start/installation/index",title:"Preparing to Install",description:"Before you start, make sure your system meets the minimum requirements.",source:"@site/docs/user/quick-start/installation/index.md",sourceDirName:"user/quick-start/installation",slug:"/user/quick-start/installation/",permalink:"/docs/user/quick-start/installation/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/installation/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Preparing to Install",summary:"Installation Guide for multiple operating systems"},sidebar:"userSidebar",previous:{title:"Default Applications",permalink:"/docs/user/quick-start/default-applications"},next:{title:"Disk Partitioning",permalink:"/docs/user/quick-start/installation/disks"}},d={},a=[{value:"Getting the ISO",id:"getting-the-iso",level:2},{value:"Verifying the ISO",id:"verifying-the-iso",level:2},{value:"Linux and macOS",id:"linux-and-macos",level:3},{value:"Verifying the SHA256SUMS file signature",id:"verifying-the-sha256sums-file-signature",level:4},{value:"Verifying the ISO checksum",id:"verifying-the-iso-checksum",level:4},{value:"Windows",id:"windows",level:3},{value:"Verifying signed SHA256SUM file",id:"verifying-signed-sha256sum-file",level:4},{value:"Verifying the ISO checksum",id:"verifying-the-iso-checksum-1",level:4},{value:"Creating bootable media",id:"creating-bootable-media",level:2},{value:"Linux",id:"linux",level:3},{value:"DVD",id:"dvd",level:4},{value:"USB",id:"usb",level:4},{value:"GNOME MultiWriter",id:"gnome-multiwriter",level:5},{value:"KDE ISO Image Writer",id:"kde-iso-image-writer",level:4},{value:"Command-line",id:"command-line",level:5},{value:"Windows",id:"windows-1",level:3},{value:"DVD",id:"dvd-1",level:4},{value:"USB",id:"usb-1",level:4},{value:"macOS",id:"macos",level:3},{value:"DVD",id:"dvd-2",level:4},{value:"USB",id:"usb-2",level:4},{value:"Graphical tool",id:"graphical-tool",level:5},{value:"Command-line",id:"command-line-1",level:5},{value:"Boot the media",id:"boot-the-media",level:2}];function h(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"preparing-to-install",children:"Preparing to install"})}),"\n",(0,s.jsxs)(i.p,{children:["Before you start, make sure your system meets the ",(0,s.jsx)(i.a,{href:"/docs/user/quick-start/installation/system-requirements",children:"minimum requirements"}),"."]}),"\n",(0,s.jsx)(i.p,{children:"The first step to installing Solus is getting the correct media. The Solus Project provides ISO images, which contain the contents of Solus for installing."}),"\n",(0,s.jsx)(i.h2,{id:"getting-the-iso",children:"Getting the ISO"}),"\n",(0,s.jsxs)(i.p,{children:["Download a Solus ISO by going to our ",(0,s.jsx)(i.a,{href:"https://getsol.us/download",children:"Download page"})," and picking an edition."]}),"\n",(0,s.jsx)(i.h2,{id:"verifying-the-iso",children:"Verifying the ISO"}),"\n",(0,s.jsx)(i.h3,{id:"linux-and-macos",children:"Linux and macOS"}),"\n",(0,s.jsxs)(i.p,{children:["Download the SHA256SUMS files for your chosen ISO edition: ",(0,s.jsx)(i.em,{children:"File"}),", ",(0,s.jsx)(i.em,{children:"Signed File"})," and ",(0,s.jsx)(i.em,{children:"Public Key"})," from the links next to the ",(0,s.jsx)(i.em,{children:"Download"})," buttons on our ",(0,s.jsx)(i.a,{href:"https://getsol.us/download",children:"Download page"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Note:"})," You should download all these files to the same directory."]}),"\n",(0,s.jsx)(i.h4,{id:"verifying-the-sha256sums-file-signature",children:"Verifying the SHA256SUMS file signature"}),"\n",(0,s.jsx)(i.p,{children:"Import the Solus public key:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"cd ~/path/to/download/directory\ngpg --import solus-releng-pub.gpg\n"})}),"\n",(0,s.jsx)(i.p,{children:"Verify the signed checksum file:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"gpg --verify Solus-Budgie-Release-2024-10-14.iso.sha256sum.sign Solus-Budgie-Release-2024-10-14.iso.sha256sum\n"})}),"\n",(0,s.jsx)(i.h4,{id:"verifying-the-iso-checksum",children:"Verifying the ISO checksum"}),"\n",(0,s.jsx)(i.p,{children:"Check that the computed hash of the downloaded ISO file matches the hash supplied by Solus:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"sha256sum -c Solus-Budgie-Release-2024-10-14.iso.sha256sum | grep OK\n"})}),"\n",(0,s.jsx)(i.h3,{id:"windows",children:"Windows"}),"\n",(0,s.jsx)(i.h4,{id:"verifying-signed-sha256sum-file",children:"Verifying signed SHA256SUM file"}),"\n",(0,s.jsxs)(i.p,{children:["On Windows, first install ",(0,s.jsx)(i.a,{href:"https://www.gpg4win.org/",children:"Gpg4win"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["Now you can run the same ",(0,s.jsx)(i.code,{children:"gpg"})," commands from the the ",(0,s.jsx)(i.a,{href:"/docs/user/quick-start/installation/#verifying-the-sha256sums-file-signature",children:(0,s.jsx)(i.em,{children:"Verifyng the SHA256SUMS file signature"})})," section above."]}),"\n",(0,s.jsx)(i.h4,{id:"verifying-the-iso-checksum-1",children:"Verifying the ISO checksum"}),"\n",(0,s.jsx)(i.p,{children:"Launch powershell and compute the hash of the ISO file you just downloaded. You will have to manually compare the result to the hash in the SHA256SUMS file."}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-powershell",children:"Get-FileHash C:\\path\\to\\Solus-Budgie-Release-2024-10-14.iso\ncat C:\\path\\to\\Solus-Budgie-Release-2024-10-14.iso.sha256sum\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Alternatively, you can use a graphical program that can calculate SHA256 hashes like ",(0,s.jsx)(i.em,{children:"Rufus"})," or ",(0,s.jsx)(i.em,{children:"7-Zip"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"creating-bootable-media",children:"Creating bootable media"}),"\n",(0,s.jsx)(i.p,{children:"To make boot media, you will need:"}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Either a blank DVD or a USB drive larger than 2 GB."}),"\n",(0,s.jsx)(i.li,{children:"If using a USB, the ability to boot from the USB."}),"\n",(0,s.jsxs)(i.li,{children:["ISO file from the ",(0,s.jsx)(i.a,{href:"#getting-the-iso",children:"Getting the ISO"})," section."]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"There are many tools which can write our ISO image to DVDs or USB thumb drives. Chose from an option below."}),"\n",(0,s.jsx)(i.h3,{id:"linux",children:"Linux"}),"\n",(0,s.jsx)(i.h4,{id:"dvd",children:"DVD"}),"\n",(0,s.jsxs)(i.p,{children:["We recommend using ",(0,s.jsx)(i.a,{href:"https://wiki.gnome.org/Apps/Brasero",children:"Brasero"})," for writing the ISO to a DVD."]}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Insert blank DVD (DVD-R or DVD+RW is suitable) into your DVD writer."}),"\n",(0,s.jsx)(i.li,{children:"Open Brasero."}),"\n",(0,s.jsx)(i.li,{children:"Select the option \u201cBurn image\u201d."}),"\n",(0,s.jsx)(i.li,{children:"Click the \u201cClick here to select a disc image\u201d button and using the file dialog, choose the ISO."}),"\n",(0,s.jsx)(i.li,{children:"Ensure the correct DVD is selected in the \u201cSelect a disc to write to\u201d."}),"\n",(0,s.jsx)(i.li,{children:'Click "Burn" and wait.'}),"\n",(0,s.jsx)(i.li,{children:'Upon seeing \u201cImage successfully burned to DVD\u201d, click "Close".'}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"usb",children:"USB"}),"\n",(0,s.jsxs)(i.p,{children:["We recommend using ",(0,s.jsx)(i.a,{href:"https://wiki.gnome.org/Apps/MultiWriter",children:"GNOME MultiWriter"})," or ",(0,s.jsx)(i.a,{href:"https://apps.kde.org/isoimagewriter/",children:"ISO Image Writer"})," for KDE. Please note that UNetbootin will ",(0,s.jsx)(i.strong,{children:"not"})," work."]}),"\n",(0,s.jsx)(i.h5,{id:"gnome-multiwriter",children:"GNOME MultiWriter"}),"\n",(0,s.jsx)(i.p,{children:"Upon opening GNOME MultiWriter, you will likely be shown a window similar to the one below, if your USB drive is already plugged in and mounted."}),"\n",(0,s.jsx)(i.admonition,{type:"warning",children:(0,s.jsxs)(i.p,{children:["The ISO image will be written to ",(0,s.jsx)(i.em,{children:"all mounted USB drives"}),". Ensure that the only USB drive that is connected is the one you wish to write the ISO to."]})}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"MultiWriter Start",src:n(7173).Z+"",width:"706",height:"156"})}),"\n",(0,s.jsx)(i.p,{children:"If your USB drive is not mounted, you will be prompted with an image indicating to plug it in."}),"\n",(0,s.jsx)(i.p,{children:'Next, click the "Start Copying" button, and you will be prompted to select the ISO. Choose the ISO you downloaded in the "Getting the ISO" section. The USB will automatically be written to.'}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"MultiWriter Writing",src:n(39115).Z+"",width:"706",height:"156"})}),"\n",(0,s.jsx)(i.p,{children:"Upon completion, you will be prompted with the following dialog and your USB is now ready for use."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"MultiWriter Done",src:n(69064).Z+"",width:"706",height:"156"})}),"\n",(0,s.jsx)(i.h4,{id:"kde-iso-image-writer",children:"KDE ISO Image Writer"}),"\n",(0,s.jsx)(i.admonition,{type:"info",children:(0,s.jsx)(i.p,{children:"You will need both the ISO and sha256sums file for it saved in the same directory."})}),"\n",(0,s.jsx)(i.p,{children:"When you open ISO Image Writer, you will see a window similar to the one below, if your USB drive is already plugged in and mounted."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"ImageWriter Start",src:n(8234).Z+"",width:"585",height:"446"})}),"\n",(0,s.jsx)(i.p,{children:"If there is no USB drive mounted, the USB drive field will be greyed out. Simply plug in the USB drive you want to use for the ISO, it will be auto-detected."}),"\n",(0,s.jsx)(i.p,{children:'Click on the top field "Write this ISO image:". Select the ISO image you downloaded in the "Getting the ISO" section.'}),"\n",(0,s.jsx)(i.p,{children:'You may see "Downloading ISO image". When this is done, click the Create button.'}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"ImageWriter Writing",src:n(51213).Z+"",width:"551",height:"430"})}),"\n",(0,s.jsx)(i.p,{children:"When the operation is finished, you will see the confirmation dialog. Your USB is now ready for use."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"ImageWriter Done",src:n(46368).Z+"",width:"585",height:"446"})}),"\n",(0,s.jsx)(i.h5,{id:"command-line",children:"Command-line"}),"\n",(0,s.jsxs)(i.p,{children:["For those comfortable with the command-line / terminal, we will walk you through using ",(0,s.jsx)(i.code,{children:"dd"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["First, insert the USB drive into your computer and open your Terminal. Proceed to type ",(0,s.jsx)(i.code,{children:"lsblk"})," into your Terminal. It should output something along the lines of:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nsda 8:0 0 111.8G 0 disk\n\u251c\u2500sda1 8:1 0 350M 0 part\n\u251c\u2500sda2 8:2 0 39.7G 0 part\n\u2514\u2500sda3 8:3 0 71.8G 0 part /\nsdb 8:64 1 7.5G 0 disk\n\u251c\u2500sdb1 8:65 1 712M 0 part\n\u2514\u2500sdb2 8:66 1 17.2M 0 part\n"})}),"\n",(0,s.jsxs)(i.p,{children:["You will see one disk, in this case ",(0,s.jsx)(i.code,{children:"/dev/sdb"}),", that is roughly the size of the USB drive. Yours should be similar (difference being in size). Write this device down somewhere."]}),"\n",(0,s.jsxs)(i.p,{children:["Next, locate the downloaded ISO. It will most likely be in your Downloads folder. In the event that it is, type: ",(0,s.jsx)(i.code,{children:"cd ~/Downloads"})]}),"\n",(0,s.jsxs)(i.p,{children:["If it is ",(0,s.jsx)(i.strong,{children:"not"})," in your Downloads folder, use ",(0,s.jsx)(i.code,{children:"cd"})," to navigate to the correct directory."]}),"\n",(0,s.jsx)(i.admonition,{type:"danger",children:(0,s.jsxs)(i.p,{children:["This is where we overwrite the contents of your USB drive so please ensure you identified the correct drive in the ",(0,s.jsx)(i.code,{children:"lsblk"})," stage above. Selecting the wrong drive here will lead to its contents being overwritten. An example command is below, however you may need to replace ",(0,s.jsx)(i.code,{children:"sdb"})," with the drive we located above:"]})}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"sudo dd if=Solus-Budgie-Release-2024-10-14.iso of=/dev/sdb bs=4M status=progress oflag=sync && sudo eject /dev/sdb\n"})}),"\n",(0,s.jsx)(i.p,{children:"This will write the contents of the ISO to the thumb drive so you can boot it and also make sure the data is synchronized so you can eject the USB safely."}),"\n",(0,s.jsx)(i.h3,{id:"windows-1",children:"Windows"}),"\n",(0,s.jsx)(i.h4,{id:"dvd-1",children:"DVD"}),"\n",(0,s.jsx)(i.p,{children:"You can easily burn an ISO image to a DVD, on Windows 7 and newer, by using Window's built-in file manager (Explorer)."}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Open Windows' built-in file manager (Explorer)."}),"\n",(0,s.jsx)(i.li,{children:'Right click on the ISO image file and click "Burn disk image".'}),"\n",(0,s.jsx)(i.li,{children:"Select the correct disc burner."}),"\n",(0,s.jsx)(i.li,{children:'Click "Burn".'}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"usb-1",children:"USB"}),"\n",(0,s.jsxs)(i.p,{children:["You can easily burn an ISO image to a USB by using graphical tool ",(0,s.jsx)(i.a,{href:"https://rufus.ie/",children:"Rufus"}),"."]}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Open Rufus."}),"\n",(0,s.jsx)(i.li,{children:"Ensure your device is correct by checking the contents of the Device dropdown."}),"\n",(0,s.jsx)(i.li,{children:"Click the CD icon found in the image below, and select the ISO."}),"\n",(0,s.jsx)(i.li,{children:'Untick all options except "Create a bootable disk using" and use the dropdown to select "DD Image".'}),"\n",(0,s.jsx)(i.li,{children:'Click "Start".'}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Rufus",src:n(93093).Z+"",width:"365",height:"518"})}),"\n",(0,s.jsx)(i.h3,{id:"macos",children:"macOS"}),"\n",(0,s.jsx)(i.h4,{id:"dvd-2",children:"DVD"}),"\n",(0,s.jsx)(i.p,{children:"Since OS X El Capitan (10.11), the easiest way to burn a DVD is:"}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Insert your DVD and open Finder."}),"\n",(0,s.jsx)(i.li,{children:"Right click on the ISO image."}),"\n",(0,s.jsx)(i.li,{children:"Click on \u201cBurn Disk Image \u2018Solus-Budgie-Release-2024-10-14.iso\u2019 to Disc\u2026\u201d"}),"\n",(0,s.jsx)(i.li,{children:"Then click \u201cBurn\u201d."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"macOS Burn DVD",src:n(54725).Z+"",width:"638",height:"343"})}),"\n",(0,s.jsx)(i.h4,{id:"usb-2",children:"USB"}),"\n",(0,s.jsx)(i.h5,{id:"graphical-tool",children:"Graphical tool"}),"\n",(0,s.jsxs)(i.p,{children:["One of the easiest ways to burn an ISO image to a USB thumb drive is by using a graphical tool called ",(0,s.jsx)(i.a,{href:"https://etcher.balena.io/",children:"Etcher"}),"."]}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Open Etcher."}),"\n",(0,s.jsx)(i.li,{children:"Click on \u201cSelect image\u201d and then select the ISO and click \u201cOpen\u201d."}),"\n",(0,s.jsx)(i.li,{children:"Etcher will automatically select your USB drive. If it has selected the wrong one, click \u201cChange\u201d and select the correct one."}),"\n",(0,s.jsx)(i.li,{children:"Click \u201cFlash!\u201d."}),"\n",(0,s.jsx)(i.li,{children:"You may be prompted for your macOS user password."}),"\n",(0,s.jsx)(i.li,{children:"Once Etcher has finished it is safe to remove the USB drive."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"You may see a message stating \u201cThe disk you inserted was not readable by this computer.\u201d once Etcher finishes. This can be ignored."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"macOS Etcher",src:n(74020).Z+"",width:"800",height:"380"})}),"\n",(0,s.jsx)(i.h5,{id:"command-line-1",children:"Command-line"}),"\n",(0,s.jsxs)(i.p,{children:["For those comfortable with the macOS Terminal app, we will walk you through using ",(0,s.jsx)(i.code,{children:"dd"}),"."]}),"\n",(0,s.jsx)(i.p,{children:"First, insert the USB drive into your computer and open Terminal (found in Applications/Utilities)."}),"\n",(0,s.jsx)(i.p,{children:"Now you'll need to identify your USB drive by listing your storage devices with the following command:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"diskutil list\n"})}),"\n",(0,s.jsx)(i.p,{children:"You should see output similar to this:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"/dev/disk0 (internal, physical):\n #: TYPE NAME SIZE IDENTIFIER\n 0: GUID_partition_scheme *1.0 TB disk0\n 1: EFI EFI 209.7 MB disk0s1\n 2: Apple_HFS Macintosh HD 999.3 GB disk0s2\n 3: Apple_Boot Recovery HD 650.0 MB disk0s3\n\n/dev/disk1 (external, physical):\n #: TYPE NAME SIZE IDENTIFIER\n 0: GUID_partition_scheme *15.6 GB disk1\n 1: EFI EFI 209.7 MB disk1s1\n 2: Apple_HFS Ultra 15.3 GB disk1s2\n"})}),"\n",(0,s.jsxs)(i.p,{children:["From this output, we can see the USB drive is listed as ",(0,s.jsx)(i.code,{children:"/dev/disk1 (external, physical)"}),". In this example, the IDENTIFIER is ",(0,s.jsx)(i.code,{children:"disk1"}),". Please note, your USB drive may have a different identifier. You should be able to tell which is your USB drive by checking the name and size."]}),"\n",(0,s.jsxs)(i.p,{children:["macOS usually auto-mounts USB drives so you\u2019ll need to unmount it first before proceeding. Use the following command and replace ",(0,s.jsx)(i.code,{children:"IDENTIFIER"})," with the correct identifier we found in the ",(0,s.jsx)(i.code,{children:"diskutil list"})," step."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"diskutil unmountDisk /dev/IDENTIFIER\n"})}),"\n",(0,s.jsx)(i.p,{children:"Now navigate to the folder that has the downloaded ISO. This could be your Mac\u2019s Downloads folder. The following command will get you there:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"cd ~/Downloads\n"})}),"\n",(0,s.jsx)(i.admonition,{type:"danger",children:(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"This next step is dangerous. Using the wrong drive identifier could result in data loss."})})}),"\n",(0,s.jsxs)(i.p,{children:["We will use the ",(0,s.jsx)(i.code,{children:"dd"})," command to write the contents of the ISO to the thumb drive. Replace ",(0,s.jsx)(i.code,{children:"IDENTIFIER"})," in the command below with your drive identifier. Note the extra ",(0,s.jsx)(i.code,{children:"r"})," before the identifier (i.e ",(0,s.jsx)(i.code,{children:"rdisk1"}),"). This is for raw mode, which along with bs=1m, makes the transfer faster."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"sudo dd if=Solus-Budgie-Release-2024-10-14.iso of=/dev/rIDENTIFIER bs=1m\n"})}),"\n",(0,s.jsx)(i.p,{children:"Be patient! After a few minutes you\u2019ll receive a message saying how much data was transferred. You can now safely eject the usb drive."}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"diskutil eject /dev/IDENTIFIER\n"})}),"\n",(0,s.jsx)(i.h2,{id:"boot-the-media",children:"Boot the media"}),"\n",(0,s.jsx)(i.p,{children:"Now it is time to restart your computer to boot the DVD or USB. Most computers will automatically boot from DVDs and USB, however if you experience issues booting the media, you may need to select to boot from DVD or USB."}),"\n",(0,s.jsxs)(i.p,{children:["This is usually accessible by pressing ",(0,s.jsx)(i.code,{children:"F9"})," or ",(0,s.jsx)(i.code,{children:"F12"})," while your computer is booting. On some devices it may also be ",(0,s.jsx)(i.code,{children:"ESC"}),"."]}),"\n",(0,s.jsx)(i.p,{children:'Macs will boot to the "Startup Manager" by holding down the Option (Alt) key. The DVD or USB drive will most likely show up as "EFI Boot".'})]})}function c(e={}){const{wrapper:i}={...(0,t.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},69064:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/gmw_done-fdbb3bda7061afd0ca7f97b85c1cef18.jpg"},7173:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/gmw_start-c8e10b8e6f627b862f8f6344260db698.jpg"},39115:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/gmw_writing-1a2eb065ba3c61dd1371f89b2ab9f7c1.jpg"},8234:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/iiw_1_start-0457fdcee59f063744233653c88022f7.png"},51213:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/iiw_2_writing-61d90705ea2038df803e806657f7e20f.png"},46368:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/iiw_3_done-de4e8501e47d1073f945ae1aceb13995.png"},54725:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/mac-burn-dvd-0bef9578a58d61610854fc7c25e3496f.jpg"},74020:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/mac-etcher-2d28aaeb19eda12c960c6b09e81eceb2.jpg"},93093:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/rufus-6f16a561298400882bff901d61064e58.jpg"},11151:(e,i,n)=>{n.d(i,{Z:()=>o,a:()=>r});var s=n(67294);const t={},l=s.createContext(t);function r(e){const i=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(l.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4002],{99023:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>c,frontMatter:()=>l,metadata:()=>o,toc:()=>a});var s=n(85893),t=n(11151);const l={title:"Preparing to Install",summary:"Installation Guide for multiple operating systems"},r="Preparing to install",o={id:"user/quick-start/installation/index",title:"Preparing to Install",description:"Before you start, make sure your system meets the minimum requirements.",source:"@site/docs/user/quick-start/installation/index.md",sourceDirName:"user/quick-start/installation",slug:"/user/quick-start/installation/",permalink:"/docs/user/quick-start/installation/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/installation/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Preparing to Install",summary:"Installation Guide for multiple operating systems"},sidebar:"userSidebar",previous:{title:"Default Applications",permalink:"/docs/user/quick-start/default-applications"},next:{title:"Disk Partitioning",permalink:"/docs/user/quick-start/installation/disks"}},d={},a=[{value:"Getting the ISO",id:"getting-the-iso",level:2},{value:"Verifying the ISO",id:"verifying-the-iso",level:2},{value:"Linux and macOS",id:"linux-and-macos",level:3},{value:"Verifying the SHA256SUMS file signature",id:"verifying-the-sha256sums-file-signature",level:4},{value:"Verifying the ISO checksum",id:"verifying-the-iso-checksum",level:4},{value:"Windows",id:"windows",level:3},{value:"Verifying signed SHA256SUM file",id:"verifying-signed-sha256sum-file",level:4},{value:"Verifying the ISO checksum",id:"verifying-the-iso-checksum-1",level:4},{value:"Creating bootable media",id:"creating-bootable-media",level:2},{value:"Linux",id:"linux",level:3},{value:"DVD",id:"dvd",level:4},{value:"USB",id:"usb",level:4},{value:"GNOME MultiWriter",id:"gnome-multiwriter",level:5},{value:"KDE ISO Image Writer",id:"kde-iso-image-writer",level:4},{value:"Command-line",id:"command-line",level:5},{value:"Windows",id:"windows-1",level:3},{value:"DVD",id:"dvd-1",level:4},{value:"USB",id:"usb-1",level:4},{value:"macOS",id:"macos",level:3},{value:"DVD",id:"dvd-2",level:4},{value:"USB",id:"usb-2",level:4},{value:"Graphical tool",id:"graphical-tool",level:5},{value:"Command-line",id:"command-line-1",level:5},{value:"Boot the media",id:"boot-the-media",level:2}];function h(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"preparing-to-install",children:"Preparing to install"})}),"\n",(0,s.jsxs)(i.p,{children:["Before you start, make sure your system meets the ",(0,s.jsx)(i.a,{href:"/docs/user/quick-start/installation/system-requirements",children:"minimum requirements"}),"."]}),"\n",(0,s.jsx)(i.p,{children:"The first step to installing Solus is getting the correct media. The Solus Project provides ISO images, which contain the contents of Solus for installing."}),"\n",(0,s.jsx)(i.h2,{id:"getting-the-iso",children:"Getting the ISO"}),"\n",(0,s.jsxs)(i.p,{children:["Download a Solus ISO by going to our ",(0,s.jsx)(i.a,{href:"https://getsol.us/download",children:"Download page"})," and picking an edition."]}),"\n",(0,s.jsx)(i.h2,{id:"verifying-the-iso",children:"Verifying the ISO"}),"\n",(0,s.jsx)(i.h3,{id:"linux-and-macos",children:"Linux and macOS"}),"\n",(0,s.jsxs)(i.p,{children:["Download the SHA256SUMS files for your chosen ISO edition: ",(0,s.jsx)(i.em,{children:"File"}),", ",(0,s.jsx)(i.em,{children:"Signed File"})," and ",(0,s.jsx)(i.em,{children:"Public Key"})," from the links next to the ",(0,s.jsx)(i.em,{children:"Download"})," buttons on our ",(0,s.jsx)(i.a,{href:"https://getsol.us/download",children:"Download page"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Note:"})," You should download all these files to the same directory."]}),"\n",(0,s.jsx)(i.h4,{id:"verifying-the-sha256sums-file-signature",children:"Verifying the SHA256SUMS file signature"}),"\n",(0,s.jsx)(i.p,{children:"Import the Solus public key:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"cd ~/path/to/download/directory\ngpg --import solus-releng-pub.gpg\n"})}),"\n",(0,s.jsx)(i.p,{children:"Verify the signed checksum file:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"gpg --verify Solus-Budgie-Release-2024-10-14.iso.sha256sum.sign Solus-Budgie-Release-2024-10-14.iso.sha256sum\n"})}),"\n",(0,s.jsx)(i.h4,{id:"verifying-the-iso-checksum",children:"Verifying the ISO checksum"}),"\n",(0,s.jsx)(i.p,{children:"Check that the computed hash of the downloaded ISO file matches the hash supplied by Solus:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"sha256sum -c Solus-Budgie-Release-2024-10-14.iso.sha256sum | grep OK\n"})}),"\n",(0,s.jsx)(i.h3,{id:"windows",children:"Windows"}),"\n",(0,s.jsx)(i.h4,{id:"verifying-signed-sha256sum-file",children:"Verifying signed SHA256SUM file"}),"\n",(0,s.jsxs)(i.p,{children:["On Windows, first install ",(0,s.jsx)(i.a,{href:"https://www.gpg4win.org/",children:"Gpg4win"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["Now you can run the same ",(0,s.jsx)(i.code,{children:"gpg"})," commands from the the ",(0,s.jsx)(i.a,{href:"/docs/user/quick-start/installation/#verifying-the-sha256sums-file-signature",children:(0,s.jsx)(i.em,{children:"Verifyng the SHA256SUMS file signature"})})," section above."]}),"\n",(0,s.jsx)(i.h4,{id:"verifying-the-iso-checksum-1",children:"Verifying the ISO checksum"}),"\n",(0,s.jsx)(i.p,{children:"Launch powershell and compute the hash of the ISO file you just downloaded. You will have to manually compare the result to the hash in the SHA256SUMS file."}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-powershell",children:"Get-FileHash C:\\path\\to\\Solus-Budgie-Release-2024-10-14.iso\ncat C:\\path\\to\\Solus-Budgie-Release-2024-10-14.iso.sha256sum\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Alternatively, you can use a graphical program that can calculate SHA256 hashes like ",(0,s.jsx)(i.em,{children:"Rufus"})," or ",(0,s.jsx)(i.em,{children:"7-Zip"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"creating-bootable-media",children:"Creating bootable media"}),"\n",(0,s.jsx)(i.p,{children:"To make boot media, you will need:"}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Either a blank DVD or a USB drive larger than 2 GB."}),"\n",(0,s.jsx)(i.li,{children:"If using a USB, the ability to boot from the USB."}),"\n",(0,s.jsxs)(i.li,{children:["ISO file from the ",(0,s.jsx)(i.a,{href:"#getting-the-iso",children:"Getting the ISO"})," section."]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"There are many tools which can write our ISO image to DVDs or USB thumb drives. Chose from an option below."}),"\n",(0,s.jsx)(i.h3,{id:"linux",children:"Linux"}),"\n",(0,s.jsx)(i.h4,{id:"dvd",children:"DVD"}),"\n",(0,s.jsxs)(i.p,{children:["We recommend using ",(0,s.jsx)(i.a,{href:"https://wiki.gnome.org/Apps/Brasero",children:"Brasero"})," for writing the ISO to a DVD."]}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Insert blank DVD (DVD-R or DVD+RW is suitable) into your DVD writer."}),"\n",(0,s.jsx)(i.li,{children:"Open Brasero."}),"\n",(0,s.jsx)(i.li,{children:"Select the option \u201cBurn image\u201d."}),"\n",(0,s.jsx)(i.li,{children:"Click the \u201cClick here to select a disc image\u201d button and using the file dialog, choose the ISO."}),"\n",(0,s.jsx)(i.li,{children:"Ensure the correct DVD is selected in the \u201cSelect a disc to write to\u201d."}),"\n",(0,s.jsx)(i.li,{children:'Click "Burn" and wait.'}),"\n",(0,s.jsx)(i.li,{children:'Upon seeing \u201cImage successfully burned to DVD\u201d, click "Close".'}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"usb",children:"USB"}),"\n",(0,s.jsxs)(i.p,{children:["We recommend using ",(0,s.jsx)(i.a,{href:"https://wiki.gnome.org/Apps/MultiWriter",children:"GNOME MultiWriter"})," or ",(0,s.jsx)(i.a,{href:"https://apps.kde.org/isoimagewriter/",children:"ISO Image Writer"})," for KDE. Please note that UNetbootin will ",(0,s.jsx)(i.strong,{children:"not"})," work."]}),"\n",(0,s.jsx)(i.h5,{id:"gnome-multiwriter",children:"GNOME MultiWriter"}),"\n",(0,s.jsx)(i.p,{children:"Upon opening GNOME MultiWriter, you will likely be shown a window similar to the one below, if your USB drive is already plugged in and mounted."}),"\n",(0,s.jsx)(i.admonition,{type:"warning",children:(0,s.jsxs)(i.p,{children:["The ISO image will be written to ",(0,s.jsx)(i.em,{children:"all mounted USB drives"}),". Ensure that the only USB drive that is connected is the one you wish to write the ISO to."]})}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"MultiWriter Start",src:n(7173).Z+"",width:"706",height:"156"})}),"\n",(0,s.jsx)(i.p,{children:"If your USB drive is not mounted, you will be prompted with an image indicating to plug it in."}),"\n",(0,s.jsx)(i.p,{children:'Next, click the "Start Copying" button, and you will be prompted to select the ISO. Choose the ISO you downloaded in the "Getting the ISO" section. The USB will automatically be written to.'}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"MultiWriter Writing",src:n(39115).Z+"",width:"706",height:"156"})}),"\n",(0,s.jsx)(i.p,{children:"Upon completion, you will be prompted with the following dialog and your USB is now ready for use."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"MultiWriter Done",src:n(69064).Z+"",width:"706",height:"156"})}),"\n",(0,s.jsx)(i.h4,{id:"kde-iso-image-writer",children:"KDE ISO Image Writer"}),"\n",(0,s.jsx)(i.admonition,{type:"info",children:(0,s.jsx)(i.p,{children:"You will need both the ISO and sha256sums file for it saved in the same directory."})}),"\n",(0,s.jsx)(i.p,{children:"When you open ISO Image Writer, you will see a window similar to the one below, if your USB drive is already plugged in and mounted."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"ImageWriter Start",src:n(8234).Z+"",width:"585",height:"446"})}),"\n",(0,s.jsx)(i.p,{children:"If there is no USB drive mounted, the USB drive field will be greyed out. Simply plug in the USB drive you want to use for the ISO, it will be auto-detected."}),"\n",(0,s.jsx)(i.p,{children:'Click on the top field "Write this ISO image:". Select the ISO image you downloaded in the "Getting the ISO" section.'}),"\n",(0,s.jsx)(i.p,{children:'You may see "Downloading ISO image". When this is done, click the Create button.'}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"ImageWriter Writing",src:n(51213).Z+"",width:"551",height:"430"})}),"\n",(0,s.jsx)(i.p,{children:"When the operation is finished, you will see the confirmation dialog. Your USB is now ready for use."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"ImageWriter Done",src:n(46368).Z+"",width:"585",height:"446"})}),"\n",(0,s.jsx)(i.h5,{id:"command-line",children:"Command-line"}),"\n",(0,s.jsxs)(i.p,{children:["For those comfortable with the command-line / terminal, we will walk you through using ",(0,s.jsx)(i.code,{children:"dd"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["First, insert the USB drive into your computer and open your Terminal. Proceed to type ",(0,s.jsx)(i.code,{children:"lsblk"})," into your Terminal. It should output something along the lines of:"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nsda 8:0 0 111.8G 0 disk\n\u251c\u2500sda1 8:1 0 350M 0 part\n\u251c\u2500sda2 8:2 0 39.7G 0 part\n\u2514\u2500sda3 8:3 0 71.8G 0 part /\nsdb 8:64 1 7.5G 0 disk\n\u251c\u2500sdb1 8:65 1 712M 0 part\n\u2514\u2500sdb2 8:66 1 17.2M 0 part\n"})}),"\n",(0,s.jsxs)(i.p,{children:["You will see one disk, in this case ",(0,s.jsx)(i.code,{children:"/dev/sdb"}),", that is roughly the size of the USB drive. Yours should be similar (difference being in size). Write this device down somewhere."]}),"\n",(0,s.jsxs)(i.p,{children:["Next, locate the downloaded ISO. It will most likely be in your Downloads folder. In the event that it is, type: ",(0,s.jsx)(i.code,{children:"cd ~/Downloads"})]}),"\n",(0,s.jsxs)(i.p,{children:["If it is ",(0,s.jsx)(i.strong,{children:"not"})," in your Downloads folder, use ",(0,s.jsx)(i.code,{children:"cd"})," to navigate to the correct directory."]}),"\n",(0,s.jsx)(i.admonition,{type:"danger",children:(0,s.jsxs)(i.p,{children:["This is where we overwrite the contents of your USB drive so please ensure you identified the correct drive in the ",(0,s.jsx)(i.code,{children:"lsblk"})," stage above. Selecting the wrong drive here will lead to its contents being overwritten. An example command is below, however you may need to replace ",(0,s.jsx)(i.code,{children:"sdb"})," with the drive we located above:"]})}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"sudo dd if=Solus-Budgie-Release-2024-10-14.iso of=/dev/sdb bs=4M status=progress oflag=sync && sudo eject /dev/sdb\n"})}),"\n",(0,s.jsx)(i.p,{children:"This will write the contents of the ISO to the thumb drive so you can boot it and also make sure the data is synchronized so you can eject the USB safely."}),"\n",(0,s.jsx)(i.h3,{id:"windows-1",children:"Windows"}),"\n",(0,s.jsx)(i.h4,{id:"dvd-1",children:"DVD"}),"\n",(0,s.jsx)(i.p,{children:"You can easily burn an ISO image to a DVD, on Windows 7 and newer, by using Window's built-in file manager (Explorer)."}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Open Windows' built-in file manager (Explorer)."}),"\n",(0,s.jsx)(i.li,{children:'Right click on the ISO image file and click "Burn disk image".'}),"\n",(0,s.jsx)(i.li,{children:"Select the correct disc burner."}),"\n",(0,s.jsx)(i.li,{children:'Click "Burn".'}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"usb-1",children:"USB"}),"\n",(0,s.jsxs)(i.p,{children:["You can easily burn an ISO image to a USB by using graphical tool ",(0,s.jsx)(i.a,{href:"https://rufus.ie/",children:"Rufus"}),"."]}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Open Rufus."}),"\n",(0,s.jsx)(i.li,{children:"Ensure your device is correct by checking the contents of the Device dropdown."}),"\n",(0,s.jsx)(i.li,{children:"Click the CD icon found in the image below, and select the ISO."}),"\n",(0,s.jsx)(i.li,{children:'Untick all options except "Create a bootable disk using" and use the dropdown to select "DD Image".'}),"\n",(0,s.jsx)(i.li,{children:'Click "Start".'}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Rufus",src:n(93093).Z+"",width:"365",height:"518"})}),"\n",(0,s.jsx)(i.h3,{id:"macos",children:"macOS"}),"\n",(0,s.jsx)(i.h4,{id:"dvd-2",children:"DVD"}),"\n",(0,s.jsx)(i.p,{children:"Since OS X El Capitan (10.11), the easiest way to burn a DVD is:"}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Insert your DVD and open Finder."}),"\n",(0,s.jsx)(i.li,{children:"Right click on the ISO image."}),"\n",(0,s.jsx)(i.li,{children:"Click on \u201cBurn Disk Image \u2018Solus-Budgie-Release-2024-10-14.iso\u2019 to Disc\u2026\u201d"}),"\n",(0,s.jsx)(i.li,{children:"Then click \u201cBurn\u201d."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"macOS Burn DVD",src:n(54725).Z+"",width:"638",height:"343"})}),"\n",(0,s.jsx)(i.h4,{id:"usb-2",children:"USB"}),"\n",(0,s.jsx)(i.h5,{id:"graphical-tool",children:"Graphical tool"}),"\n",(0,s.jsxs)(i.p,{children:["One of the easiest ways to burn an ISO image to a USB thumb drive is by using a graphical tool called ",(0,s.jsx)(i.a,{href:"https://etcher.balena.io/",children:"Etcher"}),"."]}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsx)(i.li,{children:"Open Etcher."}),"\n",(0,s.jsx)(i.li,{children:"Click on \u201cSelect image\u201d and then select the ISO and click \u201cOpen\u201d."}),"\n",(0,s.jsx)(i.li,{children:"Etcher will automatically select your USB drive. If it has selected the wrong one, click \u201cChange\u201d and select the correct one."}),"\n",(0,s.jsx)(i.li,{children:"Click \u201cFlash!\u201d."}),"\n",(0,s.jsx)(i.li,{children:"You may be prompted for your macOS user password."}),"\n",(0,s.jsx)(i.li,{children:"Once Etcher has finished it is safe to remove the USB drive."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"You may see a message stating \u201cThe disk you inserted was not readable by this computer.\u201d once Etcher finishes. This can be ignored."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"macOS Etcher",src:n(74020).Z+"",width:"800",height:"380"})}),"\n",(0,s.jsx)(i.h5,{id:"command-line-1",children:"Command-line"}),"\n",(0,s.jsxs)(i.p,{children:["For those comfortable with the macOS Terminal app, we will walk you through using ",(0,s.jsx)(i.code,{children:"dd"}),"."]}),"\n",(0,s.jsx)(i.p,{children:"First, insert the USB drive into your computer and open Terminal (found in Applications/Utilities)."}),"\n",(0,s.jsx)(i.p,{children:"Now you'll need to identify your USB drive by listing your storage devices with the following command:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"diskutil list\n"})}),"\n",(0,s.jsx)(i.p,{children:"You should see output similar to this:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"/dev/disk0 (internal, physical):\n #: TYPE NAME SIZE IDENTIFIER\n 0: GUID_partition_scheme *1.0 TB disk0\n 1: EFI EFI 209.7 MB disk0s1\n 2: Apple_HFS Macintosh HD 999.3 GB disk0s2\n 3: Apple_Boot Recovery HD 650.0 MB disk0s3\n\n/dev/disk1 (external, physical):\n #: TYPE NAME SIZE IDENTIFIER\n 0: GUID_partition_scheme *15.6 GB disk1\n 1: EFI EFI 209.7 MB disk1s1\n 2: Apple_HFS Ultra 15.3 GB disk1s2\n"})}),"\n",(0,s.jsxs)(i.p,{children:["From this output, we can see the USB drive is listed as ",(0,s.jsx)(i.code,{children:"/dev/disk1 (external, physical)"}),". In this example, the IDENTIFIER is ",(0,s.jsx)(i.code,{children:"disk1"}),". Please note, your USB drive may have a different identifier. You should be able to tell which is your USB drive by checking the name and size."]}),"\n",(0,s.jsxs)(i.p,{children:["macOS usually auto-mounts USB drives so you\u2019ll need to unmount it first before proceeding. Use the following command and replace ",(0,s.jsx)(i.code,{children:"IDENTIFIER"})," with the correct identifier we found in the ",(0,s.jsx)(i.code,{children:"diskutil list"})," step."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"diskutil unmountDisk /dev/IDENTIFIER\n"})}),"\n",(0,s.jsx)(i.p,{children:"Now navigate to the folder that has the downloaded ISO. This could be your Mac\u2019s Downloads folder. The following command will get you there:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"cd ~/Downloads\n"})}),"\n",(0,s.jsx)(i.admonition,{type:"danger",children:(0,s.jsx)(i.p,{children:(0,s.jsx)(i.strong,{children:"This next step is dangerous. Using the wrong drive identifier could result in data loss."})})}),"\n",(0,s.jsxs)(i.p,{children:["We will use the ",(0,s.jsx)(i.code,{children:"dd"})," command to write the contents of the ISO to the thumb drive. Replace ",(0,s.jsx)(i.code,{children:"IDENTIFIER"})," in the command below with your drive identifier. Note the extra ",(0,s.jsx)(i.code,{children:"r"})," before the identifier (i.e ",(0,s.jsx)(i.code,{children:"rdisk1"}),"). This is for raw mode, which along with bs=1m, makes the transfer faster."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"sudo dd if=Solus-Budgie-Release-2024-10-14.iso of=/dev/rIDENTIFIER bs=1m\n"})}),"\n",(0,s.jsx)(i.p,{children:"Be patient! After a few minutes you\u2019ll receive a message saying how much data was transferred. You can now safely eject the usb drive."}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"diskutil eject /dev/IDENTIFIER\n"})}),"\n",(0,s.jsx)(i.h2,{id:"boot-the-media",children:"Boot the media"}),"\n",(0,s.jsx)(i.p,{children:"Now it is time to restart your computer to boot the DVD or USB. Most computers will automatically boot from DVDs and USB, however if you experience issues booting the media, you may need to select to boot from DVD or USB."}),"\n",(0,s.jsxs)(i.p,{children:["This is usually accessible by pressing ",(0,s.jsx)(i.code,{children:"F9"})," or ",(0,s.jsx)(i.code,{children:"F12"})," while your computer is booting. On some devices it may also be ",(0,s.jsx)(i.code,{children:"ESC"}),"."]}),"\n",(0,s.jsx)(i.p,{children:'Macs will boot to the "Startup Manager" by holding down the Option (Alt) key. The DVD or USB drive will most likely show up as "EFI Boot".'})]})}function c(e={}){const{wrapper:i}={...(0,t.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},69064:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/gmw_done-fdbb3bda7061afd0ca7f97b85c1cef18.jpg"},7173:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/gmw_start-c8e10b8e6f627b862f8f6344260db698.jpg"},39115:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/gmw_writing-1a2eb065ba3c61dd1371f89b2ab9f7c1.jpg"},8234:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/iiw_1_start-0457fdcee59f063744233653c88022f7.png"},51213:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/iiw_2_writing-61d90705ea2038df803e806657f7e20f.png"},46368:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/iiw_3_done-de4e8501e47d1073f945ae1aceb13995.png"},54725:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/mac-burn-dvd-0bef9578a58d61610854fc7c25e3496f.jpg"},74020:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/mac-etcher-2d28aaeb19eda12c960c6b09e81eceb2.jpg"},93093:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/rufus-6f16a561298400882bff901d61064e58.jpg"},11151:(e,i,n)=>{n.d(i,{Z:()=>o,a:()=>r});var s=n(67294);const t={},l=s.createContext(t);function r(e){const i=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(l.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5685b4d8.779151ba.js b/assets/js/5685b4d8.096f851a.js similarity index 96% rename from assets/js/5685b4d8.779151ba.js rename to assets/js/5685b4d8.096f851a.js index 53e0c0bf0..86b364a7c 100644 --- a/assets/js/5685b4d8.779151ba.js +++ b/assets/js/5685b4d8.096f851a.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1540],{17599:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>s,default:()=>f,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var o=t(85893),i=t(11151);const r={title:"Configuration",summary:"Help for configuring XFCE on Solus"},s="Configuration",c={id:"user/editions/xfce/configuration",title:"Configuration",description:"TODO: Add configuration snippets for XFCE",source:"@site/docs/user/editions/xfce/configuration.md",sourceDirName:"user/editions/xfce",slug:"/user/editions/xfce/configuration",permalink:"/docs/user/editions/xfce/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/xfce/configuration.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Configuration",summary:"Help for configuring XFCE on Solus"},sidebar:"userSidebar",previous:{title:"XFCE",permalink:"/docs/user/editions/xfce/"},next:{title:"Tips and Tricks",permalink:"/docs/user/editions/xfce/tips-and-tricks"}},u={},a=[];function d(e){const n={h1:"h1",header:"header",p:"p",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,o.jsx)(n.p,{children:"TODO: Add configuration snippets for XFCE"})]})}function f(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>s});var o=t(67294);const i={},r=o.createContext(i);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1540],{17599:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>s,default:()=>f,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var o=t(85893),i=t(11151);const r={title:"Configuration",summary:"Help for configuring XFCE on Solus"},s="Configuration",c={id:"user/editions/xfce/configuration",title:"Configuration",description:"TODO: Add configuration snippets for XFCE",source:"@site/docs/user/editions/xfce/configuration.md",sourceDirName:"user/editions/xfce",slug:"/user/editions/xfce/configuration",permalink:"/docs/user/editions/xfce/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/xfce/configuration.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Configuration",summary:"Help for configuring XFCE on Solus"},sidebar:"userSidebar",previous:{title:"XFCE",permalink:"/docs/user/editions/xfce/"},next:{title:"Tips and Tricks",permalink:"/docs/user/editions/xfce/tips-and-tricks"}},u={},a=[];function d(e){const n={h1:"h1",header:"header",p:"p",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,o.jsx)(n.p,{children:"TODO: Add configuration snippets for XFCE"})]})}function f(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>s});var o=t(67294);const i={},r=o.createContext(i);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5b7f3753.1a9fe7e9.js b/assets/js/5b7f3753.dd9a94b3.js similarity index 98% rename from assets/js/5b7f3753.1a9fe7e9.js rename to assets/js/5b7f3753.dd9a94b3.js index de7b4083c..cb70d9ee2 100644 --- a/assets/js/5b7f3753.1a9fe7e9.js +++ b/assets/js/5b7f3753.dd9a94b3.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6413],{47512:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>a,metadata:()=>c,toc:()=>h});var t=n(85893),s=n(11151);const a={title:"Git Basics",summary:"Basic git commands for packaging"},r="Git Basics",c={id:"packaging/git-basics",title:"Git Basics",description:"Working with branches",source:"@site/docs/packaging/git-basics.md",sourceDirName:"packaging",slug:"/packaging/git-basics",permalink:"/docs/packaging/git-basics",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/git-basics.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Git Basics",summary:"Basic git commands for packaging"},sidebar:"packagingSidebar",previous:{title:"Appstream Metainfo",permalink:"/docs/packaging/appstream-metainfo"},next:{title:"Monitoring YAML",permalink:"/docs/packaging/monitoring.yml"}},o={},h=[{value:"Working with branches",id:"working-with-branches",level:2},{value:"Keeping your branch up to date with the main branch",id:"keeping-your-branch-up-to-date-with-the-main-branch",level:2},{value:"Adding files",id:"adding-files",level:2},{value:"Removing files",id:"removing-files",level:2},{value:"Renaming files",id:"renaming-files",level:2},{value:"Check the changes in your files",id:"check-the-changes-in-your-files",level:2},{value:"Commit your changes",id:"commit-your-changes",level:2},{value:"Deleting your branch after a pull request is merged",id:"deleting-your-branch-after-a-pull-request-is-merged",level:2}];function l(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"git-basics",children:"Git Basics"})}),"\n",(0,t.jsx)(i.h2,{id:"working-with-branches",children:"Working with branches"}),"\n",(0,t.jsxs)(i.p,{children:["The recommended way to switch branches is ",(0,t.jsx)(i.code,{children:"git switch"}),".\nTo create a new branch use ",(0,t.jsx)(i.code,{children:"git switch -c"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"keeping-your-branch-up-to-date-with-the-main-branch",children:"Keeping your branch up to date with the main branch"}),"\n",(0,t.jsxs)(i.p,{children:["If there any new changes to the repository whilst you are still working on your branch you need to ",(0,t.jsx)(i.a,{href:"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork",children:"sync your fork"}),".\nRun ",(0,t.jsx)(i.code,{children:"git fetch"}),", and ",(0,t.jsx)(i.code,{children:"git rebase origin/main"})," to pull the changes in.\nYou will need to fix any conflicts manually.\nYou can check your branch against main with ",(0,t.jsx)(i.code,{children:"git diff origin/main..my-branch"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"adding-files",children:"Adding files"}),"\n",(0,t.jsxs)(i.p,{children:["For every file you change or add, you must let git know about it: ",(0,t.jsx)(i.code,{children:"git add someFile"})]}),"\n",(0,t.jsx)(i.h2,{id:"removing-files",children:"Removing files"}),"\n",(0,t.jsxs)(i.p,{children:["For files that need to be removed, you must do so using git: ",(0,t.jsx)(i.code,{children:"git rm someFile"})]}),"\n",(0,t.jsx)(i.h2,{id:"renaming-files",children:"Renaming files"}),"\n",(0,t.jsxs)(i.p,{children:["Likewise, for renaming a file, you must do so via git: ",(0,t.jsx)(i.code,{children:"git mv someFile someFileName2"})]}),"\n",(0,t.jsx)(i.h2,{id:"check-the-changes-in-your-files",children:"Check the changes in your files"}),"\n",(0,t.jsx)(i.p,{children:"It's a good idea to review the changes you have made to each file. This is to make sure you're committing what you intend and to make sure it looks good. Do this before adding changed files."}),"\n",(0,t.jsxs)(i.p,{children:["To diff them all at once, useful for small changes, use ",(0,t.jsx)(i.code,{children:"git diff"}),".\nTo diff each file one at a time run ",(0,t.jsx)(i.code,{children:"git diff filename"})," on each one."]}),"\n",(0,t.jsx)(i.h2,{id:"commit-your-changes",children:"Commit your changes"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.strong,{children:"Check your branch"})}),"\n",(0,t.jsxs)(i.p,{children:["Get the status of the branch with ",(0,t.jsx)(i.code,{children:"git status"}),". Make sure all the files you changed are staged, and that there are no untracked files. The git status should say your branch is clean."]}),"\n",(0,t.jsxs)(i.p,{children:["Now that you've tested and reviewed your change, when you're happy with it, it's time to commit your changes with ",(0,t.jsx)(i.code,{children:"git commit"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"deleting-your-branch-after-a-pull-request-is-merged",children:"Deleting your branch after a pull request is merged"}),"\n",(0,t.jsx)(i.p,{children:"Once your pull request has been accepted you can delete your working branches.\nFirst, change to the package directory, switch to the main branch, then delete your local and the remote branches."}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"cd ~/solus-packages\ngit switch main\ngit branch -D my-branch\ngit push -d origin my-branch\n"})})]})}function d(e={}){const{wrapper:i}={...(0,s.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,i,n)=>{n.d(i,{Z:()=>c,a:()=>r});var t=n(67294);const s={},a=t.createContext(s);function r(e){const i=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6413],{47512:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>r,default:()=>d,frontMatter:()=>a,metadata:()=>c,toc:()=>h});var t=n(85893),s=n(11151);const a={title:"Git Basics",summary:"Basic git commands for packaging"},r="Git Basics",c={id:"packaging/git-basics",title:"Git Basics",description:"Working with branches",source:"@site/docs/packaging/git-basics.md",sourceDirName:"packaging",slug:"/packaging/git-basics",permalink:"/docs/packaging/git-basics",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/git-basics.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Git Basics",summary:"Basic git commands for packaging"},sidebar:"packagingSidebar",previous:{title:"Appstream Metainfo",permalink:"/docs/packaging/appstream-metainfo"},next:{title:"Monitoring YAML",permalink:"/docs/packaging/monitoring.yml"}},o={},h=[{value:"Working with branches",id:"working-with-branches",level:2},{value:"Keeping your branch up to date with the main branch",id:"keeping-your-branch-up-to-date-with-the-main-branch",level:2},{value:"Adding files",id:"adding-files",level:2},{value:"Removing files",id:"removing-files",level:2},{value:"Renaming files",id:"renaming-files",level:2},{value:"Check the changes in your files",id:"check-the-changes-in-your-files",level:2},{value:"Commit your changes",id:"commit-your-changes",level:2},{value:"Deleting your branch after a pull request is merged",id:"deleting-your-branch-after-a-pull-request-is-merged",level:2}];function l(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"git-basics",children:"Git Basics"})}),"\n",(0,t.jsx)(i.h2,{id:"working-with-branches",children:"Working with branches"}),"\n",(0,t.jsxs)(i.p,{children:["The recommended way to switch branches is ",(0,t.jsx)(i.code,{children:"git switch"}),".\nTo create a new branch use ",(0,t.jsx)(i.code,{children:"git switch -c"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"keeping-your-branch-up-to-date-with-the-main-branch",children:"Keeping your branch up to date with the main branch"}),"\n",(0,t.jsxs)(i.p,{children:["If there any new changes to the repository whilst you are still working on your branch you need to ",(0,t.jsx)(i.a,{href:"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork",children:"sync your fork"}),".\nRun ",(0,t.jsx)(i.code,{children:"git fetch"}),", and ",(0,t.jsx)(i.code,{children:"git rebase origin/main"})," to pull the changes in.\nYou will need to fix any conflicts manually.\nYou can check your branch against main with ",(0,t.jsx)(i.code,{children:"git diff origin/main..my-branch"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"adding-files",children:"Adding files"}),"\n",(0,t.jsxs)(i.p,{children:["For every file you change or add, you must let git know about it: ",(0,t.jsx)(i.code,{children:"git add someFile"})]}),"\n",(0,t.jsx)(i.h2,{id:"removing-files",children:"Removing files"}),"\n",(0,t.jsxs)(i.p,{children:["For files that need to be removed, you must do so using git: ",(0,t.jsx)(i.code,{children:"git rm someFile"})]}),"\n",(0,t.jsx)(i.h2,{id:"renaming-files",children:"Renaming files"}),"\n",(0,t.jsxs)(i.p,{children:["Likewise, for renaming a file, you must do so via git: ",(0,t.jsx)(i.code,{children:"git mv someFile someFileName2"})]}),"\n",(0,t.jsx)(i.h2,{id:"check-the-changes-in-your-files",children:"Check the changes in your files"}),"\n",(0,t.jsx)(i.p,{children:"It's a good idea to review the changes you have made to each file. This is to make sure you're committing what you intend and to make sure it looks good. Do this before adding changed files."}),"\n",(0,t.jsxs)(i.p,{children:["To diff them all at once, useful for small changes, use ",(0,t.jsx)(i.code,{children:"git diff"}),".\nTo diff each file one at a time run ",(0,t.jsx)(i.code,{children:"git diff filename"})," on each one."]}),"\n",(0,t.jsx)(i.h2,{id:"commit-your-changes",children:"Commit your changes"}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.strong,{children:"Check your branch"})}),"\n",(0,t.jsxs)(i.p,{children:["Get the status of the branch with ",(0,t.jsx)(i.code,{children:"git status"}),". Make sure all the files you changed are staged, and that there are no untracked files. The git status should say your branch is clean."]}),"\n",(0,t.jsxs)(i.p,{children:["Now that you've tested and reviewed your change, when you're happy with it, it's time to commit your changes with ",(0,t.jsx)(i.code,{children:"git commit"}),"."]}),"\n",(0,t.jsx)(i.h2,{id:"deleting-your-branch-after-a-pull-request-is-merged",children:"Deleting your branch after a pull request is merged"}),"\n",(0,t.jsx)(i.p,{children:"Once your pull request has been accepted you can delete your working branches.\nFirst, change to the package directory, switch to the main branch, then delete your local and the remote branches."}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"cd ~/solus-packages\ngit switch main\ngit branch -D my-branch\ngit push -d origin my-branch\n"})})]})}function d(e={}){const{wrapper:i}={...(0,s.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,i,n)=>{n.d(i,{Z:()=>c,a:()=>r});var t=n(67294);const s={},a=t.createContext(s);function r(e){const i=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5f194406.74e8cf88.js b/assets/js/5f194406.ad4c1306.js similarity index 99% rename from assets/js/5f194406.74e8cf88.js rename to assets/js/5f194406.ad4c1306.js index 96293b97b..66f825eaa 100644 --- a/assets/js/5f194406.74e8cf88.js +++ b/assets/js/5f194406.ad4c1306.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7607],{77882:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>l,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>a,toc:()=>d});var s=n(85893),t=n(11151);const o={title:"Community Guidelines",summary:"Community Guidelines"},r="Community guidelines",a={id:"user/contributing/community-guidelines",title:"Community Guidelines",description:"Solus enforces a set of community guidelines to maintain a family-friendly, respectful, and professional environment.",source:"@site/docs/user/contributing/community-guidelines.md",sourceDirName:"user/contributing",slug:"/user/contributing/community-guidelines",permalink:"/docs/user/contributing/community-guidelines",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/contributing/community-guidelines.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Community Guidelines",summary:"Community Guidelines"},sidebar:"userSidebar",previous:{title:"Contributing",permalink:"/docs/category/contributing"},next:{title:"Getting Involved",permalink:"/docs/user/contributing/getting-involved"}},l={},d=[{value:"General guidelines",id:"general-guidelines",level:2},{value:"Harassment",id:"harassment",level:3},{value:"Language",id:"language",level:3},{value:"Media sharing",id:"media-sharing",level:3},{value:"Observe topic guidance",id:"observe-topic-guidance",level:3},{value:"Other",id:"other",level:3},{value:"Service-specific guidelines",id:"service-specific-guidelines",level:2},{value:"Repositories and issue trackers",id:"repositories-and-issue-trackers",level:3}];function u(e){const i={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"community-guidelines",children:"Community guidelines"})}),"\n",(0,s.jsx)(i.p,{children:"Solus enforces a set of community guidelines to maintain a family-friendly, respectful, and professional environment."}),"\n",(0,s.jsx)(i.p,{children:"Our guidelines apply to all services offered or used by the project, in addition to any terms of service of third-party services used by the project. Solus Staff reserves the right to either ban or terminate access, on a temporary or permanent basis, to members of the community which are found to be violating our guidelines."}),"\n",(0,s.jsx)(i.h2,{id:"general-guidelines",children:"General guidelines"}),"\n",(0,s.jsx)(i.p,{children:"The guidelines laid out in this section apply to all services offered or used by the project, such as (but not limited to):"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Our package issue tracker"}),"\n",(0,s.jsx)(i.li,{children:"Any and all forums or organized communities, e.g. our Flarum forums or subreddit"}),"\n",(0,s.jsx)(i.li,{children:"Matrix, IRC, or any other officially supported means of communicating with the project and community members in real-time"}),"\n",(0,s.jsx)(i.li,{children:"Postings to social media pages / properties owned or used by the project."}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"harassment",children:"Harassment"}),"\n",(0,s.jsx)(i.p,{children:"The project condemns any and all forms of harassment. Harassment by individuals in our community, whether in public (on services provided by or used by the project) or private (e.g. direct messages), to other members in our community, will result in the temporary or permanent banning of such individuals across any and all services provided by or used by the project."}),"\n",(0,s.jsx)(i.p,{children:"This extends to any and all events / venues sponsored or otherwise supported by the project. Harassment in such events or venues will result in the permanent banning of such individuals from future events and if necessary, the immediate removal of such individuals from any current events / venues."}),"\n",(0,s.jsx)(i.p,{children:"You are encouraged to reach out to a member of the Solus Staff should you be harassed by any member of our community so such matters may be addressed immediately."}),"\n",(0,s.jsx)(i.h3,{id:"language",children:"Language"}),"\n",(0,s.jsx)(i.p,{children:"Members of the community are expected to engage in a manner which is respectful and avoids the use of language which is hateful, derogatory, or otherwise intentionally degrading. This includes (but is not limited to) language which could be classified as:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Hateful towards individuals or groups based on:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Disabilities"}),"\n",(0,s.jsx)(i.li,{children:"Gender or gender identity"}),"\n",(0,s.jsx)(i.li,{children:"Religious beliefs"}),"\n",(0,s.jsx)(i.li,{children:"Sexual orientation"}),"\n",(0,s.jsx)(i.li,{children:"Race or nationality"}),"\n",(0,s.jsx)(i.li,{children:"Political affiliation"}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.li,{children:"Sexual or otherwise lewd in nature"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Profane language which is not derogatory, hateful, or sexual in nature may be allowed in specific off-topic rooms or other locations permitted by the project. However, the Solus Staff moderation team reserves the right to request the immediate ceasing of the use of such language by any individual if it is deemed to be derogatory, hateful, sexual, or in a manner which is otherwise distasteful."}),"\n",(0,s.jsx)(i.h3,{id:"media-sharing",children:"Media sharing"}),"\n",(0,s.jsx)(i.p,{children:"Members of the community shall not link / share media which is illegal, pornographic / sexual, or otherwise offensive in nature. This extends to sharing media which shows any illegal or otherwise harmful acts, such as acts of violence."}),"\n",(0,s.jsx)(i.h3,{id:"observe-topic-guidance",children:"Observe topic guidance"}),"\n",(0,s.jsx)(i.p,{children:"Members of the community should attempt to observe topic guidance when participating in various services offered or used by the project, such as:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Ensuring support-related rooms / mediums remain free of development and off-topic discussions to maximize the community and Solus Staff\u2019s ability to respond and address issues or support requests."}),"\n",(0,s.jsx)(i.li,{children:"Ensuring development rooms / mediums remain free of off-topic discussions which are not relevant to the development or progression of various development items relating to Solus."}),"\n",(0,s.jsx)(i.li,{children:"Ensuring off-topic rooms / mediums remain free of heated discussions of polarizing issues or current events in order to keep these spaces inviting and enjoyable."}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"other",children:"Other"}),"\n",(0,s.jsx)(i.p,{children:"The below guidelines do not fall into any specific category but should be observed by members of the community:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Continual repetition and/or advertisement of any products, services, or projects is not allowed."}),"\n",(0,s.jsx)(i.li,{children:"Using bots or other automated ways of interaction, unless explicitly permitted by the project, is not allowed."}),"\n",(0,s.jsx)(i.li,{children:"No spamming or flooding. This may result in temporary removals (for example: kicks in Matrix) or warnings, to prevent the continued spamming or flooding."}),"\n",(0,s.jsx)(i.li,{children:"Promotion of unofficial Solus communities or communication channels without prior permission is not allowed."}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"service-specific-guidelines",children:"Service-specific guidelines"}),"\n",(0,s.jsx)(i.p,{children:"The below mentioned guidelines apply to individual services provided or used by the project."}),"\n",(0,s.jsx)(i.h3,{id:"repositories-and-issue-trackers",children:"Repositories and issue trackers"}),"\n",(0,s.jsx)(i.p,{children:"Solus utilizes a number of repositories and issue trackers to facilitate the development of various items in our project and to address issues raised by our community through tasks / issue reports. These include, but are not limited to:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Our ",(0,s.jsx)(i.a,{href:"https://github.com/getsolus/",children:"Documentation, Package, Software Center, and various tooling repositories"})]}),"\n",(0,s.jsxs)(i.li,{children:["Our package ",(0,s.jsx)(i.a,{href:"https://github.com/getsolus/packages/issues",children:"issue tracker"})]}),"\n",(0,s.jsx)(i.li,{children:"All other issue trackers utilized by the project across repositories hosted in our GitHub organizations"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Members of the community are expected to:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Maintain on-topic discussions as relevant to each individual task"}),"\n",(0,s.jsx)(i.li,{children:"Not engage in disruptive behavior such as the modification of tasks or task information which are not owned or assigned to the user. Please leave the general maintenance of tasks or requesting of specific information to individuals which are assigned to the task, or Solus Staff"}),"\n",(0,s.jsx)(i.li,{children:"Refrain from using the Development Tracker for general support queries, such as (but not limited to): installation assistance, package installation assistance, etc."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Members of the community should remain mindful that all contributors to the project do so on a voluntary basis, in their free time, and should refrain from making demands or engaging in behavior which is not respectful."}),"\n",(0,s.jsx)(i.p,{children:"Solus Staff reserves the rights to:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Close or lock tasks on a temporary or permanent basis"}),"\n",(0,s.jsx)(i.li,{children:"Disable the account of individuals which violate either general guidelines or \u201cDevelopment / Issue Trackers\u201d-specific guidelines."}),"\n",(0,s.jsx)(i.li,{children:"Make any finalized decisions in the interest of the project, continuation of our vision / objectives for the project or various software which we develop or support."}),"\n"]})]})}function c(e={}){const{wrapper:i}={...(0,t.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},11151:(e,i,n)=>{n.d(i,{Z:()=>a,a:()=>r});var s=n(67294);const t={},o=s.createContext(t);function r(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7607],{77882:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>l,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>a,toc:()=>d});var s=n(85893),t=n(11151);const o={title:"Community Guidelines",summary:"Community Guidelines"},r="Community guidelines",a={id:"user/contributing/community-guidelines",title:"Community Guidelines",description:"Solus enforces a set of community guidelines to maintain a family-friendly, respectful, and professional environment.",source:"@site/docs/user/contributing/community-guidelines.md",sourceDirName:"user/contributing",slug:"/user/contributing/community-guidelines",permalink:"/docs/user/contributing/community-guidelines",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/contributing/community-guidelines.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Community Guidelines",summary:"Community Guidelines"},sidebar:"userSidebar",previous:{title:"Contributing",permalink:"/docs/category/contributing"},next:{title:"Getting Involved",permalink:"/docs/user/contributing/getting-involved"}},l={},d=[{value:"General guidelines",id:"general-guidelines",level:2},{value:"Harassment",id:"harassment",level:3},{value:"Language",id:"language",level:3},{value:"Media sharing",id:"media-sharing",level:3},{value:"Observe topic guidance",id:"observe-topic-guidance",level:3},{value:"Other",id:"other",level:3},{value:"Service-specific guidelines",id:"service-specific-guidelines",level:2},{value:"Repositories and issue trackers",id:"repositories-and-issue-trackers",level:3}];function u(e){const i={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"community-guidelines",children:"Community guidelines"})}),"\n",(0,s.jsx)(i.p,{children:"Solus enforces a set of community guidelines to maintain a family-friendly, respectful, and professional environment."}),"\n",(0,s.jsx)(i.p,{children:"Our guidelines apply to all services offered or used by the project, in addition to any terms of service of third-party services used by the project. Solus Staff reserves the right to either ban or terminate access, on a temporary or permanent basis, to members of the community which are found to be violating our guidelines."}),"\n",(0,s.jsx)(i.h2,{id:"general-guidelines",children:"General guidelines"}),"\n",(0,s.jsx)(i.p,{children:"The guidelines laid out in this section apply to all services offered or used by the project, such as (but not limited to):"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Our package issue tracker"}),"\n",(0,s.jsx)(i.li,{children:"Any and all forums or organized communities, e.g. our Flarum forums or subreddit"}),"\n",(0,s.jsx)(i.li,{children:"Matrix, IRC, or any other officially supported means of communicating with the project and community members in real-time"}),"\n",(0,s.jsx)(i.li,{children:"Postings to social media pages / properties owned or used by the project."}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"harassment",children:"Harassment"}),"\n",(0,s.jsx)(i.p,{children:"The project condemns any and all forms of harassment. Harassment by individuals in our community, whether in public (on services provided by or used by the project) or private (e.g. direct messages), to other members in our community, will result in the temporary or permanent banning of such individuals across any and all services provided by or used by the project."}),"\n",(0,s.jsx)(i.p,{children:"This extends to any and all events / venues sponsored or otherwise supported by the project. Harassment in such events or venues will result in the permanent banning of such individuals from future events and if necessary, the immediate removal of such individuals from any current events / venues."}),"\n",(0,s.jsx)(i.p,{children:"You are encouraged to reach out to a member of the Solus Staff should you be harassed by any member of our community so such matters may be addressed immediately."}),"\n",(0,s.jsx)(i.h3,{id:"language",children:"Language"}),"\n",(0,s.jsx)(i.p,{children:"Members of the community are expected to engage in a manner which is respectful and avoids the use of language which is hateful, derogatory, or otherwise intentionally degrading. This includes (but is not limited to) language which could be classified as:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Hateful towards individuals or groups based on:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Disabilities"}),"\n",(0,s.jsx)(i.li,{children:"Gender or gender identity"}),"\n",(0,s.jsx)(i.li,{children:"Religious beliefs"}),"\n",(0,s.jsx)(i.li,{children:"Sexual orientation"}),"\n",(0,s.jsx)(i.li,{children:"Race or nationality"}),"\n",(0,s.jsx)(i.li,{children:"Political affiliation"}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.li,{children:"Sexual or otherwise lewd in nature"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Profane language which is not derogatory, hateful, or sexual in nature may be allowed in specific off-topic rooms or other locations permitted by the project. However, the Solus Staff moderation team reserves the right to request the immediate ceasing of the use of such language by any individual if it is deemed to be derogatory, hateful, sexual, or in a manner which is otherwise distasteful."}),"\n",(0,s.jsx)(i.h3,{id:"media-sharing",children:"Media sharing"}),"\n",(0,s.jsx)(i.p,{children:"Members of the community shall not link / share media which is illegal, pornographic / sexual, or otherwise offensive in nature. This extends to sharing media which shows any illegal or otherwise harmful acts, such as acts of violence."}),"\n",(0,s.jsx)(i.h3,{id:"observe-topic-guidance",children:"Observe topic guidance"}),"\n",(0,s.jsx)(i.p,{children:"Members of the community should attempt to observe topic guidance when participating in various services offered or used by the project, such as:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Ensuring support-related rooms / mediums remain free of development and off-topic discussions to maximize the community and Solus Staff\u2019s ability to respond and address issues or support requests."}),"\n",(0,s.jsx)(i.li,{children:"Ensuring development rooms / mediums remain free of off-topic discussions which are not relevant to the development or progression of various development items relating to Solus."}),"\n",(0,s.jsx)(i.li,{children:"Ensuring off-topic rooms / mediums remain free of heated discussions of polarizing issues or current events in order to keep these spaces inviting and enjoyable."}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"other",children:"Other"}),"\n",(0,s.jsx)(i.p,{children:"The below guidelines do not fall into any specific category but should be observed by members of the community:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Continual repetition and/or advertisement of any products, services, or projects is not allowed."}),"\n",(0,s.jsx)(i.li,{children:"Using bots or other automated ways of interaction, unless explicitly permitted by the project, is not allowed."}),"\n",(0,s.jsx)(i.li,{children:"No spamming or flooding. This may result in temporary removals (for example: kicks in Matrix) or warnings, to prevent the continued spamming or flooding."}),"\n",(0,s.jsx)(i.li,{children:"Promotion of unofficial Solus communities or communication channels without prior permission is not allowed."}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"service-specific-guidelines",children:"Service-specific guidelines"}),"\n",(0,s.jsx)(i.p,{children:"The below mentioned guidelines apply to individual services provided or used by the project."}),"\n",(0,s.jsx)(i.h3,{id:"repositories-and-issue-trackers",children:"Repositories and issue trackers"}),"\n",(0,s.jsx)(i.p,{children:"Solus utilizes a number of repositories and issue trackers to facilitate the development of various items in our project and to address issues raised by our community through tasks / issue reports. These include, but are not limited to:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Our ",(0,s.jsx)(i.a,{href:"https://github.com/getsolus/",children:"Documentation, Package, Software Center, and various tooling repositories"})]}),"\n",(0,s.jsxs)(i.li,{children:["Our package ",(0,s.jsx)(i.a,{href:"https://github.com/getsolus/packages/issues",children:"issue tracker"})]}),"\n",(0,s.jsx)(i.li,{children:"All other issue trackers utilized by the project across repositories hosted in our GitHub organizations"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Members of the community are expected to:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Maintain on-topic discussions as relevant to each individual task"}),"\n",(0,s.jsx)(i.li,{children:"Not engage in disruptive behavior such as the modification of tasks or task information which are not owned or assigned to the user. Please leave the general maintenance of tasks or requesting of specific information to individuals which are assigned to the task, or Solus Staff"}),"\n",(0,s.jsx)(i.li,{children:"Refrain from using the Development Tracker for general support queries, such as (but not limited to): installation assistance, package installation assistance, etc."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Members of the community should remain mindful that all contributors to the project do so on a voluntary basis, in their free time, and should refrain from making demands or engaging in behavior which is not respectful."}),"\n",(0,s.jsx)(i.p,{children:"Solus Staff reserves the rights to:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Close or lock tasks on a temporary or permanent basis"}),"\n",(0,s.jsx)(i.li,{children:"Disable the account of individuals which violate either general guidelines or \u201cDevelopment / Issue Trackers\u201d-specific guidelines."}),"\n",(0,s.jsx)(i.li,{children:"Make any finalized decisions in the interest of the project, continuation of our vision / objectives for the project or various software which we develop or support."}),"\n"]})]})}function c(e={}){const{wrapper:i}={...(0,t.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},11151:(e,i,n)=>{n.d(i,{Z:()=>a,a:()=>r});var s=n(67294);const t={},o=s.createContext(t);function r(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/61c953b4.e1437d06.js b/assets/js/61c953b4.ca4b1080.js similarity index 99% rename from assets/js/61c953b4.e1437d06.js rename to assets/js/61c953b4.ca4b1080.js index afd2d79d1..cfab902f0 100644 --- a/assets/js/61c953b4.e1437d06.js +++ b/assets/js/61c953b4.ca4b1080.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8032],{18421:(e,a,i)=>{i.r(a),i.d(a,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>d});var n=i(85893),t=i(11151);const s={title:"Maintainership",summary:"Package maintainership"},r="Maintainership",o={id:"packaging/procedures/maintainership",title:"Maintainership",description:"The role of a maintainer is to update package(s) on a regular basis, while following Solus packaging and consistency standards.",source:"@site/docs/packaging/procedures/maintainership.md",sourceDirName:"packaging/procedures",slug:"/packaging/procedures/maintainership",permalink:"/docs/packaging/procedures/maintainership",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/maintainership.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Maintainership",summary:"Package maintainership"},sidebar:"packagingSidebar",previous:{title:"Procedures",permalink:"/docs/category/procedures"},next:{title:"Package Inclusion Policy",permalink:"/docs/packaging/procedures/package-inclusion"}},c={},d=[{value:"Commitment",id:"commitment",level:2},{value:"Stepping in",id:"stepping-in",level:2},{value:"Updating a maintained package",id:"updating-a-maintained-package",level:2},{value:"Maintainers",id:"maintainers",level:3},{value:"Non-maintainers",id:"non-maintainers",level:3},{value:"Template for the MAINTAINERS.md file",id:"template-for-the-maintainersmd-file",level:2}];function l(e){const a={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.header,{children:(0,n.jsx)(a.h1,{id:"maintainership",children:"Maintainership"})}),"\n",(0,n.jsx)(a.p,{children:"The role of a maintainer is to update package(s) on a regular basis, while following Solus packaging and consistency standards."}),"\n",(0,n.jsx)(a.h2,{id:"commitment",children:"Commitment"}),"\n",(0,n.jsx)(a.p,{children:"Each new package which is going to land in the Solus repository must have one or more maintainers. These individuals commit to:"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"Update the package reasonably regularly, unless there are valid reasons to hold it back"}),"\n",(0,n.jsxs)(a.li,{children:["Ensure the ",(0,n.jsx)(a.a,{href:"/docs/packaging/package.yml",children:"packaging file"})," adheres to the Solus ",(0,n.jsx)(a.a,{href:"/docs/packaging/packaging-practices",children:"standards"})]}),"\n",(0,n.jsx)(a.li,{children:"Ensure the application or library is consistent with the Operating System aesthetics, file system conventions and the Solus philosophy in general"}),"\n"]}),"\n",(0,n.jsxs)(a.p,{children:["On the Solus side however, the community must not forget that maintainers are volunteers, which may or may not have a technical background. More experienced users are to engage new maintainers in a welcoming manner, e.g. by listing their errors and inviting them to fix them. (More on this in the ",(0,n.jsx)(a.a,{href:"/docs/user/contributing/community-guidelines#repositories-and-issue-trackers",children:"community guidelines"}),")"]}),"\n",(0,n.jsx)(a.p,{children:"The Solus Staff have the right to enforce certain practices, even when in contrast with maintainers' vision. It also has the right to ultimately accept or reject a patch."}),"\n",(0,n.jsx)(a.h2,{id:"stepping-in",children:"Stepping in"}),"\n",(0,n.jsxs)(a.p,{children:["To officially step in as the maintainer of a package, a ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," file must be provided for accepted packages that are not yet included in the repository, or if the package predates the policy of requiring one. Instead, if a previously maintained package is marked by Solus Staff as needing a new maintainer, the ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," file must be updated."]}),"\n",(0,n.jsx)(a.h2,{id:"updating-a-maintained-package",children:"Updating a maintained package"}),"\n",(0,n.jsx)(a.p,{children:"The procedure varies depending on whether or not the individual is the maintainer."}),"\n",(0,n.jsx)(a.h3,{id:"maintainers",children:"Maintainers"}),"\n",(0,n.jsxs)(a.p,{children:["Maintainers are free to ",(0,n.jsx)(a.a,{href:"/docs/packaging/updating-an-existing-package",children:"update a package"})," at their will, unless otherwise indicated by Solus Staff."]}),"\n",(0,n.jsx)(a.h3,{id:"non-maintainers",children:"Non-maintainers"}),"\n",(0,n.jsxs)(a.p,{children:["If a package is actively maintained, modifications should not occur and the individual should exercise patience when it comes to updates. In some cases, a maintainer may intentionally be holding back a package, or has simply not updated yet. If pertinent, the individual should file a ",(0,n.jsx)(a.a,{href:"/docs/packaging/procedures/request-a-package-update",children:"package update request"}),". Alternatively, the individual can reach the maintainers or Solus Staff via the Solus Packaging room on ",(0,n.jsx)(a.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"})," and ask permission to update the package. It is also possible to submit an update and attach a message to it clarifying the intention of updating the package, although this is a special case reserved to e.g. security updates."]}),"\n",(0,n.jsxs)(a.h2,{id:"template-for-the-maintainersmd-file",children:["Template for the ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," file"]}),"\n",(0,n.jsxs)(a.p,{children:["Presented here is the ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," file. This file must be provided verbatim alongside the other patch contents, and filled in with the maintainers' personal information. A ",(0,n.jsx)(a.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"})," contact is optional but recommended, while an email address is mandatory. Similar to the ",(0,n.jsx)(a.code,{children:".solus/packager"})," file used for packaging, the maintainers listed in ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," must use their real first and last name(s) for accountability purposes."]}),"\n",(0,n.jsxs)(a.p,{children:["The contact information section is a YAML list. If needed, more elements may be added, each per maintainer. Do not edit the file in any other way, including spacing, except ",(0,n.jsx)(a.em,{children:"Name"}),", ",(0,n.jsx)(a.em,{children:"Surname"})," and ",(0,n.jsx)(a.em,{children:"REPLACEME"})," placeholders."]}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{children:"This file is used to indicate primary maintainership for this package. A package may list more than one maintainer to avoid bus factor issues. People on this list may be considered \u201csubject-matter experts\u201d. Please note that Solus Staff may need to perform necessary rebuilds, upgrades, or security fixes as part of the normal maintenance of the Solus package repository. If you believe this package requires an update, follow documentation from https://help.getsol.us/docs/packaging/procedures/request-a-package-update. In the event that this package becomes insufficiently maintained, the Solus Staff reserves the right to request a new maintainer, or deprecate and remove this package from the repository entirely.\n\n- Name Surname\n - Matrix: REPLACEME\n - Email: REPLACEME\n"})})]})}function h(e={}){const{wrapper:a}={...(0,t.a)(),...e.components};return a?(0,n.jsx)(a,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},11151:(e,a,i)=>{i.d(a,{Z:()=>o,a:()=>r});var n=i(67294);const t={},s=n.createContext(t);function r(e){const a=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function o(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(s.Provider,{value:a},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8032],{18421:(e,a,i)=>{i.r(a),i.d(a,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>d});var n=i(85893),t=i(11151);const s={title:"Maintainership",summary:"Package maintainership"},r="Maintainership",o={id:"packaging/procedures/maintainership",title:"Maintainership",description:"The role of a maintainer is to update package(s) on a regular basis, while following Solus packaging and consistency standards.",source:"@site/docs/packaging/procedures/maintainership.md",sourceDirName:"packaging/procedures",slug:"/packaging/procedures/maintainership",permalink:"/docs/packaging/procedures/maintainership",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/maintainership.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Maintainership",summary:"Package maintainership"},sidebar:"packagingSidebar",previous:{title:"Procedures",permalink:"/docs/category/procedures"},next:{title:"Package Inclusion Policy",permalink:"/docs/packaging/procedures/package-inclusion"}},c={},d=[{value:"Commitment",id:"commitment",level:2},{value:"Stepping in",id:"stepping-in",level:2},{value:"Updating a maintained package",id:"updating-a-maintained-package",level:2},{value:"Maintainers",id:"maintainers",level:3},{value:"Non-maintainers",id:"non-maintainers",level:3},{value:"Template for the MAINTAINERS.md file",id:"template-for-the-maintainersmd-file",level:2}];function l(e){const a={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.header,{children:(0,n.jsx)(a.h1,{id:"maintainership",children:"Maintainership"})}),"\n",(0,n.jsx)(a.p,{children:"The role of a maintainer is to update package(s) on a regular basis, while following Solus packaging and consistency standards."}),"\n",(0,n.jsx)(a.h2,{id:"commitment",children:"Commitment"}),"\n",(0,n.jsx)(a.p,{children:"Each new package which is going to land in the Solus repository must have one or more maintainers. These individuals commit to:"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"Update the package reasonably regularly, unless there are valid reasons to hold it back"}),"\n",(0,n.jsxs)(a.li,{children:["Ensure the ",(0,n.jsx)(a.a,{href:"/docs/packaging/package.yml",children:"packaging file"})," adheres to the Solus ",(0,n.jsx)(a.a,{href:"/docs/packaging/packaging-practices",children:"standards"})]}),"\n",(0,n.jsx)(a.li,{children:"Ensure the application or library is consistent with the Operating System aesthetics, file system conventions and the Solus philosophy in general"}),"\n"]}),"\n",(0,n.jsxs)(a.p,{children:["On the Solus side however, the community must not forget that maintainers are volunteers, which may or may not have a technical background. More experienced users are to engage new maintainers in a welcoming manner, e.g. by listing their errors and inviting them to fix them. (More on this in the ",(0,n.jsx)(a.a,{href:"/docs/user/contributing/community-guidelines#repositories-and-issue-trackers",children:"community guidelines"}),")"]}),"\n",(0,n.jsx)(a.p,{children:"The Solus Staff have the right to enforce certain practices, even when in contrast with maintainers' vision. It also has the right to ultimately accept or reject a patch."}),"\n",(0,n.jsx)(a.h2,{id:"stepping-in",children:"Stepping in"}),"\n",(0,n.jsxs)(a.p,{children:["To officially step in as the maintainer of a package, a ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," file must be provided for accepted packages that are not yet included in the repository, or if the package predates the policy of requiring one. Instead, if a previously maintained package is marked by Solus Staff as needing a new maintainer, the ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," file must be updated."]}),"\n",(0,n.jsx)(a.h2,{id:"updating-a-maintained-package",children:"Updating a maintained package"}),"\n",(0,n.jsx)(a.p,{children:"The procedure varies depending on whether or not the individual is the maintainer."}),"\n",(0,n.jsx)(a.h3,{id:"maintainers",children:"Maintainers"}),"\n",(0,n.jsxs)(a.p,{children:["Maintainers are free to ",(0,n.jsx)(a.a,{href:"/docs/packaging/updating-an-existing-package",children:"update a package"})," at their will, unless otherwise indicated by Solus Staff."]}),"\n",(0,n.jsx)(a.h3,{id:"non-maintainers",children:"Non-maintainers"}),"\n",(0,n.jsxs)(a.p,{children:["If a package is actively maintained, modifications should not occur and the individual should exercise patience when it comes to updates. In some cases, a maintainer may intentionally be holding back a package, or has simply not updated yet. If pertinent, the individual should file a ",(0,n.jsx)(a.a,{href:"/docs/packaging/procedures/request-a-package-update",children:"package update request"}),". Alternatively, the individual can reach the maintainers or Solus Staff via the Solus Packaging room on ",(0,n.jsx)(a.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"})," and ask permission to update the package. It is also possible to submit an update and attach a message to it clarifying the intention of updating the package, although this is a special case reserved to e.g. security updates."]}),"\n",(0,n.jsxs)(a.h2,{id:"template-for-the-maintainersmd-file",children:["Template for the ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," file"]}),"\n",(0,n.jsxs)(a.p,{children:["Presented here is the ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," file. This file must be provided verbatim alongside the other patch contents, and filled in with the maintainers' personal information. A ",(0,n.jsx)(a.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"})," contact is optional but recommended, while an email address is mandatory. Similar to the ",(0,n.jsx)(a.code,{children:".solus/packager"})," file used for packaging, the maintainers listed in ",(0,n.jsx)(a.code,{children:"MAINTAINERS.md"})," must use their real first and last name(s) for accountability purposes."]}),"\n",(0,n.jsxs)(a.p,{children:["The contact information section is a YAML list. If needed, more elements may be added, each per maintainer. Do not edit the file in any other way, including spacing, except ",(0,n.jsx)(a.em,{children:"Name"}),", ",(0,n.jsx)(a.em,{children:"Surname"})," and ",(0,n.jsx)(a.em,{children:"REPLACEME"})," placeholders."]}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{children:"This file is used to indicate primary maintainership for this package. A package may list more than one maintainer to avoid bus factor issues. People on this list may be considered \u201csubject-matter experts\u201d. Please note that Solus Staff may need to perform necessary rebuilds, upgrades, or security fixes as part of the normal maintenance of the Solus package repository. If you believe this package requires an update, follow documentation from https://help.getsol.us/docs/packaging/procedures/request-a-package-update. In the event that this package becomes insufficiently maintained, the Solus Staff reserves the right to request a new maintainer, or deprecate and remove this package from the repository entirely.\n\n- Name Surname\n - Matrix: REPLACEME\n - Email: REPLACEME\n"})})]})}function h(e={}){const{wrapper:a}={...(0,t.a)(),...e.components};return a?(0,n.jsx)(a,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},11151:(e,a,i)=>{i.d(a,{Z:()=>o,a:()=>r});var n=i(67294);const t={},s=n.createContext(t);function r(e){const a=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function o(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(s.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/64699048.9858ebd9.js b/assets/js/64699048.ea4f9bba.js similarity index 98% rename from assets/js/64699048.9858ebd9.js rename to assets/js/64699048.ea4f9bba.js index 10762a1dc..7232dfb6b 100644 --- a/assets/js/64699048.9858ebd9.js +++ b/assets/js/64699048.ea4f9bba.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2151],{87063:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>p,frontMatter:()=>r,metadata:()=>i,toc:()=>d});var s=t(85893),o=t(11151);const r={title:"Development",summary:"Installation of development software on Solus"},l="Development",i={id:"user/software/development/index",title:"Development",description:"Solus provides a stable foundation for creating, testing, and deploying applications.",source:"@site/docs/user/software/development/index.md",sourceDirName:"user/software/development",slug:"/user/software/development/",permalink:"/docs/user/software/development/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Development",summary:"Installation of development software on Solus"},sidebar:"userSidebar",previous:{title:"Desktops",permalink:"/docs/user/software/desktops/"},next:{title:"Containers",permalink:"/docs/user/software/development/containers"}},a={},d=[{value:"Getting started",id:"getting-started",level:2}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",hr:"hr",p:"p",pre:"pre",strong:"strong",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"development",children:"Development"})}),"\n",(0,s.jsx)(n.p,{children:"Solus provides a stable foundation for creating, testing, and deploying applications."}),"\n",(0,s.jsx)(n.p,{children:"You can install tools such as text editors, programming languages, compilers, and version control systems. Solus also supports containerization and virtualization technologies."}),"\n",(0,s.jsx)(n.h2,{id:"getting-started",children:"Getting started"}),"\n",(0,s.jsxs)(n.p,{children:["If you want to compile and develop software using Solus, we recommend installing the ",(0,s.jsx)(n.code,{children:"system.devel"})," component."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install -c system.devel\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"system.devel"})," component installs libraries and packages for software development, such as ",(0,s.jsx)(n.code,{children:"clang"}),", ",(0,s.jsx)(n.code,{children:"gcc"}),", and ",(0,s.jsx)(n.code,{children:"make"}),"."]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"containers",children:(0,s.jsx)(n.strong,{children:"Containers"})})}),"\n",(0,s.jsx)(n.p,{children:"Install and configure containerization software on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"java",children:(0,s.jsx)(n.strong,{children:"Java"})})}),"\n",(0,s.jsx)(n.p,{children:"Learn how to install, run, and manage Java on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"postgresql",children:(0,s.jsx)(n.strong,{children:"PostgreSQL"})})}),"\n",(0,s.jsx)(n.p,{children:"A quick guide to using PostgreSQL on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"r-and-rstudio",children:(0,s.jsx)(n.strong,{children:"R and RStudio"})})}),"\n",(0,s.jsx)(n.p,{children:"Quick start guide for R and RStudio on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"rust",children:(0,s.jsx)(n.strong,{children:"Rust"})})}),"\n",(0,s.jsx)(n.p,{children:"A quick guide to getting set up for Rust development on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"web",children:(0,s.jsx)(n.strong,{children:"Web Development"})})}),"\n",(0,s.jsx)(n.p,{children:"Install and configure different web development tools on Solus."})]})}function p(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>i,a:()=>l});var s=t(67294);const o={},r=s.createContext(o);function l(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:l(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2151],{87063:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>p,frontMatter:()=>r,metadata:()=>i,toc:()=>d});var s=t(85893),o=t(11151);const r={title:"Development",summary:"Installation of development software on Solus"},l="Development",i={id:"user/software/development/index",title:"Development",description:"Solus provides a stable foundation for creating, testing, and deploying applications.",source:"@site/docs/user/software/development/index.md",sourceDirName:"user/software/development",slug:"/user/software/development/",permalink:"/docs/user/software/development/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Development",summary:"Installation of development software on Solus"},sidebar:"userSidebar",previous:{title:"Desktops",permalink:"/docs/user/software/desktops/"},next:{title:"Containers",permalink:"/docs/user/software/development/containers"}},a={},d=[{value:"Getting started",id:"getting-started",level:2}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",hr:"hr",p:"p",pre:"pre",strong:"strong",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"development",children:"Development"})}),"\n",(0,s.jsx)(n.p,{children:"Solus provides a stable foundation for creating, testing, and deploying applications."}),"\n",(0,s.jsx)(n.p,{children:"You can install tools such as text editors, programming languages, compilers, and version control systems. Solus also supports containerization and virtualization technologies."}),"\n",(0,s.jsx)(n.h2,{id:"getting-started",children:"Getting started"}),"\n",(0,s.jsxs)(n.p,{children:["If you want to compile and develop software using Solus, we recommend installing the ",(0,s.jsx)(n.code,{children:"system.devel"})," component."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install -c system.devel\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"system.devel"})," component installs libraries and packages for software development, such as ",(0,s.jsx)(n.code,{children:"clang"}),", ",(0,s.jsx)(n.code,{children:"gcc"}),", and ",(0,s.jsx)(n.code,{children:"make"}),"."]}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"containers",children:(0,s.jsx)(n.strong,{children:"Containers"})})}),"\n",(0,s.jsx)(n.p,{children:"Install and configure containerization software on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"java",children:(0,s.jsx)(n.strong,{children:"Java"})})}),"\n",(0,s.jsx)(n.p,{children:"Learn how to install, run, and manage Java on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"postgresql",children:(0,s.jsx)(n.strong,{children:"PostgreSQL"})})}),"\n",(0,s.jsx)(n.p,{children:"A quick guide to using PostgreSQL on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"r-and-rstudio",children:(0,s.jsx)(n.strong,{children:"R and RStudio"})})}),"\n",(0,s.jsx)(n.p,{children:"Quick start guide for R and RStudio on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"rust",children:(0,s.jsx)(n.strong,{children:"Rust"})})}),"\n",(0,s.jsx)(n.p,{children:"A quick guide to getting set up for Rust development on Solus."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"web",children:(0,s.jsx)(n.strong,{children:"Web Development"})})}),"\n",(0,s.jsx)(n.p,{children:"Install and configure different web development tools on Solus."})]})}function p(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>i,a:()=>l});var s=t(67294);const o={},r=s.createContext(o);function l(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:l(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6787574e.1482e835.js b/assets/js/6787574e.5388a897.js similarity index 99% rename from assets/js/6787574e.1482e835.js rename to assets/js/6787574e.5388a897.js index 7e5753c45..175af05d2 100644 --- a/assets/js/6787574e.1482e835.js +++ b/assets/js/6787574e.5388a897.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4500],{26240:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>l,frontMatter:()=>o,metadata:()=>d,toc:()=>c});var r=s(85893),n=s(11151);const o={title:"Welcome",summary:"Front page of the Help Center",sidebar_position:0},i="Welcome",d={id:"user/intro",title:"Welcome",description:"Solus is committed to helping users get the most out of their systems. We designed the help center to introduce our ecosystem and guide you through typical tasks you might need help with.",source:"@site/docs/user/intro.md",sourceDirName:"user",slug:"/user/intro",permalink:"/docs/user/intro",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/intro.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,sidebarPosition:0,frontMatter:{title:"Welcome",summary:"Front page of the Help Center",sidebar_position:0},sidebar:"userSidebar",next:{title:"Quick Start",permalink:"/docs/category/quick-start"}},a={},c=[{value:"Table of contents",id:"table-of-contents",level:2},{value:"Support channels",id:"support-channels",level:2}];function h(e){const t={a:"a",admonition:"admonition",h1:"h1",h2:"h2",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"welcome",children:"Welcome"})}),"\n",(0,r.jsx)(t.p,{children:"Solus is committed to helping users get the most out of their systems. We designed the help center to introduce our ecosystem and guide you through typical tasks you might need help with."}),"\n",(0,r.jsx)(t.h2,{id:"table-of-contents",children:"Table of contents"}),"\n",(0,r.jsx)(t.p,{children:"We organized the help center into sections to help you navigate the contents easily:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Section"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/category/quick-start",children:"Quick Start"})}),(0,r.jsx)(t.td,{children:"If you're new to Solus, this section will set you on the right track. Find documentation on system requirements, installing Solus, software management, the boot process, and troubleshooting."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/category/contributing",children:"Contributing"})}),(0,r.jsx)(t.td,{children:"Find how you can contribute to Solus, whether you're a beginner or an experienced Linux and Solus user."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/user/editions/",children:"Editions"})}),(0,r.jsx)(t.td,{children:"Understand the different editions of Solus: differences between editions, configuration tasks, and helpful tips and tricks."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/user/hardware/",children:"Hardware"})}),(0,r.jsx)(t.td,{children:"Solus supports most hardware out-of-the-box, but there are exceptions. This section focuses on those exceptions and how to get the most out of your hardware."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/category/package-management/",children:"Package management"})}),(0,r.jsx)(t.td,{children:"Learn how to install software and manage the repositories of your Solus system."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/user/privacy",children:"Privacy policy"})}),(0,r.jsx)(t.td,{children:"Understand our privacy policy: Learn how we handle your data, and how to contact us for privacy concerns."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/category/software/",children:"Software"})}),(0,r.jsx)(t.td,{children:"Getting started and configuration guides for the software packages included in Solus."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/user/troubleshooting/",children:"Troubleshooting"})}),(0,r.jsx)(t.td,{children:"Learn how to diagnose and fix problems you might have with Solus."})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"support-channels",children:"Support channels"}),"\n",(0,r.jsx)(t.p,{children:"If you need help with something not covered in the help center, there are various channels where you can seek support from the Solus team or other Solus users."}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Channel"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://discuss.getsol.us",children:"Forums"})}),(0,r.jsx)(t.td,{children:"Our Flarum-powered forums are easy to use from any device and are a great resource for getting support."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://matrix.to/#/#solus:matrix.org",children:"Matrix"})}),(0,r.jsxs)(t.td,{children:["Matrix is a great way to discuss issues and development in real-time. Learn how to access Solus' Matrix space ",(0,r.jsx)(t.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"here"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://www.reddit.com/r/SolusProject",children:"Reddit"})}),(0,r.jsx)(t.td,{children:"If you are a Redditor, our subreddit has a similar purpose to the forums."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://issues.getsol.us",children:"Issue tracker"})}),(0,r.jsx)(t.td,{children:"If you have issues with your Solus system, or any of our software packages doesn't work as expected, consider filing a bug report on our issue tracker."})]})]})]}),"\n",(0,r.jsx)(t.admonition,{title:"Important",type:"caution",children:(0,r.jsx)(t.p,{children:"Volunteers around the world build and maintain Solus. Due to time zone differences there might not always be people to answer your questions immediately."})})]})}function l(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>d,a:()=>i});var r=s(67294);const n={},o=r.createContext(n);function i(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4500],{26240:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>l,frontMatter:()=>o,metadata:()=>d,toc:()=>c});var r=s(85893),n=s(11151);const o={title:"Welcome",summary:"Front page of the Help Center",sidebar_position:0},i="Welcome",d={id:"user/intro",title:"Welcome",description:"Solus is committed to helping users get the most out of their systems. We designed the help center to introduce our ecosystem and guide you through typical tasks you might need help with.",source:"@site/docs/user/intro.md",sourceDirName:"user",slug:"/user/intro",permalink:"/docs/user/intro",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/intro.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,sidebarPosition:0,frontMatter:{title:"Welcome",summary:"Front page of the Help Center",sidebar_position:0},sidebar:"userSidebar",next:{title:"Quick Start",permalink:"/docs/category/quick-start"}},a={},c=[{value:"Table of contents",id:"table-of-contents",level:2},{value:"Support channels",id:"support-channels",level:2}];function h(e){const t={a:"a",admonition:"admonition",h1:"h1",h2:"h2",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"welcome",children:"Welcome"})}),"\n",(0,r.jsx)(t.p,{children:"Solus is committed to helping users get the most out of their systems. We designed the help center to introduce our ecosystem and guide you through typical tasks you might need help with."}),"\n",(0,r.jsx)(t.h2,{id:"table-of-contents",children:"Table of contents"}),"\n",(0,r.jsx)(t.p,{children:"We organized the help center into sections to help you navigate the contents easily:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Section"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/category/quick-start",children:"Quick Start"})}),(0,r.jsx)(t.td,{children:"If you're new to Solus, this section will set you on the right track. Find documentation on system requirements, installing Solus, software management, the boot process, and troubleshooting."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/category/contributing",children:"Contributing"})}),(0,r.jsx)(t.td,{children:"Find how you can contribute to Solus, whether you're a beginner or an experienced Linux and Solus user."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/user/editions/",children:"Editions"})}),(0,r.jsx)(t.td,{children:"Understand the different editions of Solus: differences between editions, configuration tasks, and helpful tips and tricks."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/user/hardware/",children:"Hardware"})}),(0,r.jsx)(t.td,{children:"Solus supports most hardware out-of-the-box, but there are exceptions. This section focuses on those exceptions and how to get the most out of your hardware."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/category/package-management/",children:"Package management"})}),(0,r.jsx)(t.td,{children:"Learn how to install software and manage the repositories of your Solus system."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/user/privacy",children:"Privacy policy"})}),(0,r.jsx)(t.td,{children:"Understand our privacy policy: Learn how we handle your data, and how to contact us for privacy concerns."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/category/software/",children:"Software"})}),(0,r.jsx)(t.td,{children:"Getting started and configuration guides for the software packages included in Solus."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"/docs/user/troubleshooting/",children:"Troubleshooting"})}),(0,r.jsx)(t.td,{children:"Learn how to diagnose and fix problems you might have with Solus."})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"support-channels",children:"Support channels"}),"\n",(0,r.jsx)(t.p,{children:"If you need help with something not covered in the help center, there are various channels where you can seek support from the Solus team or other Solus users."}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Channel"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://discuss.getsol.us",children:"Forums"})}),(0,r.jsx)(t.td,{children:"Our Flarum-powered forums are easy to use from any device and are a great resource for getting support."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://matrix.to/#/#solus:matrix.org",children:"Matrix"})}),(0,r.jsxs)(t.td,{children:["Matrix is a great way to discuss issues and development in real-time. Learn how to access Solus' Matrix space ",(0,r.jsx)(t.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"here"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://www.reddit.com/r/SolusProject",children:"Reddit"})}),(0,r.jsx)(t.td,{children:"If you are a Redditor, our subreddit has a similar purpose to the forums."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.a,{href:"https://issues.getsol.us",children:"Issue tracker"})}),(0,r.jsx)(t.td,{children:"If you have issues with your Solus system, or any of our software packages doesn't work as expected, consider filing a bug report on our issue tracker."})]})]})]}),"\n",(0,r.jsx)(t.admonition,{title:"Important",type:"caution",children:(0,r.jsx)(t.p,{children:"Volunteers around the world build and maintain Solus. Due to time zone differences there might not always be people to answer your questions immediately."})})]})}function l(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>d,a:()=>i});var r=s(67294);const n={},o=r.createContext(n);function i(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6873f895.73ae0d1f.js b/assets/js/6873f895.240d8b66.js similarity index 99% rename from assets/js/6873f895.73ae0d1f.js rename to assets/js/6873f895.240d8b66.js index 311be1797..ad3bb7fef 100644 --- a/assets/js/6873f895.73ae0d1f.js +++ b/assets/js/6873f895.240d8b66.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8849],{83781:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>a});var s=t(85893),i=t(11151);const r={title:"Solus Style Guide",summary:"Guidance for writing Solus content"},o="Solus style guide",l={id:"user/contributing/style",title:"Solus Style Guide",description:"Solus needs a style guide to give clarity to our contributors and a consistent experience for readers. But we don't want to write our own! We surveyed existing style guides, and we picked parts that were more suitable for our content.",source:"@site/docs/user/contributing/style.md",sourceDirName:"user/contributing",slug:"/user/contributing/style",permalink:"/docs/user/contributing/style",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/contributing/style.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Solus Style Guide",summary:"Guidance for writing Solus content"},sidebar:"userSidebar",previous:{title:"Getting Involved",permalink:"/docs/user/contributing/getting-involved"},next:{title:"Testing an ISO",permalink:"/docs/user/contributing/testing-an-iso"}},d={},a=[{value:"General writing style",id:"general-writing-style",level:2},{value:"Linux-specific terms",id:"linux-specific-terms",level:2},{value:"Specific guidance",id:"specific-guidance",level:2},{value:"Admonitions",id:"admonitions",level:3},{value:"Code blocks",id:"code-blocks",level:2},{value:"Commands",id:"commands",level:3},{value:"Common Solus terms",id:"common-solus-terms",level:3},{value:"Markdown formatting",id:"markdown-formatting",level:3},{value:"Package names",id:"package-names",level:2},{value:"Spelling",id:"spelling",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"solus-style-guide",children:"Solus style guide"})}),"\n",(0,s.jsx)(n.p,{children:"Solus needs a style guide to give clarity to our contributors and a consistent experience for readers. But we don't want to write our own! We surveyed existing style guides, and we picked parts that were more suitable for our content."}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"Existing help center topics might not follow our style guide yet."})}),"\n",(0,s.jsx)(n.h2,{id:"general-writing-style",children:"General writing style"}),"\n",(0,s.jsxs)(n.p,{children:["Use the ",(0,s.jsx)(n.a,{href:"https://developers.google.com/style",children:"Google developer documentation style guide"})," for general writing style, grammar, and formatting."]}),"\n",(0,s.jsx)(n.p,{children:"Some useful pages:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://developers.google.com/style/text-formatting",children:"Text formatting summary"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://developers.google.com/style/procedures",children:"Procedures"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://developers.google.com/style/timeless-documentation",children:"Timeless documentation"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://developers.google.com/style/word-list",children:"Word list"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"linux-specific-terms",children:"Linux-specific terms"}),"\n",(0,s.jsxs)(n.p,{children:["If you are unsure of how to use a common Linux term, refer to the ",(0,s.jsx)(n.a,{href:"https://redhat-documentation.github.io/supplementary-style-guide/#glossary-terms-conventions",children:"Glossary of terms and conventions"})," from the ",(0,s.jsx)(n.em,{children:"Red Hat supplementary style guide for documentation"})]}),"\n",(0,s.jsx)(n.h2,{id:"specific-guidance",children:"Specific guidance"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.em,{children:"In alphabetical order, not order of importance."})}),"\n",(0,s.jsx)(n.h3,{id:"admonitions",children:"Admonitions"}),"\n",(0,s.jsxs)(n.p,{children:["This section is based on the ",(0,s.jsx)(n.a,{href:"https://redhat-documentation.github.io/supplementary-style-guide/#admonitions",children:"Red Hat supplementary style guide"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Admonitions should draw the reader\u2019s attention to certain information. Keep admonitions to a minimum, and avoid placing multiple admonitions close to one another. If multiple admonitions are necessary, restructure the information by moving the less-important statements into the flow of the main content. See the ",(0,s.jsx)(n.a,{href:"https://docusaurus.io/docs/markdown-features/admonitions",children:"Docusaurus documentation"})," to learn the correct syntax."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Note"}),(0,s.jsx)(n.td,{children:"Additional guidance or advice that improves product configuration, performance, or supportability"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Tip"}),(0,s.jsx)(n.td,{children:"Recommendations, suggestions, and alternative methods that might not be obvious. Tips are not essential to using the product."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Info"}),(0,s.jsx)(n.td,{children:"General information about the topic at hand that may be useful or relevant to user."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Important"}),(0,s.jsx)(n.td,{children:"Advisory information essential to the completion of a task or default configuration settings. Users must not disregard this information."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Warning"}),(0,s.jsx)(n.td,{children:"Information that warns the user to proceed with caution. Warning emphasizes a course of action\u2019s potential downsides."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Danger"}),(0,s.jsx)(n.td,{children:"Information about imminent system damage, data loss, or a support-related issue if the user disregards this admonition. If available, offer information to avoid the problem in the future or state where to find more information."})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"code-blocks",children:"Code blocks"}),"\n",(0,s.jsx)(n.p,{children:"Code blocks must indicate the programming language of the code snippet."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-md",children:'```js\nconsole.log("Hello, world!");\n```\n'})}),"\n",(0,s.jsx)(n.h3,{id:"commands",children:"Commands"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Commands as part of procedures must be inside code blocks with ",(0,s.jsx)(n.code,{children:"bash"}),' as the language type. This ensures users get a "copy to clipboard" button.']}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"When needed, indicate the directory where users need to move before executing the command."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-md",children:"```bash\ncd ~/path/to/directory\nsudo somecommand\n```\n"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"common-solus-terms",children:"Common Solus terms"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Solus","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Prefer ",(0,s.jsx)(n.em,{children:"Solus"})," rather than ",(0,s.jsx)(n.em,{children:"Solus Project"}),". Don't use ",(0,s.jsx)(n.em,{children:"Solus OS"})," or ",(0,s.jsx)(n.em,{children:"Solus Linux"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["The names of the different editions of Solus are:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Solus Budgie"}),"\n",(0,s.jsx)(n.li,{children:"Solus GNOME"}),"\n",(0,s.jsx)(n.li,{children:"Solus Plasma"}),"\n",(0,s.jsx)(n.li,{children:"Solus XFCE"}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Repositories","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Avoid using terms such as ",(0,s.jsx)(n.em,{children:"repo"}),", or ",(0,s.jsx)(n.em,{children:"monorepo"}),", use the specific repository name instead."]}),"\n",(0,s.jsx)(n.li,{children:'Example: "The packages repository", instead of "The monorepo".'}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Dev Tracker","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Avoid using the term ",(0,s.jsx)(n.em,{children:"Dev Tracker"}),"."]}),"\n",(0,s.jsx)(n.li,{children:'Example: "The packages issue tracker", instead of "The dev tracker"'}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["eopkg","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["If you're referring to the application or package, use \"",(0,s.jsx)(n.code,{children:"eopkg"}),'" with inline code formatting (see below)']}),"\n",(0,s.jsxs)(n.li,{children:["If you're referring to package files, use \"",(0,s.jsx)(n.code,{children:".eopkg"}),'" with inline code formatting, including the period but no wildcard']}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"markdown-formatting",children:"Markdown formatting"}),"\n",(0,s.jsxs)(n.p,{children:["Write content using ",(0,s.jsx)(n.a,{href:"https://www.markdownguide.org/cheat-sheet/",children:"Markdown formatting"}),", use ",(0,s.jsx)(n.a,{href:"https://prettier.io/",children:"Prettier"})," to enforce consistent formatting."]}),"\n",(0,s.jsx)(n.h2,{id:"package-names",children:"Package names"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"The name of packages in the Solus repository must use inline code formatting."}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-md",children:"To install `caddy`, use the Software Center or execute the following command:\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"When referring to the name of a product or project, use the name the authors use."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Examples: ",(0,s.jsx)(n.em,{children:"RetroArch"}),", and ",(0,s.jsx)(n.em,{children:"Code::Blocks"})]}),"\n",(0,s.jsx)(n.h3,{id:"spelling",children:"Spelling"}),"\n",(0,s.jsxs)(n.p,{children:["We prefer American spelling over British spelling. When in doubt about the spelling of a word, see the ",(0,s.jsx)(n.a,{href:"https://www.merriam-webster.com/",children:"Merriam-Webster dictionary"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>o});var s=t(67294);const i={},r=s.createContext(i);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8849],{83781:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>a});var s=t(85893),i=t(11151);const r={title:"Solus Style Guide",summary:"Guidance for writing Solus content"},o="Solus style guide",l={id:"user/contributing/style",title:"Solus Style Guide",description:"Solus needs a style guide to give clarity to our contributors and a consistent experience for readers. But we don't want to write our own! We surveyed existing style guides, and we picked parts that were more suitable for our content.",source:"@site/docs/user/contributing/style.md",sourceDirName:"user/contributing",slug:"/user/contributing/style",permalink:"/docs/user/contributing/style",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/contributing/style.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Solus Style Guide",summary:"Guidance for writing Solus content"},sidebar:"userSidebar",previous:{title:"Getting Involved",permalink:"/docs/user/contributing/getting-involved"},next:{title:"Testing an ISO",permalink:"/docs/user/contributing/testing-an-iso"}},d={},a=[{value:"General writing style",id:"general-writing-style",level:2},{value:"Linux-specific terms",id:"linux-specific-terms",level:2},{value:"Specific guidance",id:"specific-guidance",level:2},{value:"Admonitions",id:"admonitions",level:3},{value:"Code blocks",id:"code-blocks",level:2},{value:"Commands",id:"commands",level:3},{value:"Common Solus terms",id:"common-solus-terms",level:3},{value:"Markdown formatting",id:"markdown-formatting",level:3},{value:"Package names",id:"package-names",level:2},{value:"Spelling",id:"spelling",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"solus-style-guide",children:"Solus style guide"})}),"\n",(0,s.jsx)(n.p,{children:"Solus needs a style guide to give clarity to our contributors and a consistent experience for readers. But we don't want to write our own! We surveyed existing style guides, and we picked parts that were more suitable for our content."}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"Existing help center topics might not follow our style guide yet."})}),"\n",(0,s.jsx)(n.h2,{id:"general-writing-style",children:"General writing style"}),"\n",(0,s.jsxs)(n.p,{children:["Use the ",(0,s.jsx)(n.a,{href:"https://developers.google.com/style",children:"Google developer documentation style guide"})," for general writing style, grammar, and formatting."]}),"\n",(0,s.jsx)(n.p,{children:"Some useful pages:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://developers.google.com/style/text-formatting",children:"Text formatting summary"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://developers.google.com/style/procedures",children:"Procedures"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://developers.google.com/style/timeless-documentation",children:"Timeless documentation"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://developers.google.com/style/word-list",children:"Word list"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"linux-specific-terms",children:"Linux-specific terms"}),"\n",(0,s.jsxs)(n.p,{children:["If you are unsure of how to use a common Linux term, refer to the ",(0,s.jsx)(n.a,{href:"https://redhat-documentation.github.io/supplementary-style-guide/#glossary-terms-conventions",children:"Glossary of terms and conventions"})," from the ",(0,s.jsx)(n.em,{children:"Red Hat supplementary style guide for documentation"})]}),"\n",(0,s.jsx)(n.h2,{id:"specific-guidance",children:"Specific guidance"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.em,{children:"In alphabetical order, not order of importance."})}),"\n",(0,s.jsx)(n.h3,{id:"admonitions",children:"Admonitions"}),"\n",(0,s.jsxs)(n.p,{children:["This section is based on the ",(0,s.jsx)(n.a,{href:"https://redhat-documentation.github.io/supplementary-style-guide/#admonitions",children:"Red Hat supplementary style guide"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Admonitions should draw the reader\u2019s attention to certain information. Keep admonitions to a minimum, and avoid placing multiple admonitions close to one another. If multiple admonitions are necessary, restructure the information by moving the less-important statements into the flow of the main content. See the ",(0,s.jsx)(n.a,{href:"https://docusaurus.io/docs/markdown-features/admonitions",children:"Docusaurus documentation"})," to learn the correct syntax."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Note"}),(0,s.jsx)(n.td,{children:"Additional guidance or advice that improves product configuration, performance, or supportability"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Tip"}),(0,s.jsx)(n.td,{children:"Recommendations, suggestions, and alternative methods that might not be obvious. Tips are not essential to using the product."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Info"}),(0,s.jsx)(n.td,{children:"General information about the topic at hand that may be useful or relevant to user."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Important"}),(0,s.jsx)(n.td,{children:"Advisory information essential to the completion of a task or default configuration settings. Users must not disregard this information."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Warning"}),(0,s.jsx)(n.td,{children:"Information that warns the user to proceed with caution. Warning emphasizes a course of action\u2019s potential downsides."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Danger"}),(0,s.jsx)(n.td,{children:"Information about imminent system damage, data loss, or a support-related issue if the user disregards this admonition. If available, offer information to avoid the problem in the future or state where to find more information."})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"code-blocks",children:"Code blocks"}),"\n",(0,s.jsx)(n.p,{children:"Code blocks must indicate the programming language of the code snippet."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-md",children:'```js\nconsole.log("Hello, world!");\n```\n'})}),"\n",(0,s.jsx)(n.h3,{id:"commands",children:"Commands"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Commands as part of procedures must be inside code blocks with ",(0,s.jsx)(n.code,{children:"bash"}),' as the language type. This ensures users get a "copy to clipboard" button.']}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"When needed, indicate the directory where users need to move before executing the command."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-md",children:"```bash\ncd ~/path/to/directory\nsudo somecommand\n```\n"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"common-solus-terms",children:"Common Solus terms"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Solus","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Prefer ",(0,s.jsx)(n.em,{children:"Solus"})," rather than ",(0,s.jsx)(n.em,{children:"Solus Project"}),". Don't use ",(0,s.jsx)(n.em,{children:"Solus OS"})," or ",(0,s.jsx)(n.em,{children:"Solus Linux"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["The names of the different editions of Solus are:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Solus Budgie"}),"\n",(0,s.jsx)(n.li,{children:"Solus GNOME"}),"\n",(0,s.jsx)(n.li,{children:"Solus Plasma"}),"\n",(0,s.jsx)(n.li,{children:"Solus XFCE"}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Repositories","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Avoid using terms such as ",(0,s.jsx)(n.em,{children:"repo"}),", or ",(0,s.jsx)(n.em,{children:"monorepo"}),", use the specific repository name instead."]}),"\n",(0,s.jsx)(n.li,{children:'Example: "The packages repository", instead of "The monorepo".'}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["Dev Tracker","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Avoid using the term ",(0,s.jsx)(n.em,{children:"Dev Tracker"}),"."]}),"\n",(0,s.jsx)(n.li,{children:'Example: "The packages issue tracker", instead of "The dev tracker"'}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["eopkg","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["If you're referring to the application or package, use \"",(0,s.jsx)(n.code,{children:"eopkg"}),'" with inline code formatting (see below)']}),"\n",(0,s.jsxs)(n.li,{children:["If you're referring to package files, use \"",(0,s.jsx)(n.code,{children:".eopkg"}),'" with inline code formatting, including the period but no wildcard']}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"markdown-formatting",children:"Markdown formatting"}),"\n",(0,s.jsxs)(n.p,{children:["Write content using ",(0,s.jsx)(n.a,{href:"https://www.markdownguide.org/cheat-sheet/",children:"Markdown formatting"}),", use ",(0,s.jsx)(n.a,{href:"https://prettier.io/",children:"Prettier"})," to enforce consistent formatting."]}),"\n",(0,s.jsx)(n.h2,{id:"package-names",children:"Package names"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"The name of packages in the Solus repository must use inline code formatting."}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-md",children:"To install `caddy`, use the Software Center or execute the following command:\n"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"When referring to the name of a product or project, use the name the authors use."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Examples: ",(0,s.jsx)(n.em,{children:"RetroArch"}),", and ",(0,s.jsx)(n.em,{children:"Code::Blocks"})]}),"\n",(0,s.jsx)(n.h3,{id:"spelling",children:"Spelling"}),"\n",(0,s.jsxs)(n.p,{children:["We prefer American spelling over British spelling. When in doubt about the spelling of a word, see the ",(0,s.jsx)(n.a,{href:"https://www.merriam-webster.com/",children:"Merriam-Webster dictionary"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>o});var s=t(67294);const i={},r=s.createContext(i);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6cfe09a0.de7c9bdf.js b/assets/js/6cfe09a0.ac033cb3.js similarity index 98% rename from assets/js/6cfe09a0.de7c9bdf.js rename to assets/js/6cfe09a0.ac033cb3.js index 84a33102c..9b3c9c9df 100644 --- a/assets/js/6cfe09a0.de7c9bdf.js +++ b/assets/js/6cfe09a0.ac033cb3.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1174],{67189:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var t=s(85893),r=s(11151);const i={title:"TigerVNC",summary:"A quick start guide to using TigerVNC on Solus"},o="TigerVNC",a={id:"user/software/networking/tigervnc",title:"TigerVNC",description:"TigerVNC is a high-performance implementation of the VNC protocol, which allows you to control/view desktops remotely over the internet.",source:"@site/docs/user/software/networking/tigervnc.md",sourceDirName:"user/software/networking",slug:"/user/software/networking/tigervnc",permalink:"/docs/user/software/networking/tigervnc",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/networking/tigervnc.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"TigerVNC",summary:"A quick start guide to using TigerVNC on Solus"},sidebar:"userSidebar",previous:{title:"Samba File Sharing",permalink:"/docs/user/software/networking/samba"},next:{title:"Wireshark",permalink:"/docs/user/software/networking/wireshark"}},l={},c=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Initial setup of vncserver",id:"initial-setup-of-vncserver",level:3},{value:"Configuration for your desktops",id:"configuration-for-your-desktops",level:3},{value:"Budgie",id:"budgie",level:3},{value:"GNOME",id:"gnome",level:3},{value:"MATE",id:"mate",level:3},{value:"Plasma",id:"plasma",level:3}];function d(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"tigervnc",children:"TigerVNC"})}),"\n",(0,t.jsx)(n.p,{children:"TigerVNC is a high-performance implementation of the VNC protocol, which allows you to control/view desktops remotely over the internet."}),"\n",(0,t.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(n.p,{children:"TigerVNC can be installed either from the Software Center or via terminal. The terminal command to run it is:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install tigervnc\n"})}),"\n",(0,t.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsx)(n.h3,{id:"initial-setup-of-vncserver",children:"Initial setup of vncserver"}),"\n",(0,t.jsx)(n.p,{children:"For the initial setup of vncserver for TigerVNC you have to open a terminal and run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"vncserver\n"})}),"\n",(0,t.jsxs)(n.p,{children:["While this setup you will be asked for setting up a ",(0,t.jsx)(n.strong,{children:"password"})," and if you'd like to setup a ",(0,t.jsx)(n.strong,{children:"view-only mode"}),", please do it accordingly your desire."]}),"\n",(0,t.jsx)(n.p,{children:"After the initial setup you have to stop the vncserver process, for this please type inside the terminal"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"vncserver -kill :1\n"})}),"\n",(0,t.jsx)(n.h3,{id:"configuration-for-your-desktops",children:"Configuration for your desktops"}),"\n",(0,t.jsxs)(n.p,{children:["Every Desktop needs a different Setup, you find the vncserver config under",(0,t.jsx)(n.code,{children:"$HOME/.vnc/xstartup"})," open the file with your desired editor and change bash script inside the file with the following information for your Desktop."]}),"\n",(0,t.jsx)(n.h3,{id:"budgie",children:"Budgie"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"#!/bin/bash\n\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\n\ngnome-session --session=budgie-desktop &\nbudgie-wm &\nbudgie-panel &\n"})}),"\n",(0,t.jsx)(n.h3,{id:"gnome",children:"GNOME"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"#!/bin/bash\n\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\nexport XKL_XMODMAP_DISABLE=1\n\ngnome-session &\ngnome-panel &\ngnome-settings-daemon &\nmetacity &\nnautilus &\n"})}),"\n",(0,t.jsx)(n.h3,{id:"mate",children:"MATE"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"#!/bin/bash\n\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\n\nmate-session &\nmate-panel &\n"})}),"\n",(0,t.jsx)(n.h3,{id:"plasma",children:"Plasma"}),"\n",(0,t.jsxs)(n.p,{children:["Plasma desktop is not supported at the moment. Please use the software ",(0,t.jsx)(n.code,{children:"x11vnc"})," for vncserver support on Plasma."]})]})}function u(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},11151:(e,n,s)=>{s.d(n,{Z:()=>a,a:()=>o});var t=s(67294);const r={},i=t.createContext(r);function o(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1174],{67189:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var t=s(85893),r=s(11151);const i={title:"TigerVNC",summary:"A quick start guide to using TigerVNC on Solus"},o="TigerVNC",a={id:"user/software/networking/tigervnc",title:"TigerVNC",description:"TigerVNC is a high-performance implementation of the VNC protocol, which allows you to control/view desktops remotely over the internet.",source:"@site/docs/user/software/networking/tigervnc.md",sourceDirName:"user/software/networking",slug:"/user/software/networking/tigervnc",permalink:"/docs/user/software/networking/tigervnc",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/networking/tigervnc.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"TigerVNC",summary:"A quick start guide to using TigerVNC on Solus"},sidebar:"userSidebar",previous:{title:"Samba File Sharing",permalink:"/docs/user/software/networking/samba"},next:{title:"Wireshark",permalink:"/docs/user/software/networking/wireshark"}},l={},c=[{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Initial setup of vncserver",id:"initial-setup-of-vncserver",level:3},{value:"Configuration for your desktops",id:"configuration-for-your-desktops",level:3},{value:"Budgie",id:"budgie",level:3},{value:"GNOME",id:"gnome",level:3},{value:"MATE",id:"mate",level:3},{value:"Plasma",id:"plasma",level:3}];function d(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"tigervnc",children:"TigerVNC"})}),"\n",(0,t.jsx)(n.p,{children:"TigerVNC is a high-performance implementation of the VNC protocol, which allows you to control/view desktops remotely over the internet."}),"\n",(0,t.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(n.p,{children:"TigerVNC can be installed either from the Software Center or via terminal. The terminal command to run it is:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install tigervnc\n"})}),"\n",(0,t.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsx)(n.h3,{id:"initial-setup-of-vncserver",children:"Initial setup of vncserver"}),"\n",(0,t.jsx)(n.p,{children:"For the initial setup of vncserver for TigerVNC you have to open a terminal and run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"vncserver\n"})}),"\n",(0,t.jsxs)(n.p,{children:["While this setup you will be asked for setting up a ",(0,t.jsx)(n.strong,{children:"password"})," and if you'd like to setup a ",(0,t.jsx)(n.strong,{children:"view-only mode"}),", please do it accordingly your desire."]}),"\n",(0,t.jsx)(n.p,{children:"After the initial setup you have to stop the vncserver process, for this please type inside the terminal"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"vncserver -kill :1\n"})}),"\n",(0,t.jsx)(n.h3,{id:"configuration-for-your-desktops",children:"Configuration for your desktops"}),"\n",(0,t.jsxs)(n.p,{children:["Every Desktop needs a different Setup, you find the vncserver config under",(0,t.jsx)(n.code,{children:"$HOME/.vnc/xstartup"})," open the file with your desired editor and change bash script inside the file with the following information for your Desktop."]}),"\n",(0,t.jsx)(n.h3,{id:"budgie",children:"Budgie"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"#!/bin/bash\n\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\n\ngnome-session --session=budgie-desktop &\nbudgie-wm &\nbudgie-panel &\n"})}),"\n",(0,t.jsx)(n.h3,{id:"gnome",children:"GNOME"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"#!/bin/bash\n\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\nexport XKL_XMODMAP_DISABLE=1\n\ngnome-session &\ngnome-panel &\ngnome-settings-daemon &\nmetacity &\nnautilus &\n"})}),"\n",(0,t.jsx)(n.h3,{id:"mate",children:"MATE"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"#!/bin/bash\n\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\n\nmate-session &\nmate-panel &\n"})}),"\n",(0,t.jsx)(n.h3,{id:"plasma",children:"Plasma"}),"\n",(0,t.jsxs)(n.p,{children:["Plasma desktop is not supported at the moment. Please use the software ",(0,t.jsx)(n.code,{children:"x11vnc"})," for vncserver support on Plasma."]})]})}function u(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},11151:(e,n,s)=>{s.d(n,{Z:()=>a,a:()=>o});var t=s(67294);const r={},i=t.createContext(r);function o(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7071adf5.95872f78.js b/assets/js/7071adf5.8479f3f3.js similarity index 99% rename from assets/js/7071adf5.95872f78.js rename to assets/js/7071adf5.8479f3f3.js index 5dd740a9e..ee55fba0b 100644 --- a/assets/js/7071adf5.95872f78.js +++ b/assets/js/7071adf5.8479f3f3.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4796],{31386:(e,o,s)=>{s.r(o),s.d(o,{assets:()=>r,contentTitle:()=>a,default:()=>u,frontMatter:()=>t,metadata:()=>c,toc:()=>l});var i=s(85893),n=s(11151);const t={title:"Troubleshooting for Packagers",summary:"Common packaging issues and how to fix them"},a="Troubleshooting for Packagers",c={id:"packaging/troubleshooting-packaging",title:"Troubleshooting for Packagers",description:"This page covers common packaging issues and how to fix them. We also show you how to share your packaging work so you can ask for help in the Solus Matrix rooms.",source:"@site/docs/packaging/troubleshooting-packaging.md",sourceDirName:"packaging",slug:"/packaging/troubleshooting-packaging",permalink:"/docs/packaging/troubleshooting-packaging",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/troubleshooting-packaging.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Troubleshooting for Packagers",summary:"Common packaging issues and how to fix them"},sidebar:"packagingSidebar",previous:{title:"Translation instructions",permalink:"/docs/packaging/translation-instructions"},next:{title:"Your First Package Update",permalink:"/docs/packaging/your-first-package-update"}},r={},l=[{value:"Asking for help",id:"asking-for-help",level:2},{value:"Common Issues",id:"common-issues",level:2},{value:""Error downloading https://github.com/project/blah/1.2.3.tar.gz: checksum mismatch"",id:"error-downloading-httpsgithubcomprojectblah123targz-checksum-mismatch",level:3},{value:""Failed to build packages err="Failed to fetch source https://github.com/project/blah.git#{commit ref here}, reason: exit status 1\\n"",id:"failed-to-build-packages-errfailed-to-fetch-source-httpsgithubcomprojectblahgitcommit-ref-here-reason-exit-status-1n",level:3},{value:""mount: /var/lib/solbuild/roots/unstable-x86_64: WARNING: source write-protected, mounted read-only"",id:"mount-varlibsolbuildrootsunstable-x86_64-warning-source-write-protected-mounted-read-only",level:3},{value:"Solbuild is eating up all my disk space",id:"solbuild-is-eating-up-all-my-disk-space",level:3},{value:"An old package using %configure doesn't build",id:"an-old-package-using-configure-doesnt-build",level:3},{value:"Something is wrong with my solbuild profile",id:"something-is-wrong-with-my-solbuild-profile",level:3},{value:"Git commands fail and complain about package checks",id:"git-commands-fail-and-complain-about-package-checks",level:3}];function d(e){const o={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"troubleshooting-for-packagers",children:"Troubleshooting for Packagers"})}),"\n",(0,i.jsx)(o.p,{children:"This page covers common packaging issues and how to fix them. We also show you how to share your packaging work so you can ask for help in the Solus Matrix rooms."}),"\n",(0,i.jsx)(o.h2,{id:"asking-for-help",children:"Asking for help"}),"\n",(0,i.jsxs)(o.p,{children:["When you run into a problem that you don't know how to fix you should ask for help in the ",(0,i.jsx)(o.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Solus Packaging Matrix room"}),". But first you should send the ",(0,i.jsx)(o.code,{children:"package.yml"})," file and ",(0,i.jsx)(o.code,{children:"solbuild"})," output to somewhere others can see it; we recommend you use ",(0,i.jsx)(o.a,{href:"https://gist.github.com/",children:"GitHub Gists"}),". These commands assume you have set up ",(0,i.jsx)(o.code,{children:"github-cli"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["If you would rather not use Gists, use a pastebin site like ",(0,i.jsx)(o.a,{href:"https://bpa.st/",children:"bpaste"})]}),"\n",(0,i.jsxs)(o.p,{children:["Send the ",(0,i.jsx)(o.code,{children:"package.yml"})," file in the current directory to a public Gist:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"cat package.yml | gh gist create --public\n"})}),"\n",(0,i.jsxs)(o.p,{children:["Send the output of ",(0,i.jsx)(o.code,{children:"solbuild"})," to a public Gist:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task |& gh gist create --public\n"})}),"\n",(0,i.jsx)(o.p,{children:(0,i.jsxs)(o.em,{children:["Note: the usual ",(0,i.jsx)(o.code,{children:"solbuild"})," output will not be shown when this command is running, and it will take at least a few seconds"]})}),"\n",(0,i.jsxs)(o.p,{children:["Send the output of ",(0,i.jsx)(o.code,{children:"solbuild"})," to a new ",(0,i.jsx)(o.code,{children:"output.txt"})," file:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task |& tee output.txt\n"})}),"\n",(0,i.jsx)(o.h2,{id:"common-issues",children:"Common Issues"}),"\n",(0,i.jsxs)(o.h3,{id:"error-downloading-httpsgithubcomprojectblah123targz-checksum-mismatch",children:['"Error downloading ',(0,i.jsx)(o.a,{href:"https://github.com/project/blah/1.2.3.tar.gz",children:"https://github.com/project/blah/1.2.3.tar.gz"}),': checksum mismatch"']}),"\n",(0,i.jsxs)(o.p,{children:["Your ",(0,i.jsx)(o.code,{children:"source"})," tarball does not match the checksum next to it in ",(0,i.jsx)(o.code,{children:"package.yml"}),". You should use ",(0,i.jsx)(o.code,{children:"go-task new"})," or ",(0,i.jsx)(o.code,{children:"go-task update"})," to write the correct checksum automatically."]}),"\n",(0,i.jsxs)(o.h3,{id:"failed-to-build-packages-errfailed-to-fetch-source-httpsgithubcomprojectblahgitcommit-ref-here-reason-exit-status-1n",children:['"Failed to build packages err="Failed to fetch source ',(0,i.jsx)(o.a,{href:"https://github.com/project/blah.git#%7Bcommit",children:"https://github.com/project/blah.git#{commit"}),' ref here}, reason: exit status 1\\n"']}),"\n",(0,i.jsxs)(o.p,{children:["If your build fails immediately this message, and you are using a ",(0,i.jsx)(o.strong,{children:"git source"}),", you should clear the ",(0,i.jsx)(o.code,{children:"solbuild"})," git sources cache:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo rm -rf /var/lib/solbuild/sources/git\n"})}),"\n",(0,i.jsx)(o.h3,{id:"mount-varlibsolbuildrootsunstable-x86_64-warning-source-write-protected-mounted-read-only",children:'"mount: /var/lib/solbuild/roots/unstable-x86_64: WARNING: source write-protected, mounted read-only"'}),"\n",(0,i.jsxs)(o.p,{children:["If you interrupt a build sometimes ",(0,i.jsx)(o.code,{children:"solbuild"})," does not unmount cleanly, and you will need to unmount manually:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo umount -f /var/lib/solbuild/roots/unstable-x86_64\n"})}),"\n",(0,i.jsx)(o.h3,{id:"solbuild-is-eating-up-all-my-disk-space",children:"Solbuild is eating up all my disk space"}),"\n",(0,i.jsxs)(o.p,{children:["The ",(0,i.jsx)(o.code,{children:"solbuild"})," cache at ",(0,i.jsx)(o.code,{children:"/var/cache/solbuild"}),' can grow to tens of gigabytes easily. Recover that disk space by running the "delete cache (',(0,i.jsx)(o.code,{children:"dc"}),')" command:']}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo solbuild dc\n"})}),"\n",(0,i.jsxs)(o.h3,{id:"an-old-package-using-configure-doesnt-build",children:["An old package using ",(0,i.jsx)(o.code,{children:"%configure"})," doesn't build"]}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Replace ",(0,i.jsx)(o.code,{children:"%configure"})," with ",(0,i.jsx)(o.code,{children:"%reconfigure"})," and try again."]}),"\n",(0,i.jsxs)(o.li,{children:["If ",(0,i.jsx)(o.code,{children:"%reconfigure"})," produces the error ",(0,i.jsx)(o.code,{children:"configure: error: unrecognized option: '--runstatedir=/run'"}),", then use the new ",(0,i.jsx)(o.code,{children:"%configure_no_runstatedir"})," macro"]}),"\n"]}),"\n",(0,i.jsx)(o.h3,{id:"something-is-wrong-with-my-solbuild-profile",children:"Something is wrong with my solbuild profile"}),"\n",(0,i.jsxs)(o.p,{children:["Try running ",(0,i.jsx)(o.code,{children:"go-task solbuild-reset"}),". This will delete the solbuild cache and profile, then download and initialize a fresh copy of the default unstable profile."]}),"\n",(0,i.jsx)(o.h3,{id:"git-commands-fail-and-complain-about-package-checks",children:"Git commands fail and complain about package checks"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"git commit --amend\nWRN packages/q/qqwing/package.yml:1: Package release is not incremented by 1\nERR packages/q/qqwing/pspec_x86_64.xml:1: Package release is not incremented by 1\nPackage checks failed: /home/user/solus-packages/common/CI/package_checks.py packages/q/qqwing/package.yml packages/q/qqwing/pspec_x86_64.xml\n"})}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Solus uses pre-commit hooks to check for simple errors. Right now, certain ",(0,i.jsx)(o.code,{children:"git"})," commands can fail, particularly ",(0,i.jsx)(o.code,{children:"git commit --amend"})," and ",(0,i.jsx)(o.code,{children:"git commit --fixup"})]}),"\n",(0,i.jsxs)(o.li,{children:["You can bypass the pre-commit hooks by adding the ",(0,i.jsx)(o.code,{children:"no-verify"})," option, for example: ",(0,i.jsx)(o.code,{children:"git commit --amend --no-verify"}),". Checks will still be run by GitHub after a Pull Request is created."]}),"\n"]})]})}function u(e={}){const{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,o,s)=>{s.d(o,{Z:()=>c,a:()=>a});var i=s(67294);const n={},t=i.createContext(n);function a(e){const o=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),i.createElement(t.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4796],{31386:(e,o,s)=>{s.r(o),s.d(o,{assets:()=>r,contentTitle:()=>a,default:()=>u,frontMatter:()=>t,metadata:()=>c,toc:()=>l});var i=s(85893),n=s(11151);const t={title:"Troubleshooting for Packagers",summary:"Common packaging issues and how to fix them"},a="Troubleshooting for Packagers",c={id:"packaging/troubleshooting-packaging",title:"Troubleshooting for Packagers",description:"This page covers common packaging issues and how to fix them. We also show you how to share your packaging work so you can ask for help in the Solus Matrix rooms.",source:"@site/docs/packaging/troubleshooting-packaging.md",sourceDirName:"packaging",slug:"/packaging/troubleshooting-packaging",permalink:"/docs/packaging/troubleshooting-packaging",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/troubleshooting-packaging.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Troubleshooting for Packagers",summary:"Common packaging issues and how to fix them"},sidebar:"packagingSidebar",previous:{title:"Translation instructions",permalink:"/docs/packaging/translation-instructions"},next:{title:"Your First Package Update",permalink:"/docs/packaging/your-first-package-update"}},r={},l=[{value:"Asking for help",id:"asking-for-help",level:2},{value:"Common Issues",id:"common-issues",level:2},{value:""Error downloading https://github.com/project/blah/1.2.3.tar.gz: checksum mismatch"",id:"error-downloading-httpsgithubcomprojectblah123targz-checksum-mismatch",level:3},{value:""Failed to build packages err="Failed to fetch source https://github.com/project/blah.git#{commit ref here}, reason: exit status 1\\n"",id:"failed-to-build-packages-errfailed-to-fetch-source-httpsgithubcomprojectblahgitcommit-ref-here-reason-exit-status-1n",level:3},{value:""mount: /var/lib/solbuild/roots/unstable-x86_64: WARNING: source write-protected, mounted read-only"",id:"mount-varlibsolbuildrootsunstable-x86_64-warning-source-write-protected-mounted-read-only",level:3},{value:"Solbuild is eating up all my disk space",id:"solbuild-is-eating-up-all-my-disk-space",level:3},{value:"An old package using %configure doesn't build",id:"an-old-package-using-configure-doesnt-build",level:3},{value:"Something is wrong with my solbuild profile",id:"something-is-wrong-with-my-solbuild-profile",level:3},{value:"Git commands fail and complain about package checks",id:"git-commands-fail-and-complain-about-package-checks",level:3}];function d(e){const o={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"troubleshooting-for-packagers",children:"Troubleshooting for Packagers"})}),"\n",(0,i.jsx)(o.p,{children:"This page covers common packaging issues and how to fix them. We also show you how to share your packaging work so you can ask for help in the Solus Matrix rooms."}),"\n",(0,i.jsx)(o.h2,{id:"asking-for-help",children:"Asking for help"}),"\n",(0,i.jsxs)(o.p,{children:["When you run into a problem that you don't know how to fix you should ask for help in the ",(0,i.jsx)(o.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Solus Packaging Matrix room"}),". But first you should send the ",(0,i.jsx)(o.code,{children:"package.yml"})," file and ",(0,i.jsx)(o.code,{children:"solbuild"})," output to somewhere others can see it; we recommend you use ",(0,i.jsx)(o.a,{href:"https://gist.github.com/",children:"GitHub Gists"}),". These commands assume you have set up ",(0,i.jsx)(o.code,{children:"github-cli"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["If you would rather not use Gists, use a pastebin site like ",(0,i.jsx)(o.a,{href:"https://bpa.st/",children:"bpaste"})]}),"\n",(0,i.jsxs)(o.p,{children:["Send the ",(0,i.jsx)(o.code,{children:"package.yml"})," file in the current directory to a public Gist:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"cat package.yml | gh gist create --public\n"})}),"\n",(0,i.jsxs)(o.p,{children:["Send the output of ",(0,i.jsx)(o.code,{children:"solbuild"})," to a public Gist:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task |& gh gist create --public\n"})}),"\n",(0,i.jsx)(o.p,{children:(0,i.jsxs)(o.em,{children:["Note: the usual ",(0,i.jsx)(o.code,{children:"solbuild"})," output will not be shown when this command is running, and it will take at least a few seconds"]})}),"\n",(0,i.jsxs)(o.p,{children:["Send the output of ",(0,i.jsx)(o.code,{children:"solbuild"})," to a new ",(0,i.jsx)(o.code,{children:"output.txt"})," file:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task |& tee output.txt\n"})}),"\n",(0,i.jsx)(o.h2,{id:"common-issues",children:"Common Issues"}),"\n",(0,i.jsxs)(o.h3,{id:"error-downloading-httpsgithubcomprojectblah123targz-checksum-mismatch",children:['"Error downloading ',(0,i.jsx)(o.a,{href:"https://github.com/project/blah/1.2.3.tar.gz",children:"https://github.com/project/blah/1.2.3.tar.gz"}),': checksum mismatch"']}),"\n",(0,i.jsxs)(o.p,{children:["Your ",(0,i.jsx)(o.code,{children:"source"})," tarball does not match the checksum next to it in ",(0,i.jsx)(o.code,{children:"package.yml"}),". You should use ",(0,i.jsx)(o.code,{children:"go-task new"})," or ",(0,i.jsx)(o.code,{children:"go-task update"})," to write the correct checksum automatically."]}),"\n",(0,i.jsxs)(o.h3,{id:"failed-to-build-packages-errfailed-to-fetch-source-httpsgithubcomprojectblahgitcommit-ref-here-reason-exit-status-1n",children:['"Failed to build packages err="Failed to fetch source ',(0,i.jsx)(o.a,{href:"https://github.com/project/blah.git#%7Bcommit",children:"https://github.com/project/blah.git#{commit"}),' ref here}, reason: exit status 1\\n"']}),"\n",(0,i.jsxs)(o.p,{children:["If your build fails immediately this message, and you are using a ",(0,i.jsx)(o.strong,{children:"git source"}),", you should clear the ",(0,i.jsx)(o.code,{children:"solbuild"})," git sources cache:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo rm -rf /var/lib/solbuild/sources/git\n"})}),"\n",(0,i.jsx)(o.h3,{id:"mount-varlibsolbuildrootsunstable-x86_64-warning-source-write-protected-mounted-read-only",children:'"mount: /var/lib/solbuild/roots/unstable-x86_64: WARNING: source write-protected, mounted read-only"'}),"\n",(0,i.jsxs)(o.p,{children:["If you interrupt a build sometimes ",(0,i.jsx)(o.code,{children:"solbuild"})," does not unmount cleanly, and you will need to unmount manually:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo umount -f /var/lib/solbuild/roots/unstable-x86_64\n"})}),"\n",(0,i.jsx)(o.h3,{id:"solbuild-is-eating-up-all-my-disk-space",children:"Solbuild is eating up all my disk space"}),"\n",(0,i.jsxs)(o.p,{children:["The ",(0,i.jsx)(o.code,{children:"solbuild"})," cache at ",(0,i.jsx)(o.code,{children:"/var/cache/solbuild"}),' can grow to tens of gigabytes easily. Recover that disk space by running the "delete cache (',(0,i.jsx)(o.code,{children:"dc"}),')" command:']}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo solbuild dc\n"})}),"\n",(0,i.jsxs)(o.h3,{id:"an-old-package-using-configure-doesnt-build",children:["An old package using ",(0,i.jsx)(o.code,{children:"%configure"})," doesn't build"]}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Replace ",(0,i.jsx)(o.code,{children:"%configure"})," with ",(0,i.jsx)(o.code,{children:"%reconfigure"})," and try again."]}),"\n",(0,i.jsxs)(o.li,{children:["If ",(0,i.jsx)(o.code,{children:"%reconfigure"})," produces the error ",(0,i.jsx)(o.code,{children:"configure: error: unrecognized option: '--runstatedir=/run'"}),", then use the new ",(0,i.jsx)(o.code,{children:"%configure_no_runstatedir"})," macro"]}),"\n"]}),"\n",(0,i.jsx)(o.h3,{id:"something-is-wrong-with-my-solbuild-profile",children:"Something is wrong with my solbuild profile"}),"\n",(0,i.jsxs)(o.p,{children:["Try running ",(0,i.jsx)(o.code,{children:"go-task solbuild-reset"}),". This will delete the solbuild cache and profile, then download and initialize a fresh copy of the default unstable profile."]}),"\n",(0,i.jsx)(o.h3,{id:"git-commands-fail-and-complain-about-package-checks",children:"Git commands fail and complain about package checks"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"git commit --amend\nWRN packages/q/qqwing/package.yml:1: Package release is not incremented by 1\nERR packages/q/qqwing/pspec_x86_64.xml:1: Package release is not incremented by 1\nPackage checks failed: /home/user/solus-packages/common/CI/package_checks.py packages/q/qqwing/package.yml packages/q/qqwing/pspec_x86_64.xml\n"})}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Solus uses pre-commit hooks to check for simple errors. Right now, certain ",(0,i.jsx)(o.code,{children:"git"})," commands can fail, particularly ",(0,i.jsx)(o.code,{children:"git commit --amend"})," and ",(0,i.jsx)(o.code,{children:"git commit --fixup"})]}),"\n",(0,i.jsxs)(o.li,{children:["You can bypass the pre-commit hooks by adding the ",(0,i.jsx)(o.code,{children:"no-verify"})," option, for example: ",(0,i.jsx)(o.code,{children:"git commit --amend --no-verify"}),". Checks will still be run by GitHub after a Pull Request is created."]}),"\n"]})]})}function u(e={}){const{wrapper:o}={...(0,n.a)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,o,s)=>{s.d(o,{Z:()=>c,a:()=>a});var i=s(67294);const n={},t=i.createContext(n);function a(e){const o=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),i.createElement(t.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/72054e31.251cbe36.js b/assets/js/72054e31.251cbe36.js deleted file mode 100644 index 095e101c4..000000000 --- a/assets/js/72054e31.251cbe36.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7135],{83888:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>r,default:()=>h,frontMatter:()=>l,metadata:()=>a,toc:()=>d});var s=n(85893),t=n(11151);const l={title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",slug:"solus-optimizing-packages",authors:"joey",tags:["pgo","lto","solus","packaging","optimization",3,"clang","gnu","llvm","glibc","hwcaps","x86_64-v3"],hide_table_of_contents:!1},r="Cual es la causa",a={permalink:"/blog/solus-optimizing-packages",source:"@site/devlog/2024-02-09-Intro-to-optimizing-packages-on-solus.md",title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",date:"2024-02-09T00:00:00.000Z",tags:[{inline:!0,label:"pgo",permalink:"/blog/tags/pgo"},{inline:!0,label:"lto",permalink:"/blog/tags/lto"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"},{inline:!0,label:"packaging",permalink:"/blog/tags/packaging"},{inline:!0,label:"optimization",permalink:"/blog/tags/optimization"},{inline:!0,label:"3",permalink:"/blog/tags/3"},{inline:!0,label:"clang",permalink:"/blog/tags/clang"},{inline:!0,label:"gnu",permalink:"/blog/tags/gnu"},{inline:!0,label:"llvm",permalink:"/blog/tags/llvm"},{inline:!0,label:"glibc",permalink:"/blog/tags/glibc"},{inline:!0,label:"hwcaps",permalink:"/blog/tags/hwcaps"},{inline:!0,label:"x86_64-v3",permalink:"/blog/tags/x-86-64-v-3"}],readingTime:22.32,hasTruncateMarker:!0,authors:[{name:"Joey Riches",title:"Solus Staff",page:{permalink:"/blog/authors/joey"},socials:{github:"https://github.com/joebonrichie"},imageURL:"https://avatars.githubusercontent.com/u/5338090?s=400&u=f77ed45c7e83814ce3e8bd199fc293bd5b53682b&v=4",key:"joey"}],frontMatter:{title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",slug:"solus-optimizing-packages",authors:"joey",tags:["pgo","lto","solus","packaging","optimization","3","clang","gnu","llvm","glibc","hwcaps","x86_64-v3"],hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"Don't call me MATE, pal!",permalink:"/blog/don't-call-me-mate-pal"}},o={authorsImageUrls:[void 0]},d=[{value:"Let's Start Obvious",id:"lets-start-obvious",level:2},{value:"PGO is great, except, when it isn't.",id:"pgo-is-great-except-when-it-isnt",level:2},{value:"256 Vector Units go brrrrrr...",id:"256-vector-units-go-brrrrrr",level:2},{value:"Something about perf to the rescue",id:"something-about-perf-to-the-rescue",level:2},{value:"Choosing Wisely",id:"choosing-wisely",level:2},{value:"Adjusting the Benchmark",id:"adjusting-the-benchmark",level:2},{value:"Partial Profiling",id:"partial-profiling",level:3},{value:"I Zee a Purty lil' Package",id:"i-zee-a-purty-lil-package",level:2},{value:"Squeezing more from zlib-ng",id:"squeezing-more-from-zlib-ng",level:2}];function c(e){const i={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(i.p,{children:["We'll explore how to build packages with advanced compiler techniques in order to squeeze more performance out of the box for packages in Solus. We'll be using the story of how ",(0,s.jsx)(i.code,{children:"libwebp"})," was optimized for and how it led to an unexpected side quest."]}),"\n",(0,s.jsx)(i.p,{children:"Linux distributions have a lot of control over how a source-based package gets compiled and shipped to users as part of a binary repository. Aggressive and advanced compiler optimization techniques, as well as other methods can be used to provide greater out of the box performance for end users. This can greatly benefit users running on older hardware to provide a snappier end-user experience; reducing time waiting on a heavy workload to finish; or even improved battery life; amongst other improvements."}),"\n",(0,s.jsxs)(i.p,{children:["Part of the problem is, a packager's time is limited. So how, as a distribution, do you choose to try provide faster compatible packages for an end user. A historic approach is to simply change the default compiler flags for ",(0,s.jsx)(i.em,{children:"all"})," packages, such as enabling ",(0,s.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/Interprocedural_optimization",children:"LTO"})," by default. Whilst this approach can work well, at Solus the philosophy is slightly different where a packager can trivially enable several advanced compiler optimization techniques such as ",(0,s.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/Profile-guided_optimization",children:"PGO"})," without too much faffing around on a ",(0,s.jsx)(i.em,{children:"targeted"})," package."]}),"\n",(0,s.jsx)(i.p,{children:"The benefits of such an approach are:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Can target the performance of a specific package to benefit ",(0,s.jsx)(i.em,{children:"all"})," users"]}),"\n",(0,s.jsx)(i.li,{children:"A compiler optimization may improve one package, but may not apply globally to all packages."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"The downsides are such:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Requires additional packager time to benchmark and experiment with different optimization strategies."}),"\n",(0,s.jsxs)(i.li,{children:["Requires the packager to ",(0,s.jsx)(i.em,{children:"choose"})," and invest time into improving performance of a package."]}),"\n",(0,s.jsx)(i.li,{children:"Requires the packager to find an appropriate benchmark to test the package against."}),"\n",(0,s.jsx)(i.li,{children:"Experimenting with compiler optimizations may not bear fruit: no meaningful improvement in performance, or there may be some other bottleneck."}),"\n"]}),"\n",(0,s.jsx)(i.h1,{id:"optimization-techniques-available",children:"Optimization Techniques Available"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["speed:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["As simple as it gets really, build a package with ",(0,s.jsx)(i.code,{children:"-O3"})," instead of ",(0,s.jsx)(i.code,{children:"-O2"})," as well as any other flags deemed worthy to be included as part of the ",(0,s.jsx)(i.code,{children:"speed"})," flags. The main drawback of this is that ",(0,s.jsx)(i.code,{children:"-O3"})," is not guaranteed to produce faster results than building with ",(0,s.jsx)(i.code,{children:"-O2"})," and typically will produce bigger binaries. The days of ",(0,s.jsx)(i.code,{children:"-O3"})," outright breaking your program in weird unexpected ways is largely behind us."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["LTO:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Compared to some other distributions ",(0,s.jsx)(i.code,{children:"-flto"})," is not yet enabled by default on Solus. LTO is almost guaranteed to provide a %1 or slightly larger performance improvement as well as a smaller binary at the cost of increased compiling times and memory usage during build. When combined with other optimization techniques such as PGO the LTO optimization can really stretch its legs and provide even greater uplift!"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["Clang:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Not strictly an optimization, but, building a package with ",(0,s.jsx)(i.code,{children:"clang"})," instead of ",(0,s.jsx)(i.code,{children:"gcc"})," and ",(0,s.jsx)(i.code,{children:"ld.ldd"})," to link instead of the infamous ",(0,s.jsx)(i.code,{children:"ld.bfd"})," may provide a faster package out of the box. You'll have to be careful of subtle ABI differences if building with ",(0,s.jsx)(i.code,{children:"clang"}),". If in doubt, and, ",(0,s.jsx)(i.code,{children:"clang"})," is the obvious choice, perform safety rebuilds on all reverse dependencies of the package."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["PGO:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Profile guided optimization. Build once with instrumentation in order to collect profile data when ran. Run the program using a representative workload in order to collect profiling data. Build the program again with the profiling data provided in order to build an optimized variant."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["BOLT:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:['Binary optimization and layout tool. You can think of this as "post-link PGO" where you instrument a binary with ',(0,s.jsx)(i.code,{children:"bolt"})," to collect profiling data. Run that binary. Then finally reorganize the binary layout using the collected profile data. This generally works better on large statically linked binaries but smaller binaries or libraries such as found in a typical package can benefit too. This optimization is still quite new."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Regardless, that's enough word spaghetti, let's look at the process to actually optimize a package."}),"\n",(0,s.jsx)(i.h1,{id:"optimizing-a-package",children:"Optimizing a Package"}),"\n",(0,s.jsxs)(i.p,{children:["Right, to begin with we'll have to start on choosing an actual package to benchmark and optimize. I've heard the ",(0,s.jsx)(i.code,{children:".webp"})," file format is becoming increasingly common on the web, slowly replacing ",(0,s.jsx)(i.code,{children:".png"})," and ",(0,s.jsx)(i.code,{children:".jpg"})," file formats due to the strong backing of Google (for better or for worst). An improvement in decoding time for ",(0,s.jsx)(i.code,{children:".webp"})," files would benefit any user using a web browser casually browsing the web."]}),"\n",(0,s.jsxs)(i.p,{children:["Let's have a look at the ",(0,s.jsx)(i.code,{children:"package.yml"})," build recipe for ",(0,s.jsx)(i.code,{children:"libwebp"}),"."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:"name : libwebp\nversion : 1.3.2\nrelease : 25\nsource :\n - https://github.com/webmproject/libwebp/archive/refs/tags/v1.3.2.tar.gz : c2c2f521fa468e3c5949ab698c2da410f5dce1c5e99f5ad9e70e0e8446b86505\nhomepage : https://developers.google.com/speed/webp/\nlicense : BSD-3-Clause\ncomponent : multimedia.codecs\nsummary : A new image format for the web\ndescription: |\n WebP is a new image format that provides lossless and lossy compression for images on the web. WebP lossless images are 26% smaller in size compared to PNGs. WebP lossy images are 25-34% smaller in size compared to JPEG images at equivalent SSIM index. WebP supports lossless transparency (also known as alpha channel) with just 22% additional bytes. Transparency is also supported with lossy compression and typically provides 3x smaller file sizes compared to PNG when lossy compression is acceptable for the red/green/blue color channels.\nemul32 : yes\npatterns :\n - devel : /usr/share/man\nbuilddeps :\n - pkgconfig32(glu)\n - pkgconfig32(glut)\n - pkgconfig32(libpng)\n - pkgconfig32(libtiff-4)\n - pkgconfig32(libturbojpeg)\n - pkgconfig32(zlib)\n - giflib-devel\nsetup : |\n %reconfigure --disable-static --enable-everything\nbuild : |\n %make\ninstall : |\n %make_install\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Okay, looks to be a quite simple affair. A simple configure, make, make install as well as ",(0,s.jsx)(i.code,{children:"emul32"})," being enabled specifying the -32bit packages are also provided from this recipe. Next step is to look for a repeatable and easy way to benchmark it. We'll begin by looking at the ",(0,s.jsx)(i.code,{children:"pspec_x86_64.xml"})," file which lists all the files produced from the ",(0,s.jsx)(i.code,{children:"package.yml"})," recipe as well as some metadata."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-xml",children:' libwebp\n A new image format for the web\n WebP is a new image format that provides lossless and lossy compression for images on the web. WebP lossless images are 26% smaller in size compared to PNGs. WebP lossy images are 25-34% smaller in size compared to JPEG images at equivalent SSIM index. WebP supports lossless transparency (also known as alpha channel) with just 22% additional bytes. Transparency is also supported with lossy compression and typically provides 3x smaller file sizes compared to PNG when lossy compression is acceptable for the red/green/blue color channels.\n\n multimedia.codecs\n \n /usr/bin/cwebp\n /usr/bin/dwebp\n /usr/bin/gif2webp\n /usr/bin/img2webp\n /usr/bin/vwebp\n /usr/bin/webpinfo\n /usr/bin/webpmux\n'})}),"\n",(0,s.jsxs)(i.p,{children:["Perfect, we have ",(0,s.jsx)(i.code,{children:"dwebp"})," and ",(0,s.jsx)(i.code,{children:"cwebp"})," binaries available in the main package, which from a guess can be used to decode and encode ",(0,s.jsx)(i.code,{children:".webp"})," files. Let's try it out."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:"$ dwebp -h\nUsage: dwebp in_file [options] [-o out_file]\n\nDecodes the WebP image file to PNG format [Default].\nNote: Animated WebP files are not supported.\n$ cwebp -h\nUsage:\n\n cwebp [options] -q quality input.png -o output.webp\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Awesome, these binaries do exactly what we need to benchmark ",(0,s.jsx)(i.code,{children:"libwebp"}),", but, we are also indirectly testing ",(0,s.jsx)(i.code,{children:"libpng"})," as well for this benchmark, we'll have to keep an eye out for that."]}),"\n",(0,s.jsxs)(i.p,{children:["One extra step we have to do is ensure these binaries are actually linking against their own library, as upstream developers can have a habit of making sure their binaries don't link against their own libraries and end up being self-contained. Run ",(0,s.jsx)(i.code,{children:"ldd"})," to verify."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:"$ ldd /usr/bin/dwebp\n\tlinux-vdso.so.1 (0x00007ffed8733000)\n\tlibwebpdemux.so.2 => /usr/lib/libwebpdemux.so.2.0.14 (0x00007f7473bb4000)\n\tlibwebp.so.7 => /usr/lib/libwebp.so.7.1.8 (0x00007f7473ae2000)\n\tlibpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007f7473aa6000)\n\tlibc.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libc.so.6 (0x00007f74738a9000)\n\tlibsharpyuv.so.0 => /usr/lib/libsharpyuv.so.0.0.1 (0x00007f747389e000)\n\tlibm.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libm.so.6 (0x00007f74737b8000)\n\tlibz.so.1 => /usr/lib/libz.so.1.3.0 (0x00007f7473200000)\n\t/usr/lib64/ld-linux-x86-64.so.2 (0x00007f7473bea000)\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Awesome in this case both ",(0,s.jsx)(i.code,{children:"dwebp"})," and ",(0,s.jsx)(i.code,{children:"cwebp"})," link against ",(0,s.jsx)(i.code,{children:"libwebp.so"})," so we can be confident that any performance improvements will be applicable to all packages in the repository linking against ",(0,s.jsx)(i.code,{children:"libwebp"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["Let's grab a couple of ",(0,s.jsx)(i.code,{children:".webp"})," files from ",(0,s.jsx)(i.a,{href:"https://developers.google.com/speed/webp/gallery1",children:"here"})," to test with. We'll just use the largest image size available in this case to reduce noise as much as possible when running benchmarks as well as allow any potential optimizations to stretch their legs a little more."]}),"\n",(0,s.jsxs)(i.p,{children:["Now having done the prep work, lets actually benchmark the damn thing using ",(0,s.jsx)(i.code,{children:"hyperfine"})," for the time being."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:'$ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03c3): 202.2 ms \xb1 0.3 ms [User: 198.9 ms, System: 3.0 ms]\n Range (min \u2026 max): 201.8 ms \u2026 202.7 ms 14 runs\n$ hyperfine "cwebp ~/PNG_Test.png -o /dev/null"\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\n Time (mean \xb1 \u03c3): 1.423 s \xb1 0.009 s [User: 1.346 s, System: 0.076 s]\n Range (min \u2026 max): 1.410 s \u2026 1.435 s 10 runs\n'})}),"\n",(0,s.jsx)(i.p,{children:"There, we have our a basic baseline for encode and decode performance. We mostly care about decode performance here but improved encoding performance would also not go amiss."}),"\n",(0,s.jsx)(i.h2,{id:"lets-start-obvious",children:"Let's Start Obvious"}),"\n",(0,s.jsxs)(i.p,{children:["Let's start basic, enabling the ",(0,s.jsx)(i.code,{children:"speed"})," optimization which basically builds with ",(0,s.jsx)(i.code,{children:"-O3"})," instead of ",(0,s.jsx)(i.code,{children:"-O2"})," as well as any other flags that are deemed to be worthy to be part of the ",(0,s.jsx)(i.code,{children:"speed"})," group. As well as, the ",(0,s.jsx)(i.code,{children:"lto"})," optimization which builds with link time optimization allowing for inter-procedural optimizations to take place."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:"optimize:\n - speed\n - lto\n"})}),"\n",(0,s.jsx)(i.p,{children:"Moment of truth..."}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:'$ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03c3): 200.0 ms \xb1 1.5 ms [User: 197.3 ms, System: 2.5 ms]\n Range (min \u2026 max): 198.1 ms \u2026 203.2 ms 15 runs\n$ hyperfine "cwebp ~/PNG_Test.png -o /dev/null"\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\n Time (mean \xb1 \u03c3): 1.353 s \xb1 0.012 s [User: 1.281 s, System: 0.071 s]\n Range (min \u2026 max): 1.336 s \u2026 1.369 s 10 runs\n'})}),"\n",(0,s.jsx)(i.p,{children:"Well okay, we got a very minor uplift in decoding performance and a slightly higher improvement in encoding performance, but nothing too much to write home about. Luckily we have several more optimizations to explore..."}),"\n",(0,s.jsx)(i.h2,{id:"pgo-is-great-except-when-it-isnt",children:"PGO is great, except, when it isn't."}),"\n",(0,s.jsxs)(i.p,{children:["Next step is to explore PGO (Profile Guided Optimization). For our ",(0,s.jsx)(i.code,{children:"libwebp"})," package, looks like we already hit a bit of a snafu. There's no test suite included in the tarball! That's a bit of a disappointment as a test suite such as ",(0,s.jsx)(i.code,{children:"make check"})," is by far and away the easiest and most comprehensive workload that can be used for profiling as part of PGO, especially for smaller libraries. However, we can still experiment with the just built ",(0,s.jsx)(i.code,{children:"dwebp"})," and ",(0,s.jsx)(i.code,{children:"cwebp"})," binaries as a suitable workload for PGO."]}),"\n",(0,s.jsx)(i.p,{children:"Luckily, as part of the package.yml format all you have to do is provide a profile for automatic PGO. After chrooting into the build environment and fiddling around a bit we end up with:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:"profile : |\n ./examples/dwebp webp_js/test_webp_js.webp -o test_png.png\n ./examples/cwebp test_png.png -o /dev/null\n"})}),"\n",(0,s.jsx)(i.p,{children:"After specifying that, 6 builds will now be performed instead of 2:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["emul32:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Instrumented build"}),"\n",(0,s.jsx)(i.li,{children:"Run profiling workload"}),"\n",(0,s.jsx)(i.li,{children:"Optimized build using profiling data"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["x86_64:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Instrumented build"}),"\n",(0,s.jsx)(i.li,{children:"Run profiling workload"}),"\n",(0,s.jsx)(i.li,{children:"Optimized build using profiling data"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"For this relatively small package it increases the build time from 1m1.672s to 1m42.199s"}),"\n",(0,s.jsx)(i.p,{children:"The next moment of truth..."}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:'$ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03c3): 204.1 ms \xb1 2.2 ms [User: 201.3 ms, System: 2.7 ms]\n Range (min \u2026 max): 201.6 ms \u2026 207.1 ms 14 runs\n$ hyperfine "cwebp ~/PNG_Test.png -o /dev/null"\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\n Time (mean \xb1 \u03c3): 1.349 s \xb1 0.010 s [User: 1.266 s, System: 0.082 s]\n Range (min \u2026 max): 1.335 s \u2026 1.374 s 10 runs\n'})}),"\n",(0,s.jsxs)(i.p,{children:["Well... That's interesting. We actually regress in performance for decode performance whilst gaining another small bump in encoding performance. Worse still, we get a bunch of ",(0,s.jsx)(i.code,{children:"profile count data file not found [-Wmissing-profile]"})," warning messages during the optimized build indicating to us our profiling workload isn't comprehensive enough and doesn't cover enough code paths. The lack of a handy ",(0,s.jsx)(i.code,{children:"make check"})," that could be used as a profiling workload is really hurting us here. For now, let's put a pin in exploring PGO, it isn't a dead end but more work needs to be done curating a more comprehensive workload to chuck at it in this particular case, whilst other, easier, optimization techniques are still available to us."]}),"\n",(0,s.jsx)(i.h2,{id:"256-vector-units-go-brrrrrr",children:"256 Vector Units go brrrrrr..."}),"\n",(0,s.jsxs)(i.p,{children:["The next obvious step is to explore ",(0,s.jsx)(i.code,{children:"glibc"})," hardware capabilities. For those unaware both ",(0,s.jsx)(i.code,{children:"clang"})," and ",(0,s.jsx)(i.code,{children:"gnu"})," compilers provide ",(0,s.jsx)(i.code,{children:"x86_64-v2"}),", ",(0,s.jsx)(i.code,{children:"x86_64-v3"})," and ",(0,s.jsx)(i.code,{children:"x86_64-v4"})," micro-architecture build options on top of the baseline of ",(0,s.jsx)(i.code,{children:"x86_64"}),". These enable the use of targeting additional CPU instruction sets during compilation for better performance. For example, ",(0,s.jsx)(i.code,{children:"-sse4.2"})," for ",(0,s.jsx)(i.code,{children:"x86_64-v2"}),", ",(0,s.jsx)(i.code,{children:"-avx2"})," for ",(0,s.jsx)(i.code,{children:"x86_64-v3"}),", and ",(0,s.jsx)(i.code,{children:"-avx512"})," for ",(0,s.jsx)(i.code,{children:"x86_64-v4"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["Whilst that's great 'n all, if a program is built with ",(0,s.jsx)(i.code,{children:"x86_64-v3"})," and gains an additional ~10% uplift in performance, it's no good if a ",(0,s.jsx)(i.code,{children:"x86_64-v2"})," compatible cpu can't run it. Luckily the ",(0,s.jsx)(i.code,{children:"glibc"})," loader that's found on almost general purpose linux installs provides a way to load higher or lower micro-architecture libraries if they're installed and supported."]}),"\n",(0,s.jsxs)(i.p,{children:["On top of all that, the ",(0,s.jsx)(i.code,{children:"package.yml"})," format provides an incredibly simple way of providing ",(0,s.jsx)(i.code,{children:"x86_64-v3"})," built libraries by enabling the ",(0,s.jsx)(i.code,{children:"avx2 : yes"})," flag."]}),"\n",(0,s.jsxs)(i.p,{children:["With ",(0,s.jsx)(i.code,{children:"avx2 : yes"})," enabled in the ",(0,s.jsx)(i.code,{children:"libwebp"})," package three builds are performed."]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"emul32"}),"\n",(0,s.jsx)(i.li,{children:"x86_64-v3"}),"\n",(0,s.jsx)(i.li,{children:"x86_64"}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["We now see these additional files in the ",(0,s.jsx)(i.code,{children:"pspec_x86_64.xml"})," file"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-diff",children:'+ /usr/lib64/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0.0.1\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebp.so.7\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdecoder.so.3\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdecoder.so.3.1.8\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2.0.14\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpmux.so.3\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpmux.so.3.0.13\n'})}),"\n",(0,s.jsxs)(i.p,{children:["Let's rerun ",(0,s.jsx)(i.code,{children:"lld"})," on ",(0,s.jsx)(i.code,{children:"dwebp"})," after installing the new package and..."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:"$ ldd /usr/bin/dwebp\n\tlinux-vdso.so.1 (0x00007ffeab5b1000)\n\tlibwebpdemux.so.2 => /usr/lib/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2.0.14 (0x00007f9a351d5000)\n\tlibwebp.so.7 => /usr/lib/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8 (0x00007f9a3510b000)\n\tlibpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007f9a350cf000)\n\tlibc.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libc.so.6 (0x00007f9a34ed2000)\n\tlibsharpyuv.so.0 => /usr/lib/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0.0.1 (0x00007f9a34ec1000)\n\tlibm.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libm.so.6 (0x00007f9a34ddb000)\n\tlibz.so.1 => /usr/lib/glibc-hwcaps/x86-64-v3/libz.so.1.3 (0x00007f9a34dbb000)\n\t/usr/lib64/ld-linux-x86-64.so.2 (0x00007f9a3520b000)\n"})}),"\n",(0,s.jsxs)(i.p,{children:["We can crucially see that ",(0,s.jsx)(i.code,{children:"dwebp"})," is now loading the ",(0,s.jsx)(i.code,{children:"x86-64-v3"})," built ",(0,s.jsx)(i.code,{children:"libwebp.so"})," lib from ",(0,s.jsx)(i.code,{children:"/usr/lib/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8"}),", success! Let's what our performance looks like."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:'$ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03c3): 198.2 ms \xb1 1.2 ms [User: 195.4 ms, System: 2.5 ms]\n Range (min \u2026 max): 197.0 ms \u2026 200.5 ms 14 runs\n$ hyperfine "cwebp ~/PNG_Test.png -o /dev/null"\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\n Time (mean \xb1 \u03c3): 1.313 s \xb1 0.009 s [User: 1.243 s, System: 0.078 s]\n Range (min \u2026 max): 1.308 s \u2026 1.341 s 10 runs\n'})}),"\n",(0,s.jsx)(i.p,{children:"Let's recap so far:"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Optimization"}),(0,s.jsx)(i.th,{children:"Decode"}),(0,s.jsx)(i.th,{children:"Encode"}),(0,s.jsx)(i.th,{children:"Size"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Baseline"}),(0,s.jsx)(i.td,{children:"202.2 ms"}),(0,s.jsx)(i.td,{children:"1.399 s"}),(0,s.jsx)(i.td,{children:"1.33 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO"}),(0,s.jsx)(i.td,{children:"200.0 ms"}),(0,s.jsx)(i.td,{children:"1.353 s"}),(0,s.jsx)(i.td,{children:"1.73 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO + PGO"}),(0,s.jsxs)(i.td,{children:["204.1 ms ","\u26a0\ufe0f"]}),(0,s.jsx)(i.td,{children:"1.349 s"}),(0,s.jsx)(i.td,{children:"1.07 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO + x86_64-v3"}),(0,s.jsx)(i.td,{children:"198.2 ms"}),(0,s.jsx)(i.td,{children:"1.313 s"}),(0,s.jsx)(i.td,{children:"3.17 MB"})]})]})]}),"\n",(0,s.jsxs)(i.p,{children:["Whilst we're still getting an additional speedup it isn't really anything to write home about. A measly ~2% improvement in decoding performance and a fairly respectable ~7% improvement in encoding performance for our test case. However, increasing the package size by an extra ~2MiB from providing a bunch of extra libs in ",(0,s.jsx)(i.code,{children:"/usr/lib/glibc-hwcaps/x86-64-v3/"})," just ain't worth it. This hints that either the compiler optimizations aren't really effective here or we're being bottle-necked by something else."]}),"\n",(0,s.jsxs)(i.p,{children:["So far, we've been benchmarking fairly simply using ",(0,s.jsx)(i.code,{children:"hyperfine"}),", let's swap that out for ",(0,s.jsx)(i.code,{children:"perf"})," so we can get a callgraph."]}),"\n",(0,s.jsxs)(i.h2,{id:"something-about-perf-to-the-rescue",children:["Something about ",(0,s.jsx)(i.code,{children:"perf"})," to the rescue"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.code,{children:"perf record -o dwebp.data -- dwebp ~/3.webp -o /dev/null"})}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.code,{children:"perf record -o cwebp.data -- cwebp ~/PNG_Test.png -o /dev/null"})}),"\n",(0,s.jsxs)(i.p,{children:["Let's look at ",(0,s.jsx)(i.code,{children:"dwebp"})," first with ",(0,s.jsx)(i.code,{children:"perf report -i dwebp.data"}),"."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Perf report dwebp",src:n(58916).Z+"",width:"1254",height:"676"})}),"\n",(0,s.jsxs)(i.p,{children:["Well god damn, literally all of our time is being spent in ",(0,s.jsx)(i.code,{children:"libz.so"})," it's no wonder our compiler optimizations were hardly improving performance."]}),"\n",(0,s.jsxs)(i.p,{children:["Let's also look at the ",(0,s.jsx)(i.code,{children:"cwebp"})," report, we've generally been getting better results from it."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Perf report cwebp",src:n(85370).Z+"",width:"1254",height:"676"})}),"\n",(0,s.jsxs)(i.p,{children:["Okay, much more of our time is being spent in ",(0,s.jsx)(i.code,{children:"libwebp.so"})," itself here which helps to explain why we were seeing a better performance uplift. Still 5.68% of our time is being spent in ",(0,s.jsx)(i.code,{children:"libz"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"choosing-wisely",children:"Choosing Wisely"}),"\n",(0,s.jsxs)(i.p,{children:["You may remember early on, when I said we are also indirectly testing ",(0,s.jsx)(i.code,{children:"libpng"}),". Well... after some more digging, that's exactly what's happening here. Re-running the ",(0,s.jsx)(i.code,{children:"dwebp"})," binary it says this"]}),"\n",(0,s.jsxs)(i.blockquote,{children:["\n",(0,s.jsx)(i.p,{children:"Decodes the WebP image file to PNG format"}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["Turns out, it's more accurate to say we are ",(0,s.jsx)(i.em,{children:"directly"})," testing ",(0,s.jsx)(i.code,{children:"libpng"})," and by extension ",(0,s.jsx)(i.code,{children:"zlib"}),". It isn't ",(0,s.jsx)(i.code,{children:"libwebp"})," that's spending all of its time in ",(0,s.jsx)(i.code,{children:"libz.so"}),", it's ",(0,s.jsx)(i.code,{children:"libpng"}),"! This is exactly the reason you have to be careful about the benchmarks chosen and, ensure you understand what they're doing."]}),"\n",(0,s.jsx)(i.p,{children:"However, the good news about this little snafu is:"}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"dwebp"})," can be used to translate to another image format such as ",(0,s.jsx)(i.code,{children:".yuv"})," that'll more accurately remove the bottleneck from ",(0,s.jsx)(i.code,{children:"libz.so"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:["We now know that ",(0,s.jsx)(i.code,{children:"libpng"})," has a huge bottleneck in ",(0,s.jsx)(i.code,{children:"libz.so"})," and speeding up ",(0,s.jsx)(i.code,{children:"zlib"})," ",(0,s.jsx)(i.em,{children:"should"})," dramatically speed up ",(0,s.jsx)(i.code,{children:"libpng"})," performance."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"adjusting-the-benchmark",children:"Adjusting the Benchmark"}),"\n",(0,s.jsxs)(i.p,{children:["After reverting the ",(0,s.jsx)(i.code,{children:"libwebp"})," package to the baseline let's use our adjusted decoding benchmark."]}),"\n",(0,s.jsxs)(i.p,{children:["We'll now use ",(0,s.jsx)(i.code,{children:"dwebp ~/3.webp -yuv -o /dev/null"})," for a decoding test, let's run that with ",(0,s.jsx)(i.code,{children:"perf"})," to ensure we're exclusively testing ",(0,s.jsx)(i.code,{children:"libwebp.so"})," here."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Perf report dwebp to yuv",src:n(29503).Z+"",width:"1254",height:"676"})}),"\n",(0,s.jsxs)(i.p,{children:["Okay that's awesome, no ",(0,s.jsx)(i.code,{children:"libpng.so"})," or ",(0,s.jsx)(i.code,{children:"libz.so"})," to mess with our tests!"]}),"\n",(0,s.jsx)(i.p,{children:"Let's reapply our optimizations, keeping those which apply an uplift"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Optimization"}),(0,s.jsx)(i.th,{children:"Decode"}),(0,s.jsx)(i.th,{children:"Size"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Baseline"}),(0,s.jsx)(i.td,{children:"14.7 ms"}),(0,s.jsx)(i.td,{children:"1.33 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed"}),(0,s.jsx)(i.td,{children:"14.5 ms"}),(0,s.jsx)(i.td,{children:"1.56 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"LTO"}),(0,s.jsx)(i.td,{children:"14.6 ms"}),(0,s.jsx)(i.td,{children:"1.40 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"PGO"}),(0,s.jsxs)(i.td,{children:["18.0 ms ","\u26a0\ufe0f"]}),(0,s.jsx)(i.td,{children:"1.07 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"x86-64-v3"}),(0,s.jsx)(i.td,{children:"12.7 ms"}),(0,s.jsx)(i.td,{children:"2.35 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO + x86-64-v3"}),(0,s.jsx)(i.td,{children:"12.3 ms"}),(0,s.jsx)(i.td,{children:"3.17 MB"})]})]})]}),"\n",(0,s.jsx)(i.p,{children:"Okay, this is great, whilst we aren't getting much from speed or LTO, we are getting a big uplift from x86-64-v3 libraries and when combined with the other optimizations we're getting an uplift in performance of around ~16% at the cost of close to thrice the installed package size."}),"\n",(0,s.jsx)(i.h3,{id:"partial-profiling",children:"Partial Profiling"}),"\n",(0,s.jsxs)(i.p,{children:["Once again we see that PGO regresses performance hard, however, that smaller size is giving a good hint! We already know that the profiling workload we gave it isn't very comprehensive due to the bunch of ",(0,s.jsx)(i.code,{children:"-Wmissing-profile"})," warnings we get during the optimized build. By default, PGO will aggressively inline and apply additional optimizations to code that's part of the profiling workload while everything else will be optimized for size. The idea being, hot-path code is fast and code that doesn't matter is small. However, what happens when you can't craft a comprehensive workload, as seems to be the case here? Luckily GCC has a flag for exactly that ",(0,s.jsx)(i.code,{children:"-fprofile-partial-training"}),". GCC docs state that:"]}),"\n",(0,s.jsxs)(i.blockquote,{children:["\n",(0,s.jsx)(i.p,{children:"In some cases it is not practical to train all possible hot paths in the program. (For example, program may contain functions specific for a given hardware and training may not cover all hardware configurations program is run on.) With -fprofile-partial-training profile feedback will be ignored for all functions not executed during the train run leading them to be optimized as if they were compiled without profile feedback. This leads to better performance when train run is not representative but also leads to significantly bigger code."}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["Okay, let's try it out, all we need to do is specify in our ",(0,s.jsx)(i.code,{children:"package.yml"})," recipe."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:'environment: |\n if [[ -n ${PGO_USE_BUILD} ]]; then\n export CFLAGS="${CFLAGS} -fprofile-partial-training"\n export CXXFLAGS="${CXXFLAGS} -fprofile-partial-training"\n fi\n'})}),"\n",(0,s.jsx)(i.p,{children:"And the results:"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Optimization"}),(0,s.jsx)(i.th,{children:"Decode"}),(0,s.jsx)(i.th,{children:"Size"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO + x86-64-v3"}),(0,s.jsx)(i.td,{children:"12.3 ms"}),(0,s.jsx)(i.td,{children:"3.17 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO + x86-64-v3 + Partial PGO"}),(0,s.jsx)(i.td,{children:"12.5 ms"}),(0,s.jsx)(i.td,{children:"3.13 MB"})]})]})]}),"\n",(0,s.jsx)(i.p,{children:"Well, it was worth a try. This highlights how useless PGO can be when you don't or can't provide it a good workload. Interestingly, we don't get the size bloat that was promised, in fact, the opposite."}),"\n",(0,s.jsx)(i.h1,{id:"final-libwebp-results",children:"Final libwebp Results"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Benchmark"}),(0,s.jsx)(i.th,{children:"Time Before"}),(0,s.jsx)(i.th,{children:"Time After"}),(0,s.jsx)(i.th,{children:"Size Before"}),(0,s.jsx)(i.th,{children:"Size After"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:'"dwebp ~/3.webp -yuv -o /dev/null"'}),(0,s.jsx)(i.td,{children:"14.5 ms"}),(0,s.jsx)(i.td,{children:"12.3 ms"}),(0,s.jsx)(i.td,{children:"1.33 MB"}),(0,s.jsx)(i.td,{children:"3.17 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:'"cwebp ~/PNG_Test.png -o /dev/null"'}),(0,s.jsx)(i.td,{children:"1.399 s"}),(0,s.jsx)(i.td,{children:"1.313 s"}),(0,s.jsx)(i.td,{children:"--"}),(0,s.jsx)(i.td,{children:"--"})]})]})]}),"\n",(0,s.jsx)(i.p,{children:"In the end, we get a very healthy ~16% improvement in decoding from a .webp to .yuv file. As well as a respectable 6% improvement in encoding from a .png to .webp file. However, the increased package size is very unfortunate. It's possible to tweak the x86-64-v3 build and only ship the libs that actually improve performance in order to get the installed size back to an acceptable level."}),"\n",(0,s.jsx)(i.h1,{id:"next-generation-side-quest",children:'"Next-Generation" Side Quest'}),"\n",(0,s.jsxs)(i.p,{children:["Now, you probably remember earlier due to our unrepresentative benchmark we found out that ",(0,s.jsx)(i.code,{children:"libpng"})," is getting highly bottlenecked by ",(0,s.jsx)(i.code,{children:"libz.so"}),". This now seems like a perfect opportunity to take a look at zlib and circle-back to our original benchmark that we were using."]}),"\n",(0,s.jsxs)(i.p,{children:["Zlib is widely employed throughout the ecosystem and, as such you'd think it would be highly-optimized for performance. However, that isn't really the case. Zlib is written in an old-fashioned way of C and tries to be ",(0,s.jsx)(i.em,{children:"extremely"})," portable; supporting dozens of systems that have fallen out of common use. As such, it's hard to apply architecture specific optimizations that wouldn't break some old system or without introducing code spaghetti. There have been a couple of attempts to merge AArch64 and x86_64 optimizations into the canonical zlib library without success."]}),"\n",(0,s.jsxs)(i.p,{children:["However, there is some light in this tunnel as various forks of zlib having been popping up, applying new optimizations on top of zlib. The most promising of these looks be to ",(0,s.jsx)(i.a,{href:"https://github.com/zlib-ng/zlib-ng/",children:"zlib-ng"}),". When built in compatible mode, it promises to be API compatible with canonical zlib and ",(0,s.jsx)(i.em,{children:"tries"})," to be as ABI compatible as possible."]}),"\n",(0,s.jsxs)(i.p,{children:["Let's just go for it, replacing Solus' ",(0,s.jsx)(i.code,{children:"zlib"})," package with zlib-ng built in compatible mode. It's a bit scary due to how integral zlib is in a typical Linux install, but, how hard could it be?"]}),"\n",(0,s.jsx)(i.h2,{id:"i-zee-a-purty-lil-package",children:"I Zee a Purty lil' Package"}),"\n",(0,s.jsxs)(i.p,{children:["Well that was simple. Here's what our zlib-ng ",(0,s.jsx)(i.code,{children:"package.yml"})," recipe looks like."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:"name : zlib\nversion : 2.1.5\nrelease : 28\nsource :\n - https://github.com/zlib-ng/zlib-ng/archive/refs/tags/2.1.5.tar.gz : 3f6576971397b379d4205ae5451ff5a68edf6c103b2f03c4188ed7075fbb5f04\nhomepage : https://github.com/zlib-ng/zlib-ng\nlicense : ZLIB\ncomponent : system.base\nsummary : zlib replacement with optimizations for next generation systems.\ndescription:\n - A zlib data compression library for the next generation systems. ABI/API compatible mode.\ndevel : yes\nemul32 : yes\nsetup : |\n %cmake_ninja \\\n -DZLIB_COMPAT=ON \\\n -DWITH_GTEST=OFF \\\n -DBUILD_SHARED_LIBS=ON \\\n -DINSTALL_LIB_DIR=%libdir%\nbuild : |\n %ninja_build\ninstall : |\n %ninja_install\ncheck : |\n %ninja_check\n"})}),"\n",(0,s.jsxs)(i.p,{children:["After building it, all the files seem to be in the right place and the test suite is passing. Let's just install it overwriting our canonical ",(0,s.jsx)(i.code,{children:"zlib"})," package and hope our system doesn't die... I think the word is YOLO."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:'$ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03c3): 198.6 ms \xb1 2.3 ms [User: 194.3 ms, System: 3.6 ms]\n Range (min \u2026 max): 196.3 ms \u2026 203.3 ms 14 runs\n$ sudo eopkg it zlib-2.1.5-28-1-x86_64.eopkg\n...\n$ $ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03c3): 87.6 ms \xb1 0.7 ms [User: 84.7 ms, System: 2.6 ms]\n Range (min \u2026 max): 86.5 ms \u2026 88.7 ms 33 runs\n'})}),"\n",(0,s.jsx)(i.p,{children:"Well, hot diggity damn. Swapping out the zlib package for a more performant variant has instantly more than halved(!!) our decoding time."}),"\n",(0,s.jsxs)(i.p,{children:["We need to find a more contained ",(0,s.jsx)(i.code,{children:"libpng"})," benchmark here that removes the ",(0,s.jsx)(i.code,{children:"libwebp"})," stuff to really confirm the findings here. After some sleuthing the ",(0,s.jsx)(i.code,{children:"libpng"})," source repository has a ",(0,s.jsx)(i.a,{href:"https://github.com/glennrp/libpng/blob/libpng16/contrib/examples/pngtopng.c",children:"pngtopng.c"})," file we can compile to use the system libpng library."]}),"\n",(0,s.jsxs)(i.p,{children:["Changing the header from ",(0,s.jsx)(i.code,{children:'#include "../../png.h"'})," to ",(0,s.jsx)(i.code,{children:"#include "})," then running ",(0,s.jsx)(i.code,{children:"gcc -Ofast pngtopng.c -lpng16 -o pngtopng"})," to compile it, we have a libpng benchmark. We can reuse our test .png file from earlier. Ending up with: ",(0,s.jsx)(i.code,{children:"./pngtopng ~/PNG_Test.png /dev/null"})," for our benchmark."]}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Library"}),(0,s.jsx)(i.th,{children:"Time"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"zlib (canonical)"}),(0,s.jsx)(i.td,{children:"1.464 s"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"zlib-ng (compat)"}),(0,s.jsx)(i.td,{children:"896.6 ms"})]})]})]}),"\n",(0,s.jsxs)(i.p,{children:["Well. This is pretty much inline with our flawed ",(0,s.jsx)(i.code,{children:"dwebp"})," benchmark from earlier. Swapping out zlib almost halves ",(0,s.jsx)(i.code,{children:"libpng"})," decoding time."]}),"\n",(0,s.jsx)(i.h2,{id:"squeezing-more-from-zlib-ng",children:"Squeezing more from zlib-ng"}),"\n",(0,s.jsxs)(i.p,{children:["However, we're not done yet. We still have our compiler optimizations available to us to squeeze more performance from ",(0,s.jsx)(i.code,{children:"zlib-ng"}),"."]}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Optimization"}),(0,s.jsx)(i.th,{children:"Decode"}),(0,s.jsx)(i.th,{children:"Size"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Baseline"}),(0,s.jsx)(i.td,{children:"896.6 ms"}),(0,s.jsx)(i.td,{children:"141.00 KB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed"}),(0,s.jsx)(i.td,{children:"883.6 ms"}),(0,s.jsx)(i.td,{children:"182.00 KB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"LTO"}),(0,s.jsx)(i.td,{children:"892.7 ms"}),(0,s.jsx)(i.td,{children:"133.00 KB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"PGO"}),(0,s.jsx)(i.td,{children:"894.6 ms"}),(0,s.jsx)(i.td,{children:"141.00 KB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"x86-64-v3"}),(0,s.jsx)(i.td,{children:"892.5 ms"}),(0,s.jsx)(i.td,{children:"295.00 KB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO"}),(0,s.jsx)(i.td,{children:"882.6 ms"}),(0,s.jsx)(i.td,{children:"170.00 KB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO + PGO + x86-64-v3"}),(0,s.jsx)(i.td,{children:"882.5 ms"}),(0,s.jsx)(i.td,{children:"250.00 KB"})]})]})]}),"\n",(0,s.jsx)(i.p,{children:"It looks like in this case the simple speed + LTO optimizations is the way to go. Speed gives the majority of the speedup but LTO helps bring back down the package size again. However, it's only a 1.5% improvement from baseline for this benchmark. We can always re-benchmark it later, testing zlib performance more directly instead of via libpng. It shows how good a job the zlib-ng developers have done that it's so performant right out of the gate."}),"\n",(0,s.jsx)(i.h1,{id:"final-words",children:"Final Words"}),"\n",(0,s.jsx)(i.p,{children:"We've shown the process of how a package can be optimized in Solus, through the failings and wins here I hope some good tips and tricks were provided in avoiding common pitfalls. Additional benchmarking strategies such as BOLT or Polly optimizations were not discussed and it'll be good material for a future blog post."}),"\n",(0,s.jsx)(i.p,{children:"Some other important things such as tweaking the system for benchmarking in order to get representative and consistent results were also not discussed. This is especially important in power budget constrained systems such as laptops and worth bearing in mind."}),"\n",(0,s.jsxs)(i.p,{children:["Regardless, I hope the story of how ",(0,s.jsx)(i.code,{children:"libwebp"})," was optimized for was entertaining and some things were learnt for anyone looking to optimize packages in Solus for the future."]})]})}function h(e={}){const{wrapper:i}={...(0,t.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},85370:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/perf_report_cwebp_png-baafb78e8e4527d10a5a1ded232c2bde.webp"},58916:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/perf_report_dwebp_png-c0f9529294b3efe6743a980866abdf15.webp"},29503:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/perf_report_dwebp_yuv-36ad3f6052746d5ea55acce6cbe72b6f.webp"},11151:(e,i,n)=>{n.d(i,{Z:()=>a,a:()=>r});var s=n(67294);const t={},l=s.createContext(t);function r(e){const i=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(l.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/72054e31.855d44cc.js b/assets/js/72054e31.855d44cc.js new file mode 100644 index 000000000..e9c58be36 --- /dev/null +++ b/assets/js/72054e31.855d44cc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7135],{83888:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>r,default:()=>h,frontMatter:()=>l,metadata:()=>a,toc:()=>d});var s=n(85893),t=n(11151);const l={title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",slug:"solus-optimizing-packages",authors:"joey",tags:["pgo","lto","solus","packaging","optimization",3,"clang","gnu","llvm","glibc","hwcaps","x86_64-v3"],hide_table_of_contents:!1},r="Cual es la causa",a={permalink:"/blog/solus-optimizing-packages",source:"@site/devlog/2024-02-09-Intro-to-optimizing-packages-on-solus.md",title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",date:"2024-02-09T00:00:00.000Z",tags:[{inline:!0,label:"pgo",permalink:"/blog/tags/pgo"},{inline:!0,label:"lto",permalink:"/blog/tags/lto"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"},{inline:!0,label:"packaging",permalink:"/blog/tags/packaging"},{inline:!0,label:"optimization",permalink:"/blog/tags/optimization"},{inline:!0,label:"3",permalink:"/blog/tags/3"},{inline:!0,label:"clang",permalink:"/blog/tags/clang"},{inline:!0,label:"gnu",permalink:"/blog/tags/gnu"},{inline:!0,label:"llvm",permalink:"/blog/tags/llvm"},{inline:!0,label:"glibc",permalink:"/blog/tags/glibc"},{inline:!0,label:"hwcaps",permalink:"/blog/tags/hwcaps"},{inline:!0,label:"x86_64-v3",permalink:"/blog/tags/x-86-64-v-3"}],readingTime:22.32,hasTruncateMarker:!0,authors:[{name:"Joey Riches",title:"Solus Staff",page:{permalink:"/blog/authors/joey"},socials:{github:"https://github.com/joebonrichie"},imageURL:"https://avatars.githubusercontent.com/u/5338090",key:"joey"}],frontMatter:{title:"Intro to Optimizing Packages on Solus",description:"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle",slug:"solus-optimizing-packages",authors:"joey",tags:["pgo","lto","solus","packaging","optimization","3","clang","gnu","llvm","glibc","hwcaps","x86_64-v3"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Clean, clean, clean!",permalink:"/blog/clean-clean-clean"},nextItem:{title:"Don't call me MATE, pal!",permalink:"/blog/don't-call-me-mate-pal"}},o={authorsImageUrls:[void 0]},d=[{value:"Let's Start Obvious",id:"lets-start-obvious",level:2},{value:"PGO is great, except, when it isn't.",id:"pgo-is-great-except-when-it-isnt",level:2},{value:"256 Vector Units go brrrrrr...",id:"256-vector-units-go-brrrrrr",level:2},{value:"Something about perf to the rescue",id:"something-about-perf-to-the-rescue",level:2},{value:"Choosing Wisely",id:"choosing-wisely",level:2},{value:"Adjusting the Benchmark",id:"adjusting-the-benchmark",level:2},{value:"Partial Profiling",id:"partial-profiling",level:3},{value:"I Zee a Purty lil' Package",id:"i-zee-a-purty-lil-package",level:2},{value:"Squeezing more from zlib-ng",id:"squeezing-more-from-zlib-ng",level:2}];function c(e){const i={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(i.p,{children:["We'll explore how to build packages with advanced compiler techniques in order to squeeze more performance out of the box for packages in Solus. We'll be using the story of how ",(0,s.jsx)(i.code,{children:"libwebp"})," was optimized for and how it led to an unexpected side quest."]}),"\n",(0,s.jsx)(i.p,{children:"Linux distributions have a lot of control over how a source-based package gets compiled and shipped to users as part of a binary repository. Aggressive and advanced compiler optimization techniques, as well as other methods can be used to provide greater out of the box performance for end users. This can greatly benefit users running on older hardware to provide a snappier end-user experience; reducing time waiting on a heavy workload to finish; or even improved battery life; amongst other improvements."}),"\n",(0,s.jsxs)(i.p,{children:["Part of the problem is, a packager's time is limited. So how, as a distribution, do you choose to try provide faster compatible packages for an end user. A historic approach is to simply change the default compiler flags for ",(0,s.jsx)(i.em,{children:"all"})," packages, such as enabling ",(0,s.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/Interprocedural_optimization",children:"LTO"})," by default. Whilst this approach can work well, at Solus the philosophy is slightly different where a packager can trivially enable several advanced compiler optimization techniques such as ",(0,s.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/Profile-guided_optimization",children:"PGO"})," without too much faffing around on a ",(0,s.jsx)(i.em,{children:"targeted"})," package."]}),"\n",(0,s.jsx)(i.p,{children:"The benefits of such an approach are:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Can target the performance of a specific package to benefit ",(0,s.jsx)(i.em,{children:"all"})," users"]}),"\n",(0,s.jsx)(i.li,{children:"A compiler optimization may improve one package, but may not apply globally to all packages."}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"The downsides are such:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Requires additional packager time to benchmark and experiment with different optimization strategies."}),"\n",(0,s.jsxs)(i.li,{children:["Requires the packager to ",(0,s.jsx)(i.em,{children:"choose"})," and invest time into improving performance of a package."]}),"\n",(0,s.jsx)(i.li,{children:"Requires the packager to find an appropriate benchmark to test the package against."}),"\n",(0,s.jsx)(i.li,{children:"Experimenting with compiler optimizations may not bear fruit: no meaningful improvement in performance, or there may be some other bottleneck."}),"\n"]}),"\n",(0,s.jsx)(i.h1,{id:"optimization-techniques-available",children:"Optimization Techniques Available"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["speed:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["As simple as it gets really, build a package with ",(0,s.jsx)(i.code,{children:"-O3"})," instead of ",(0,s.jsx)(i.code,{children:"-O2"})," as well as any other flags deemed worthy to be included as part of the ",(0,s.jsx)(i.code,{children:"speed"})," flags. The main drawback of this is that ",(0,s.jsx)(i.code,{children:"-O3"})," is not guaranteed to produce faster results than building with ",(0,s.jsx)(i.code,{children:"-O2"})," and typically will produce bigger binaries. The days of ",(0,s.jsx)(i.code,{children:"-O3"})," outright breaking your program in weird unexpected ways is largely behind us."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["LTO:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Compared to some other distributions ",(0,s.jsx)(i.code,{children:"-flto"})," is not yet enabled by default on Solus. LTO is almost guaranteed to provide a %1 or slightly larger performance improvement as well as a smaller binary at the cost of increased compiling times and memory usage during build. When combined with other optimization techniques such as PGO the LTO optimization can really stretch its legs and provide even greater uplift!"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["Clang:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Not strictly an optimization, but, building a package with ",(0,s.jsx)(i.code,{children:"clang"})," instead of ",(0,s.jsx)(i.code,{children:"gcc"})," and ",(0,s.jsx)(i.code,{children:"ld.ldd"})," to link instead of the infamous ",(0,s.jsx)(i.code,{children:"ld.bfd"})," may provide a faster package out of the box. You'll have to be careful of subtle ABI differences if building with ",(0,s.jsx)(i.code,{children:"clang"}),". If in doubt, and, ",(0,s.jsx)(i.code,{children:"clang"})," is the obvious choice, perform safety rebuilds on all reverse dependencies of the package."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["PGO:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Profile guided optimization. Build once with instrumentation in order to collect profile data when ran. Run the program using a representative workload in order to collect profiling data. Build the program again with the profiling data provided in order to build an optimized variant."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["BOLT:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:['Binary optimization and layout tool. You can think of this as "post-link PGO" where you instrument a binary with ',(0,s.jsx)(i.code,{children:"bolt"})," to collect profiling data. Run that binary. Then finally reorganize the binary layout using the collected profile data. This generally works better on large statically linked binaries but smaller binaries or libraries such as found in a typical package can benefit too. This optimization is still quite new."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Regardless, that's enough word spaghetti, let's look at the process to actually optimize a package."}),"\n",(0,s.jsx)(i.h1,{id:"optimizing-a-package",children:"Optimizing a Package"}),"\n",(0,s.jsxs)(i.p,{children:["Right, to begin with we'll have to start on choosing an actual package to benchmark and optimize. I've heard the ",(0,s.jsx)(i.code,{children:".webp"})," file format is becoming increasingly common on the web, slowly replacing ",(0,s.jsx)(i.code,{children:".png"})," and ",(0,s.jsx)(i.code,{children:".jpg"})," file formats due to the strong backing of Google (for better or for worst). An improvement in decoding time for ",(0,s.jsx)(i.code,{children:".webp"})," files would benefit any user using a web browser casually browsing the web."]}),"\n",(0,s.jsxs)(i.p,{children:["Let's have a look at the ",(0,s.jsx)(i.code,{children:"package.yml"})," build recipe for ",(0,s.jsx)(i.code,{children:"libwebp"}),"."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:"name : libwebp\nversion : 1.3.2\nrelease : 25\nsource :\n - https://github.com/webmproject/libwebp/archive/refs/tags/v1.3.2.tar.gz : c2c2f521fa468e3c5949ab698c2da410f5dce1c5e99f5ad9e70e0e8446b86505\nhomepage : https://developers.google.com/speed/webp/\nlicense : BSD-3-Clause\ncomponent : multimedia.codecs\nsummary : A new image format for the web\ndescription: |\n WebP is a new image format that provides lossless and lossy compression for images on the web. WebP lossless images are 26% smaller in size compared to PNGs. WebP lossy images are 25-34% smaller in size compared to JPEG images at equivalent SSIM index. WebP supports lossless transparency (also known as alpha channel) with just 22% additional bytes. Transparency is also supported with lossy compression and typically provides 3x smaller file sizes compared to PNG when lossy compression is acceptable for the red/green/blue color channels.\nemul32 : yes\npatterns :\n - devel : /usr/share/man\nbuilddeps :\n - pkgconfig32(glu)\n - pkgconfig32(glut)\n - pkgconfig32(libpng)\n - pkgconfig32(libtiff-4)\n - pkgconfig32(libturbojpeg)\n - pkgconfig32(zlib)\n - giflib-devel\nsetup : |\n %reconfigure --disable-static --enable-everything\nbuild : |\n %make\ninstall : |\n %make_install\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Okay, looks to be a quite simple affair. A simple configure, make, make install as well as ",(0,s.jsx)(i.code,{children:"emul32"})," being enabled specifying the -32bit packages are also provided from this recipe. Next step is to look for a repeatable and easy way to benchmark it. We'll begin by looking at the ",(0,s.jsx)(i.code,{children:"pspec_x86_64.xml"})," file which lists all the files produced from the ",(0,s.jsx)(i.code,{children:"package.yml"})," recipe as well as some metadata."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-xml",children:' libwebp\n A new image format for the web\n WebP is a new image format that provides lossless and lossy compression for images on the web. WebP lossless images are 26% smaller in size compared to PNGs. WebP lossy images are 25-34% smaller in size compared to JPEG images at equivalent SSIM index. WebP supports lossless transparency (also known as alpha channel) with just 22% additional bytes. Transparency is also supported with lossy compression and typically provides 3x smaller file sizes compared to PNG when lossy compression is acceptable for the red/green/blue color channels.\n\n multimedia.codecs\n \n /usr/bin/cwebp\n /usr/bin/dwebp\n /usr/bin/gif2webp\n /usr/bin/img2webp\n /usr/bin/vwebp\n /usr/bin/webpinfo\n /usr/bin/webpmux\n'})}),"\n",(0,s.jsxs)(i.p,{children:["Perfect, we have ",(0,s.jsx)(i.code,{children:"dwebp"})," and ",(0,s.jsx)(i.code,{children:"cwebp"})," binaries available in the main package, which from a guess can be used to decode and encode ",(0,s.jsx)(i.code,{children:".webp"})," files. Let's try it out."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:"$ dwebp -h\nUsage: dwebp in_file [options] [-o out_file]\n\nDecodes the WebP image file to PNG format [Default].\nNote: Animated WebP files are not supported.\n$ cwebp -h\nUsage:\n\n cwebp [options] -q quality input.png -o output.webp\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Awesome, these binaries do exactly what we need to benchmark ",(0,s.jsx)(i.code,{children:"libwebp"}),", but, we are also indirectly testing ",(0,s.jsx)(i.code,{children:"libpng"})," as well for this benchmark, we'll have to keep an eye out for that."]}),"\n",(0,s.jsxs)(i.p,{children:["One extra step we have to do is ensure these binaries are actually linking against their own library, as upstream developers can have a habit of making sure their binaries don't link against their own libraries and end up being self-contained. Run ",(0,s.jsx)(i.code,{children:"ldd"})," to verify."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:"$ ldd /usr/bin/dwebp\n\tlinux-vdso.so.1 (0x00007ffed8733000)\n\tlibwebpdemux.so.2 => /usr/lib/libwebpdemux.so.2.0.14 (0x00007f7473bb4000)\n\tlibwebp.so.7 => /usr/lib/libwebp.so.7.1.8 (0x00007f7473ae2000)\n\tlibpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007f7473aa6000)\n\tlibc.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libc.so.6 (0x00007f74738a9000)\n\tlibsharpyuv.so.0 => /usr/lib/libsharpyuv.so.0.0.1 (0x00007f747389e000)\n\tlibm.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libm.so.6 (0x00007f74737b8000)\n\tlibz.so.1 => /usr/lib/libz.so.1.3.0 (0x00007f7473200000)\n\t/usr/lib64/ld-linux-x86-64.so.2 (0x00007f7473bea000)\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Awesome in this case both ",(0,s.jsx)(i.code,{children:"dwebp"})," and ",(0,s.jsx)(i.code,{children:"cwebp"})," link against ",(0,s.jsx)(i.code,{children:"libwebp.so"})," so we can be confident that any performance improvements will be applicable to all packages in the repository linking against ",(0,s.jsx)(i.code,{children:"libwebp"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["Let's grab a couple of ",(0,s.jsx)(i.code,{children:".webp"})," files from ",(0,s.jsx)(i.a,{href:"https://developers.google.com/speed/webp/gallery1",children:"here"})," to test with. We'll just use the largest image size available in this case to reduce noise as much as possible when running benchmarks as well as allow any potential optimizations to stretch their legs a little more."]}),"\n",(0,s.jsxs)(i.p,{children:["Now having done the prep work, lets actually benchmark the damn thing using ",(0,s.jsx)(i.code,{children:"hyperfine"})," for the time being."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:'$ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03c3): 202.2 ms \xb1 0.3 ms [User: 198.9 ms, System: 3.0 ms]\n Range (min \u2026 max): 201.8 ms \u2026 202.7 ms 14 runs\n$ hyperfine "cwebp ~/PNG_Test.png -o /dev/null"\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\n Time (mean \xb1 \u03c3): 1.423 s \xb1 0.009 s [User: 1.346 s, System: 0.076 s]\n Range (min \u2026 max): 1.410 s \u2026 1.435 s 10 runs\n'})}),"\n",(0,s.jsx)(i.p,{children:"There, we have our a basic baseline for encode and decode performance. We mostly care about decode performance here but improved encoding performance would also not go amiss."}),"\n",(0,s.jsx)(i.h2,{id:"lets-start-obvious",children:"Let's Start Obvious"}),"\n",(0,s.jsxs)(i.p,{children:["Let's start basic, enabling the ",(0,s.jsx)(i.code,{children:"speed"})," optimization which basically builds with ",(0,s.jsx)(i.code,{children:"-O3"})," instead of ",(0,s.jsx)(i.code,{children:"-O2"})," as well as any other flags that are deemed to be worthy to be part of the ",(0,s.jsx)(i.code,{children:"speed"})," group. As well as, the ",(0,s.jsx)(i.code,{children:"lto"})," optimization which builds with link time optimization allowing for inter-procedural optimizations to take place."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:"optimize:\n - speed\n - lto\n"})}),"\n",(0,s.jsx)(i.p,{children:"Moment of truth..."}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:'$ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03c3): 200.0 ms \xb1 1.5 ms [User: 197.3 ms, System: 2.5 ms]\n Range (min \u2026 max): 198.1 ms \u2026 203.2 ms 15 runs\n$ hyperfine "cwebp ~/PNG_Test.png -o /dev/null"\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\n Time (mean \xb1 \u03c3): 1.353 s \xb1 0.012 s [User: 1.281 s, System: 0.071 s]\n Range (min \u2026 max): 1.336 s \u2026 1.369 s 10 runs\n'})}),"\n",(0,s.jsx)(i.p,{children:"Well okay, we got a very minor uplift in decoding performance and a slightly higher improvement in encoding performance, but nothing too much to write home about. Luckily we have several more optimizations to explore..."}),"\n",(0,s.jsx)(i.h2,{id:"pgo-is-great-except-when-it-isnt",children:"PGO is great, except, when it isn't."}),"\n",(0,s.jsxs)(i.p,{children:["Next step is to explore PGO (Profile Guided Optimization). For our ",(0,s.jsx)(i.code,{children:"libwebp"})," package, looks like we already hit a bit of a snafu. There's no test suite included in the tarball! That's a bit of a disappointment as a test suite such as ",(0,s.jsx)(i.code,{children:"make check"})," is by far and away the easiest and most comprehensive workload that can be used for profiling as part of PGO, especially for smaller libraries. However, we can still experiment with the just built ",(0,s.jsx)(i.code,{children:"dwebp"})," and ",(0,s.jsx)(i.code,{children:"cwebp"})," binaries as a suitable workload for PGO."]}),"\n",(0,s.jsx)(i.p,{children:"Luckily, as part of the package.yml format all you have to do is provide a profile for automatic PGO. After chrooting into the build environment and fiddling around a bit we end up with:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:"profile : |\n ./examples/dwebp webp_js/test_webp_js.webp -o test_png.png\n ./examples/cwebp test_png.png -o /dev/null\n"})}),"\n",(0,s.jsx)(i.p,{children:"After specifying that, 6 builds will now be performed instead of 2:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["emul32:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Instrumented build"}),"\n",(0,s.jsx)(i.li,{children:"Run profiling workload"}),"\n",(0,s.jsx)(i.li,{children:"Optimized build using profiling data"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["x86_64:","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Instrumented build"}),"\n",(0,s.jsx)(i.li,{children:"Run profiling workload"}),"\n",(0,s.jsx)(i.li,{children:"Optimized build using profiling data"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"For this relatively small package it increases the build time from 1m1.672s to 1m42.199s"}),"\n",(0,s.jsx)(i.p,{children:"The next moment of truth..."}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:'$ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03c3): 204.1 ms \xb1 2.2 ms [User: 201.3 ms, System: 2.7 ms]\n Range (min \u2026 max): 201.6 ms \u2026 207.1 ms 14 runs\n$ hyperfine "cwebp ~/PNG_Test.png -o /dev/null"\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\n Time (mean \xb1 \u03c3): 1.349 s \xb1 0.010 s [User: 1.266 s, System: 0.082 s]\n Range (min \u2026 max): 1.335 s \u2026 1.374 s 10 runs\n'})}),"\n",(0,s.jsxs)(i.p,{children:["Well... That's interesting. We actually regress in performance for decode performance whilst gaining another small bump in encoding performance. Worse still, we get a bunch of ",(0,s.jsx)(i.code,{children:"profile count data file not found [-Wmissing-profile]"})," warning messages during the optimized build indicating to us our profiling workload isn't comprehensive enough and doesn't cover enough code paths. The lack of a handy ",(0,s.jsx)(i.code,{children:"make check"})," that could be used as a profiling workload is really hurting us here. For now, let's put a pin in exploring PGO, it isn't a dead end but more work needs to be done curating a more comprehensive workload to chuck at it in this particular case, whilst other, easier, optimization techniques are still available to us."]}),"\n",(0,s.jsx)(i.h2,{id:"256-vector-units-go-brrrrrr",children:"256 Vector Units go brrrrrr..."}),"\n",(0,s.jsxs)(i.p,{children:["The next obvious step is to explore ",(0,s.jsx)(i.code,{children:"glibc"})," hardware capabilities. For those unaware both ",(0,s.jsx)(i.code,{children:"clang"})," and ",(0,s.jsx)(i.code,{children:"gnu"})," compilers provide ",(0,s.jsx)(i.code,{children:"x86_64-v2"}),", ",(0,s.jsx)(i.code,{children:"x86_64-v3"})," and ",(0,s.jsx)(i.code,{children:"x86_64-v4"})," micro-architecture build options on top of the baseline of ",(0,s.jsx)(i.code,{children:"x86_64"}),". These enable the use of targeting additional CPU instruction sets during compilation for better performance. For example, ",(0,s.jsx)(i.code,{children:"-sse4.2"})," for ",(0,s.jsx)(i.code,{children:"x86_64-v2"}),", ",(0,s.jsx)(i.code,{children:"-avx2"})," for ",(0,s.jsx)(i.code,{children:"x86_64-v3"}),", and ",(0,s.jsx)(i.code,{children:"-avx512"})," for ",(0,s.jsx)(i.code,{children:"x86_64-v4"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["Whilst that's great 'n all, if a program is built with ",(0,s.jsx)(i.code,{children:"x86_64-v3"})," and gains an additional ~10% uplift in performance, it's no good if a ",(0,s.jsx)(i.code,{children:"x86_64-v2"})," compatible cpu can't run it. Luckily the ",(0,s.jsx)(i.code,{children:"glibc"})," loader that's found on almost general purpose linux installs provides a way to load higher or lower micro-architecture libraries if they're installed and supported."]}),"\n",(0,s.jsxs)(i.p,{children:["On top of all that, the ",(0,s.jsx)(i.code,{children:"package.yml"})," format provides an incredibly simple way of providing ",(0,s.jsx)(i.code,{children:"x86_64-v3"})," built libraries by enabling the ",(0,s.jsx)(i.code,{children:"avx2 : yes"})," flag."]}),"\n",(0,s.jsxs)(i.p,{children:["With ",(0,s.jsx)(i.code,{children:"avx2 : yes"})," enabled in the ",(0,s.jsx)(i.code,{children:"libwebp"})," package three builds are performed."]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"emul32"}),"\n",(0,s.jsx)(i.li,{children:"x86_64-v3"}),"\n",(0,s.jsx)(i.li,{children:"x86_64"}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["We now see these additional files in the ",(0,s.jsx)(i.code,{children:"pspec_x86_64.xml"})," file"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-diff",children:'+ /usr/lib64/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0.0.1\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebp.so.7\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdecoder.so.3\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdecoder.so.3.1.8\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2.0.14\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpmux.so.3\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpmux.so.3.0.13\n'})}),"\n",(0,s.jsxs)(i.p,{children:["Let's rerun ",(0,s.jsx)(i.code,{children:"lld"})," on ",(0,s.jsx)(i.code,{children:"dwebp"})," after installing the new package and..."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:"$ ldd /usr/bin/dwebp\n\tlinux-vdso.so.1 (0x00007ffeab5b1000)\n\tlibwebpdemux.so.2 => /usr/lib/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2.0.14 (0x00007f9a351d5000)\n\tlibwebp.so.7 => /usr/lib/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8 (0x00007f9a3510b000)\n\tlibpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007f9a350cf000)\n\tlibc.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libc.so.6 (0x00007f9a34ed2000)\n\tlibsharpyuv.so.0 => /usr/lib/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0.0.1 (0x00007f9a34ec1000)\n\tlibm.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libm.so.6 (0x00007f9a34ddb000)\n\tlibz.so.1 => /usr/lib/glibc-hwcaps/x86-64-v3/libz.so.1.3 (0x00007f9a34dbb000)\n\t/usr/lib64/ld-linux-x86-64.so.2 (0x00007f9a3520b000)\n"})}),"\n",(0,s.jsxs)(i.p,{children:["We can crucially see that ",(0,s.jsx)(i.code,{children:"dwebp"})," is now loading the ",(0,s.jsx)(i.code,{children:"x86-64-v3"})," built ",(0,s.jsx)(i.code,{children:"libwebp.so"})," lib from ",(0,s.jsx)(i.code,{children:"/usr/lib/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8"}),", success! Let's what our performance looks like."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:'$ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03c3): 198.2 ms \xb1 1.2 ms [User: 195.4 ms, System: 2.5 ms]\n Range (min \u2026 max): 197.0 ms \u2026 200.5 ms 14 runs\n$ hyperfine "cwebp ~/PNG_Test.png -o /dev/null"\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\n Time (mean \xb1 \u03c3): 1.313 s \xb1 0.009 s [User: 1.243 s, System: 0.078 s]\n Range (min \u2026 max): 1.308 s \u2026 1.341 s 10 runs\n'})}),"\n",(0,s.jsx)(i.p,{children:"Let's recap so far:"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Optimization"}),(0,s.jsx)(i.th,{children:"Decode"}),(0,s.jsx)(i.th,{children:"Encode"}),(0,s.jsx)(i.th,{children:"Size"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Baseline"}),(0,s.jsx)(i.td,{children:"202.2 ms"}),(0,s.jsx)(i.td,{children:"1.399 s"}),(0,s.jsx)(i.td,{children:"1.33 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO"}),(0,s.jsx)(i.td,{children:"200.0 ms"}),(0,s.jsx)(i.td,{children:"1.353 s"}),(0,s.jsx)(i.td,{children:"1.73 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO + PGO"}),(0,s.jsxs)(i.td,{children:["204.1 ms ","\u26a0\ufe0f"]}),(0,s.jsx)(i.td,{children:"1.349 s"}),(0,s.jsx)(i.td,{children:"1.07 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO + x86_64-v3"}),(0,s.jsx)(i.td,{children:"198.2 ms"}),(0,s.jsx)(i.td,{children:"1.313 s"}),(0,s.jsx)(i.td,{children:"3.17 MB"})]})]})]}),"\n",(0,s.jsxs)(i.p,{children:["Whilst we're still getting an additional speedup it isn't really anything to write home about. A measly ~2% improvement in decoding performance and a fairly respectable ~7% improvement in encoding performance for our test case. However, increasing the package size by an extra ~2MiB from providing a bunch of extra libs in ",(0,s.jsx)(i.code,{children:"/usr/lib/glibc-hwcaps/x86-64-v3/"})," just ain't worth it. This hints that either the compiler optimizations aren't really effective here or we're being bottle-necked by something else."]}),"\n",(0,s.jsxs)(i.p,{children:["So far, we've been benchmarking fairly simply using ",(0,s.jsx)(i.code,{children:"hyperfine"}),", let's swap that out for ",(0,s.jsx)(i.code,{children:"perf"})," so we can get a callgraph."]}),"\n",(0,s.jsxs)(i.h2,{id:"something-about-perf-to-the-rescue",children:["Something about ",(0,s.jsx)(i.code,{children:"perf"})," to the rescue"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.code,{children:"perf record -o dwebp.data -- dwebp ~/3.webp -o /dev/null"})}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.code,{children:"perf record -o cwebp.data -- cwebp ~/PNG_Test.png -o /dev/null"})}),"\n",(0,s.jsxs)(i.p,{children:["Let's look at ",(0,s.jsx)(i.code,{children:"dwebp"})," first with ",(0,s.jsx)(i.code,{children:"perf report -i dwebp.data"}),"."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Perf report dwebp",src:n(58916).Z+"",width:"1254",height:"676"})}),"\n",(0,s.jsxs)(i.p,{children:["Well god damn, literally all of our time is being spent in ",(0,s.jsx)(i.code,{children:"libz.so"})," it's no wonder our compiler optimizations were hardly improving performance."]}),"\n",(0,s.jsxs)(i.p,{children:["Let's also look at the ",(0,s.jsx)(i.code,{children:"cwebp"})," report, we've generally been getting better results from it."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Perf report cwebp",src:n(85370).Z+"",width:"1254",height:"676"})}),"\n",(0,s.jsxs)(i.p,{children:["Okay, much more of our time is being spent in ",(0,s.jsx)(i.code,{children:"libwebp.so"})," itself here which helps to explain why we were seeing a better performance uplift. Still 5.68% of our time is being spent in ",(0,s.jsx)(i.code,{children:"libz"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"choosing-wisely",children:"Choosing Wisely"}),"\n",(0,s.jsxs)(i.p,{children:["You may remember early on, when I said we are also indirectly testing ",(0,s.jsx)(i.code,{children:"libpng"}),". Well... after some more digging, that's exactly what's happening here. Re-running the ",(0,s.jsx)(i.code,{children:"dwebp"})," binary it says this"]}),"\n",(0,s.jsxs)(i.blockquote,{children:["\n",(0,s.jsx)(i.p,{children:"Decodes the WebP image file to PNG format"}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["Turns out, it's more accurate to say we are ",(0,s.jsx)(i.em,{children:"directly"})," testing ",(0,s.jsx)(i.code,{children:"libpng"})," and by extension ",(0,s.jsx)(i.code,{children:"zlib"}),". It isn't ",(0,s.jsx)(i.code,{children:"libwebp"})," that's spending all of its time in ",(0,s.jsx)(i.code,{children:"libz.so"}),", it's ",(0,s.jsx)(i.code,{children:"libpng"}),"! This is exactly the reason you have to be careful about the benchmarks chosen and, ensure you understand what they're doing."]}),"\n",(0,s.jsx)(i.p,{children:"However, the good news about this little snafu is:"}),"\n",(0,s.jsxs)(i.ol,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"dwebp"})," can be used to translate to another image format such as ",(0,s.jsx)(i.code,{children:".yuv"})," that'll more accurately remove the bottleneck from ",(0,s.jsx)(i.code,{children:"libz.so"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:["We now know that ",(0,s.jsx)(i.code,{children:"libpng"})," has a huge bottleneck in ",(0,s.jsx)(i.code,{children:"libz.so"})," and speeding up ",(0,s.jsx)(i.code,{children:"zlib"})," ",(0,s.jsx)(i.em,{children:"should"})," dramatically speed up ",(0,s.jsx)(i.code,{children:"libpng"})," performance."]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"adjusting-the-benchmark",children:"Adjusting the Benchmark"}),"\n",(0,s.jsxs)(i.p,{children:["After reverting the ",(0,s.jsx)(i.code,{children:"libwebp"})," package to the baseline let's use our adjusted decoding benchmark."]}),"\n",(0,s.jsxs)(i.p,{children:["We'll now use ",(0,s.jsx)(i.code,{children:"dwebp ~/3.webp -yuv -o /dev/null"})," for a decoding test, let's run that with ",(0,s.jsx)(i.code,{children:"perf"})," to ensure we're exclusively testing ",(0,s.jsx)(i.code,{children:"libwebp.so"})," here."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Perf report dwebp to yuv",src:n(29503).Z+"",width:"1254",height:"676"})}),"\n",(0,s.jsxs)(i.p,{children:["Okay that's awesome, no ",(0,s.jsx)(i.code,{children:"libpng.so"})," or ",(0,s.jsx)(i.code,{children:"libz.so"})," to mess with our tests!"]}),"\n",(0,s.jsx)(i.p,{children:"Let's reapply our optimizations, keeping those which apply an uplift"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Optimization"}),(0,s.jsx)(i.th,{children:"Decode"}),(0,s.jsx)(i.th,{children:"Size"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Baseline"}),(0,s.jsx)(i.td,{children:"14.7 ms"}),(0,s.jsx)(i.td,{children:"1.33 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed"}),(0,s.jsx)(i.td,{children:"14.5 ms"}),(0,s.jsx)(i.td,{children:"1.56 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"LTO"}),(0,s.jsx)(i.td,{children:"14.6 ms"}),(0,s.jsx)(i.td,{children:"1.40 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"PGO"}),(0,s.jsxs)(i.td,{children:["18.0 ms ","\u26a0\ufe0f"]}),(0,s.jsx)(i.td,{children:"1.07 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"x86-64-v3"}),(0,s.jsx)(i.td,{children:"12.7 ms"}),(0,s.jsx)(i.td,{children:"2.35 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO + x86-64-v3"}),(0,s.jsx)(i.td,{children:"12.3 ms"}),(0,s.jsx)(i.td,{children:"3.17 MB"})]})]})]}),"\n",(0,s.jsx)(i.p,{children:"Okay, this is great, whilst we aren't getting much from speed or LTO, we are getting a big uplift from x86-64-v3 libraries and when combined with the other optimizations we're getting an uplift in performance of around ~16% at the cost of close to thrice the installed package size."}),"\n",(0,s.jsx)(i.h3,{id:"partial-profiling",children:"Partial Profiling"}),"\n",(0,s.jsxs)(i.p,{children:["Once again we see that PGO regresses performance hard, however, that smaller size is giving a good hint! We already know that the profiling workload we gave it isn't very comprehensive due to the bunch of ",(0,s.jsx)(i.code,{children:"-Wmissing-profile"})," warnings we get during the optimized build. By default, PGO will aggressively inline and apply additional optimizations to code that's part of the profiling workload while everything else will be optimized for size. The idea being, hot-path code is fast and code that doesn't matter is small. However, what happens when you can't craft a comprehensive workload, as seems to be the case here? Luckily GCC has a flag for exactly that ",(0,s.jsx)(i.code,{children:"-fprofile-partial-training"}),". GCC docs state that:"]}),"\n",(0,s.jsxs)(i.blockquote,{children:["\n",(0,s.jsx)(i.p,{children:"In some cases it is not practical to train all possible hot paths in the program. (For example, program may contain functions specific for a given hardware and training may not cover all hardware configurations program is run on.) With -fprofile-partial-training profile feedback will be ignored for all functions not executed during the train run leading them to be optimized as if they were compiled without profile feedback. This leads to better performance when train run is not representative but also leads to significantly bigger code."}),"\n"]}),"\n",(0,s.jsxs)(i.p,{children:["Okay, let's try it out, all we need to do is specify in our ",(0,s.jsx)(i.code,{children:"package.yml"})," recipe."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:'environment: |\n if [[ -n ${PGO_USE_BUILD} ]]; then\n export CFLAGS="${CFLAGS} -fprofile-partial-training"\n export CXXFLAGS="${CXXFLAGS} -fprofile-partial-training"\n fi\n'})}),"\n",(0,s.jsx)(i.p,{children:"And the results:"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Optimization"}),(0,s.jsx)(i.th,{children:"Decode"}),(0,s.jsx)(i.th,{children:"Size"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO + x86-64-v3"}),(0,s.jsx)(i.td,{children:"12.3 ms"}),(0,s.jsx)(i.td,{children:"3.17 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO + x86-64-v3 + Partial PGO"}),(0,s.jsx)(i.td,{children:"12.5 ms"}),(0,s.jsx)(i.td,{children:"3.13 MB"})]})]})]}),"\n",(0,s.jsx)(i.p,{children:"Well, it was worth a try. This highlights how useless PGO can be when you don't or can't provide it a good workload. Interestingly, we don't get the size bloat that was promised, in fact, the opposite."}),"\n",(0,s.jsx)(i.h1,{id:"final-libwebp-results",children:"Final libwebp Results"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Benchmark"}),(0,s.jsx)(i.th,{children:"Time Before"}),(0,s.jsx)(i.th,{children:"Time After"}),(0,s.jsx)(i.th,{children:"Size Before"}),(0,s.jsx)(i.th,{children:"Size After"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:'"dwebp ~/3.webp -yuv -o /dev/null"'}),(0,s.jsx)(i.td,{children:"14.5 ms"}),(0,s.jsx)(i.td,{children:"12.3 ms"}),(0,s.jsx)(i.td,{children:"1.33 MB"}),(0,s.jsx)(i.td,{children:"3.17 MB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:'"cwebp ~/PNG_Test.png -o /dev/null"'}),(0,s.jsx)(i.td,{children:"1.399 s"}),(0,s.jsx)(i.td,{children:"1.313 s"}),(0,s.jsx)(i.td,{children:"--"}),(0,s.jsx)(i.td,{children:"--"})]})]})]}),"\n",(0,s.jsx)(i.p,{children:"In the end, we get a very healthy ~16% improvement in decoding from a .webp to .yuv file. As well as a respectable 6% improvement in encoding from a .png to .webp file. However, the increased package size is very unfortunate. It's possible to tweak the x86-64-v3 build and only ship the libs that actually improve performance in order to get the installed size back to an acceptable level."}),"\n",(0,s.jsx)(i.h1,{id:"next-generation-side-quest",children:'"Next-Generation" Side Quest'}),"\n",(0,s.jsxs)(i.p,{children:["Now, you probably remember earlier due to our unrepresentative benchmark we found out that ",(0,s.jsx)(i.code,{children:"libpng"})," is getting highly bottlenecked by ",(0,s.jsx)(i.code,{children:"libz.so"}),". This now seems like a perfect opportunity to take a look at zlib and circle-back to our original benchmark that we were using."]}),"\n",(0,s.jsxs)(i.p,{children:["Zlib is widely employed throughout the ecosystem and, as such you'd think it would be highly-optimized for performance. However, that isn't really the case. Zlib is written in an old-fashioned way of C and tries to be ",(0,s.jsx)(i.em,{children:"extremely"})," portable; supporting dozens of systems that have fallen out of common use. As such, it's hard to apply architecture specific optimizations that wouldn't break some old system or without introducing code spaghetti. There have been a couple of attempts to merge AArch64 and x86_64 optimizations into the canonical zlib library without success."]}),"\n",(0,s.jsxs)(i.p,{children:["However, there is some light in this tunnel as various forks of zlib having been popping up, applying new optimizations on top of zlib. The most promising of these looks be to ",(0,s.jsx)(i.a,{href:"https://github.com/zlib-ng/zlib-ng/",children:"zlib-ng"}),". When built in compatible mode, it promises to be API compatible with canonical zlib and ",(0,s.jsx)(i.em,{children:"tries"})," to be as ABI compatible as possible."]}),"\n",(0,s.jsxs)(i.p,{children:["Let's just go for it, replacing Solus' ",(0,s.jsx)(i.code,{children:"zlib"})," package with zlib-ng built in compatible mode. It's a bit scary due to how integral zlib is in a typical Linux install, but, how hard could it be?"]}),"\n",(0,s.jsx)(i.h2,{id:"i-zee-a-purty-lil-package",children:"I Zee a Purty lil' Package"}),"\n",(0,s.jsxs)(i.p,{children:["Well that was simple. Here's what our zlib-ng ",(0,s.jsx)(i.code,{children:"package.yml"})," recipe looks like."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-yaml",children:"name : zlib\nversion : 2.1.5\nrelease : 28\nsource :\n - https://github.com/zlib-ng/zlib-ng/archive/refs/tags/2.1.5.tar.gz : 3f6576971397b379d4205ae5451ff5a68edf6c103b2f03c4188ed7075fbb5f04\nhomepage : https://github.com/zlib-ng/zlib-ng\nlicense : ZLIB\ncomponent : system.base\nsummary : zlib replacement with optimizations for next generation systems.\ndescription:\n - A zlib data compression library for the next generation systems. ABI/API compatible mode.\ndevel : yes\nemul32 : yes\nsetup : |\n %cmake_ninja \\\n -DZLIB_COMPAT=ON \\\n -DWITH_GTEST=OFF \\\n -DBUILD_SHARED_LIBS=ON \\\n -DINSTALL_LIB_DIR=%libdir%\nbuild : |\n %ninja_build\ninstall : |\n %ninja_install\ncheck : |\n %ninja_check\n"})}),"\n",(0,s.jsxs)(i.p,{children:["After building it, all the files seem to be in the right place and the test suite is passing. Let's just install it overwriting our canonical ",(0,s.jsx)(i.code,{children:"zlib"})," package and hope our system doesn't die... I think the word is YOLO."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:'$ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03c3): 198.6 ms \xb1 2.3 ms [User: 194.3 ms, System: 3.6 ms]\n Range (min \u2026 max): 196.3 ms \u2026 203.3 ms 14 runs\n$ sudo eopkg it zlib-2.1.5-28-1-x86_64.eopkg\n...\n$ $ hyperfine "dwebp ~/3.webp -o /dev/null"\nBenchmark 1: dwebp ~/3.webp -o /dev/null\n Time (mean \xb1 \u03c3): 87.6 ms \xb1 0.7 ms [User: 84.7 ms, System: 2.6 ms]\n Range (min \u2026 max): 86.5 ms \u2026 88.7 ms 33 runs\n'})}),"\n",(0,s.jsx)(i.p,{children:"Well, hot diggity damn. Swapping out the zlib package for a more performant variant has instantly more than halved(!!) our decoding time."}),"\n",(0,s.jsxs)(i.p,{children:["We need to find a more contained ",(0,s.jsx)(i.code,{children:"libpng"})," benchmark here that removes the ",(0,s.jsx)(i.code,{children:"libwebp"})," stuff to really confirm the findings here. After some sleuthing the ",(0,s.jsx)(i.code,{children:"libpng"})," source repository has a ",(0,s.jsx)(i.a,{href:"https://github.com/glennrp/libpng/blob/libpng16/contrib/examples/pngtopng.c",children:"pngtopng.c"})," file we can compile to use the system libpng library."]}),"\n",(0,s.jsxs)(i.p,{children:["Changing the header from ",(0,s.jsx)(i.code,{children:'#include "../../png.h"'})," to ",(0,s.jsx)(i.code,{children:"#include "})," then running ",(0,s.jsx)(i.code,{children:"gcc -Ofast pngtopng.c -lpng16 -o pngtopng"})," to compile it, we have a libpng benchmark. We can reuse our test .png file from earlier. Ending up with: ",(0,s.jsx)(i.code,{children:"./pngtopng ~/PNG_Test.png /dev/null"})," for our benchmark."]}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Library"}),(0,s.jsx)(i.th,{children:"Time"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"zlib (canonical)"}),(0,s.jsx)(i.td,{children:"1.464 s"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"zlib-ng (compat)"}),(0,s.jsx)(i.td,{children:"896.6 ms"})]})]})]}),"\n",(0,s.jsxs)(i.p,{children:["Well. This is pretty much inline with our flawed ",(0,s.jsx)(i.code,{children:"dwebp"})," benchmark from earlier. Swapping out zlib almost halves ",(0,s.jsx)(i.code,{children:"libpng"})," decoding time."]}),"\n",(0,s.jsx)(i.h2,{id:"squeezing-more-from-zlib-ng",children:"Squeezing more from zlib-ng"}),"\n",(0,s.jsxs)(i.p,{children:["However, we're not done yet. We still have our compiler optimizations available to us to squeeze more performance from ",(0,s.jsx)(i.code,{children:"zlib-ng"}),"."]}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Optimization"}),(0,s.jsx)(i.th,{children:"Decode"}),(0,s.jsx)(i.th,{children:"Size"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Baseline"}),(0,s.jsx)(i.td,{children:"896.6 ms"}),(0,s.jsx)(i.td,{children:"141.00 KB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed"}),(0,s.jsx)(i.td,{children:"883.6 ms"}),(0,s.jsx)(i.td,{children:"182.00 KB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"LTO"}),(0,s.jsx)(i.td,{children:"892.7 ms"}),(0,s.jsx)(i.td,{children:"133.00 KB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"PGO"}),(0,s.jsx)(i.td,{children:"894.6 ms"}),(0,s.jsx)(i.td,{children:"141.00 KB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"x86-64-v3"}),(0,s.jsx)(i.td,{children:"892.5 ms"}),(0,s.jsx)(i.td,{children:"295.00 KB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO"}),(0,s.jsx)(i.td,{children:"882.6 ms"}),(0,s.jsx)(i.td,{children:"170.00 KB"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"Speed + LTO + PGO + x86-64-v3"}),(0,s.jsx)(i.td,{children:"882.5 ms"}),(0,s.jsx)(i.td,{children:"250.00 KB"})]})]})]}),"\n",(0,s.jsx)(i.p,{children:"It looks like in this case the simple speed + LTO optimizations is the way to go. Speed gives the majority of the speedup but LTO helps bring back down the package size again. However, it's only a 1.5% improvement from baseline for this benchmark. We can always re-benchmark it later, testing zlib performance more directly instead of via libpng. It shows how good a job the zlib-ng developers have done that it's so performant right out of the gate."}),"\n",(0,s.jsx)(i.h1,{id:"final-words",children:"Final Words"}),"\n",(0,s.jsx)(i.p,{children:"We've shown the process of how a package can be optimized in Solus, through the failings and wins here I hope some good tips and tricks were provided in avoiding common pitfalls. Additional benchmarking strategies such as BOLT or Polly optimizations were not discussed and it'll be good material for a future blog post."}),"\n",(0,s.jsx)(i.p,{children:"Some other important things such as tweaking the system for benchmarking in order to get representative and consistent results were also not discussed. This is especially important in power budget constrained systems such as laptops and worth bearing in mind."}),"\n",(0,s.jsxs)(i.p,{children:["Regardless, I hope the story of how ",(0,s.jsx)(i.code,{children:"libwebp"})," was optimized for was entertaining and some things were learnt for anyone looking to optimize packages in Solus for the future."]})]})}function h(e={}){const{wrapper:i}={...(0,t.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},85370:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/perf_report_cwebp_png-baafb78e8e4527d10a5a1ded232c2bde.webp"},58916:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/perf_report_dwebp_png-c0f9529294b3efe6743a980866abdf15.webp"},29503:(e,i,n)=>{n.d(i,{Z:()=>s});const s=n.p+"assets/images/perf_report_dwebp_yuv-36ad3f6052746d5ea55acce6cbe72b6f.webp"},11151:(e,i,n)=>{n.d(i,{Z:()=>a,a:()=>r});var s=n(67294);const t={},l=s.createContext(t);function r(e){const i=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(l.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/74470af4.ecf20609.js b/assets/js/74470af4.182cfd03.js similarity index 99% rename from assets/js/74470af4.ecf20609.js rename to assets/js/74470af4.182cfd03.js index 5a86c865e..047c03d9b 100644 --- a/assets/js/74470af4.ecf20609.js +++ b/assets/js/74470af4.182cfd03.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1896],{5893:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var s=r(85893),n=r(11151);const o={title:"VirtualBox",summary:"Quick start guide for VirtualBox on Solus"},i="VirtualBox",l={id:"user/software/virtualization/virtualbox",title:"VirtualBox",description:"VirtualBox is an x86 and x86_64 virtualization software package developed by Oracle.",source:"@site/docs/user/software/virtualization/virtualbox.md",sourceDirName:"user/software/virtualization",slug:"/user/software/virtualization/virtualbox",permalink:"/docs/user/software/virtualization/virtualbox",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/virtualization/virtualbox.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"VirtualBox",summary:"Quick start guide for VirtualBox on Solus"},sidebar:"userSidebar",previous:{title:"Virtualization",permalink:"/docs/category/virtualization"},next:{title:"Web",permalink:"/docs/category/web"}},a={},d=[{value:"Before you start",id:"before-you-start",level:2},{value:"Remove prior installation",id:"remove-prior-installation",level:3},{value:"Update your system",id:"update-your-system",level:3},{value:"Determine which kernel you are using",id:"determine-which-kernel-you-are-using",level:3},{value:"Solus as host",id:"solus-as-host",level:2},{value:"Solus as guest",id:"solus-as-guest",level:2},{value:"Extra configuration",id:"extra-configuration",level:2},{value:"USB controller",id:"usb-controller",level:4},{value:"Shared folders",id:"shared-folders",level:4},{value:"Troubleshooting",id:"troubleshooting",level:2}];function h(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"virtualbox",children:"VirtualBox"})}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"https://www.virtualbox.org/",children:"VirtualBox"})," is an x86 and x86_64 virtualization software package developed by Oracle."]}),"\n",(0,s.jsx)(t.h2,{id:"before-you-start",children:"Before you start"}),"\n",(0,s.jsxs)(t.p,{children:["This section applies to new installations for both ",(0,s.jsx)(t.strong,{children:"Host"})," and ",(0,s.jsx)(t.strong,{children:"Guest"}),"."]}),"\n",(0,s.jsx)(t.h3,{id:"remove-prior-installation",children:"Remove prior installation"}),"\n",(0,s.jsxs)(t.p,{children:["It is important to uninstall any version of VirtualBox (or VirtualBox Guest Additions) that ",(0,s.jsx)(t.strong,{children:"was not"})," installed from the Software Center or there will be conflicts that will prevent the application to work.\nThis can usually be done by executing the following command from a terminal:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"sudo /opt/VirtualBox/uninstall.sh\n"})}),"\n",(0,s.jsx)(t.h3,{id:"update-your-system",children:"Update your system"}),"\n",(0,s.jsx)(t.p,{children:"Ensure your system is up-to-date. This is very important because VirtualBox installs some kernel modules and the application will not work if your kernel is outdated."}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"sudo eopkg upgrade\n"})}),"\n",(0,s.jsx)(t.h3,{id:"determine-which-kernel-you-are-using",children:"Determine which kernel you are using"}),"\n",(0,s.jsxs)(t.p,{children:["Solus support both a ",(0,s.jsx)(t.code,{children:"current"})," and ",(0,s.jsx)(t.code,{children:"lts"})," kernel. It is important to install the version that corresponds to your kernel."]}),"\n",(0,s.jsx)(t.p,{children:"If you aren't sure which kernel you are running, run the following in terminal:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"uname -r\n"})}),"\n",(0,s.jsxs)(t.p,{children:["You will either have a ",(0,s.jsx)(t.code,{children:".current"})," or ",(0,s.jsx)(t.code,{children:".lts"})," suffix. Examples: ",(0,s.jsx)(t.code,{children:"5.13.1-187.current"})," or ",(0,s.jsx)(t.code,{children:"4.14.237-175.lts"})]}),"\n",(0,s.jsx)(t.h2,{id:"solus-as-host",children:"Solus as host"}),"\n",(0,s.jsx)(t.p,{children:"VirtualBox is available in the Software Center, select the package that matches your kernel."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"virtualbox"}),(0,s.jsx)(t.th,{children:"virtualbox-current"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsxs)(t.td,{children:["VirtualBox host modules for the ",(0,s.jsx)(t.strong,{children:"linux-lts"})," kernel"]}),(0,s.jsxs)(t.td,{children:["VirtualBox host modules for the ",(0,s.jsx)(t.strong,{children:"linux-current"})," kernel"]})]})})]}),"\n",(0,s.jsxs)(t.p,{children:["You ",(0,s.jsx)(t.strong,{children:"must"})," reboot your computer before running VirtualBox for the first time."]}),"\n",(0,s.jsx)(t.h2,{id:"solus-as-guest",children:"Solus as guest"}),"\n",(0,s.jsx)(t.p,{children:"VirtualBox Guest Additions are available in the Software Center, select the package that matches kernel version on the Solus virtual machine."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"virtualbox-guest"}),(0,s.jsx)(t.th,{children:"virtualbox-guest-common"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsxs)(t.td,{children:["VirtualBox guest modules for the ",(0,s.jsx)(t.strong,{children:"linux-lts"})," kernel"]}),(0,s.jsxs)(t.td,{children:["Install this package if the ",(0,s.jsx)(t.strong,{children:"linux-current"})," kernel is used"]})]})})]}),"\n",(0,s.jsxs)(t.p,{children:["You ",(0,s.jsx)(t.strong,{children:"must"})," reboot your virtual machine to load the newly installed modules"]}),"\n",(0,s.jsx)(t.h2,{id:"extra-configuration",children:"Extra configuration"}),"\n",(0,s.jsx)(t.h4,{id:"usb-controller",children:"USB controller"}),"\n",(0,s.jsxs)(t.p,{children:["If you want to use USB 2.0 or 3.0 in your virtual machine (and your hardware supports it), you have to install the ",(0,s.jsx)(t.a,{href:"https://www.virtualbox.org/manual/ch01.html#intro-installing",children:"extension pack"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["Note: Access to USB is granted by the user group ",(0,s.jsx)(t.code,{children:"vboxusers"})," on the ",(0,s.jsx)(t.strong,{children:"Host"})," operating system. You can add yourself to this group with the following command"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"sudo gpasswd -a $USER vboxusers\n"})}),"\n",(0,s.jsx)(t.h4,{id:"shared-folders",children:"Shared folders"}),"\n",(0,s.jsx)(t.p,{children:"Share folders let you access files from the host system from within a guest machine."}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Note:"})," auto-mounted shared folders are mounted into the ",(0,s.jsx)(t.code,{children:"/media"})," directory, along with the prefix ",(0,s.jsx)(t.code,{children:"sf_"}),". For example, the shared folder ",(0,s.jsx)(t.code,{children:"myfiles"})," would be mounted to ",(0,s.jsx)(t.code,{children:"/media/sf_myfiles"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["Access to the shared folders is only granted to the user group ",(0,s.jsx)(t.code,{children:"vboxsf"})," on the ",(0,s.jsx)(t.strong,{children:"Guest"})," operating system."]}),"\n",(0,s.jsx)(t.p,{children:"Execute these commands to set the permissions and add yourself to the group"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"sudo gpasswd -a $USER vboxsf\n"})}),"\n",(0,s.jsx)(t.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"VBOX Kernel",src:r(74848).Z+"",width:"500",height:"336"})}),"\n",(0,s.jsxs)(t.p,{children:["The Error ",(0,s.jsx)(t.code,{children:"Kernel driver not installed (rc=-1908)"})," may occur if"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"The computer was not restarted before launching VirtualBox for the first time"}),"\n",(0,s.jsx)(t.li,{children:"The computer is not booted on the latest kernel. Make sure to apply the updates from the Software Center and restart your machine."}),"\n",(0,s.jsx)(t.li,{children:"The wrong VirtualBox package was installed. Please check the instructions just above to install the correct package for your kernel."}),"\n",(0,s.jsx)(t.li,{children:"VirtualBox was manually installed and it conflicts with the version installed from the Solus Repository."}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},74848:(e,t,r)=>{r.d(t,{Z:()=>s});const s=r.p+"assets/images/vbox-kernel-85eb11034e02dafe61706f4d967580fe.png"},11151:(e,t,r)=>{r.d(t,{Z:()=>l,a:()=>i});var s=r(67294);const n={},o=s.createContext(n);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1896],{5893:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var s=r(85893),n=r(11151);const o={title:"VirtualBox",summary:"Quick start guide for VirtualBox on Solus"},i="VirtualBox",l={id:"user/software/virtualization/virtualbox",title:"VirtualBox",description:"VirtualBox is an x86 and x86_64 virtualization software package developed by Oracle.",source:"@site/docs/user/software/virtualization/virtualbox.md",sourceDirName:"user/software/virtualization",slug:"/user/software/virtualization/virtualbox",permalink:"/docs/user/software/virtualization/virtualbox",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/virtualization/virtualbox.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"VirtualBox",summary:"Quick start guide for VirtualBox on Solus"},sidebar:"userSidebar",previous:{title:"Virtualization",permalink:"/docs/category/virtualization"},next:{title:"Web",permalink:"/docs/category/web"}},a={},d=[{value:"Before you start",id:"before-you-start",level:2},{value:"Remove prior installation",id:"remove-prior-installation",level:3},{value:"Update your system",id:"update-your-system",level:3},{value:"Determine which kernel you are using",id:"determine-which-kernel-you-are-using",level:3},{value:"Solus as host",id:"solus-as-host",level:2},{value:"Solus as guest",id:"solus-as-guest",level:2},{value:"Extra configuration",id:"extra-configuration",level:2},{value:"USB controller",id:"usb-controller",level:4},{value:"Shared folders",id:"shared-folders",level:4},{value:"Troubleshooting",id:"troubleshooting",level:2}];function h(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"virtualbox",children:"VirtualBox"})}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"https://www.virtualbox.org/",children:"VirtualBox"})," is an x86 and x86_64 virtualization software package developed by Oracle."]}),"\n",(0,s.jsx)(t.h2,{id:"before-you-start",children:"Before you start"}),"\n",(0,s.jsxs)(t.p,{children:["This section applies to new installations for both ",(0,s.jsx)(t.strong,{children:"Host"})," and ",(0,s.jsx)(t.strong,{children:"Guest"}),"."]}),"\n",(0,s.jsx)(t.h3,{id:"remove-prior-installation",children:"Remove prior installation"}),"\n",(0,s.jsxs)(t.p,{children:["It is important to uninstall any version of VirtualBox (or VirtualBox Guest Additions) that ",(0,s.jsx)(t.strong,{children:"was not"})," installed from the Software Center or there will be conflicts that will prevent the application to work.\nThis can usually be done by executing the following command from a terminal:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"sudo /opt/VirtualBox/uninstall.sh\n"})}),"\n",(0,s.jsx)(t.h3,{id:"update-your-system",children:"Update your system"}),"\n",(0,s.jsx)(t.p,{children:"Ensure your system is up-to-date. This is very important because VirtualBox installs some kernel modules and the application will not work if your kernel is outdated."}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"sudo eopkg upgrade\n"})}),"\n",(0,s.jsx)(t.h3,{id:"determine-which-kernel-you-are-using",children:"Determine which kernel you are using"}),"\n",(0,s.jsxs)(t.p,{children:["Solus support both a ",(0,s.jsx)(t.code,{children:"current"})," and ",(0,s.jsx)(t.code,{children:"lts"})," kernel. It is important to install the version that corresponds to your kernel."]}),"\n",(0,s.jsx)(t.p,{children:"If you aren't sure which kernel you are running, run the following in terminal:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"uname -r\n"})}),"\n",(0,s.jsxs)(t.p,{children:["You will either have a ",(0,s.jsx)(t.code,{children:".current"})," or ",(0,s.jsx)(t.code,{children:".lts"})," suffix. Examples: ",(0,s.jsx)(t.code,{children:"5.13.1-187.current"})," or ",(0,s.jsx)(t.code,{children:"4.14.237-175.lts"})]}),"\n",(0,s.jsx)(t.h2,{id:"solus-as-host",children:"Solus as host"}),"\n",(0,s.jsx)(t.p,{children:"VirtualBox is available in the Software Center, select the package that matches your kernel."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"virtualbox"}),(0,s.jsx)(t.th,{children:"virtualbox-current"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsxs)(t.td,{children:["VirtualBox host modules for the ",(0,s.jsx)(t.strong,{children:"linux-lts"})," kernel"]}),(0,s.jsxs)(t.td,{children:["VirtualBox host modules for the ",(0,s.jsx)(t.strong,{children:"linux-current"})," kernel"]})]})})]}),"\n",(0,s.jsxs)(t.p,{children:["You ",(0,s.jsx)(t.strong,{children:"must"})," reboot your computer before running VirtualBox for the first time."]}),"\n",(0,s.jsx)(t.h2,{id:"solus-as-guest",children:"Solus as guest"}),"\n",(0,s.jsx)(t.p,{children:"VirtualBox Guest Additions are available in the Software Center, select the package that matches kernel version on the Solus virtual machine."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"virtualbox-guest"}),(0,s.jsx)(t.th,{children:"virtualbox-guest-common"})]})}),(0,s.jsx)(t.tbody,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsxs)(t.td,{children:["VirtualBox guest modules for the ",(0,s.jsx)(t.strong,{children:"linux-lts"})," kernel"]}),(0,s.jsxs)(t.td,{children:["Install this package if the ",(0,s.jsx)(t.strong,{children:"linux-current"})," kernel is used"]})]})})]}),"\n",(0,s.jsxs)(t.p,{children:["You ",(0,s.jsx)(t.strong,{children:"must"})," reboot your virtual machine to load the newly installed modules"]}),"\n",(0,s.jsx)(t.h2,{id:"extra-configuration",children:"Extra configuration"}),"\n",(0,s.jsx)(t.h4,{id:"usb-controller",children:"USB controller"}),"\n",(0,s.jsxs)(t.p,{children:["If you want to use USB 2.0 or 3.0 in your virtual machine (and your hardware supports it), you have to install the ",(0,s.jsx)(t.a,{href:"https://www.virtualbox.org/manual/ch01.html#intro-installing",children:"extension pack"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["Note: Access to USB is granted by the user group ",(0,s.jsx)(t.code,{children:"vboxusers"})," on the ",(0,s.jsx)(t.strong,{children:"Host"})," operating system. You can add yourself to this group with the following command"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"sudo gpasswd -a $USER vboxusers\n"})}),"\n",(0,s.jsx)(t.h4,{id:"shared-folders",children:"Shared folders"}),"\n",(0,s.jsx)(t.p,{children:"Share folders let you access files from the host system from within a guest machine."}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Note:"})," auto-mounted shared folders are mounted into the ",(0,s.jsx)(t.code,{children:"/media"})," directory, along with the prefix ",(0,s.jsx)(t.code,{children:"sf_"}),". For example, the shared folder ",(0,s.jsx)(t.code,{children:"myfiles"})," would be mounted to ",(0,s.jsx)(t.code,{children:"/media/sf_myfiles"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["Access to the shared folders is only granted to the user group ",(0,s.jsx)(t.code,{children:"vboxsf"})," on the ",(0,s.jsx)(t.strong,{children:"Guest"})," operating system."]}),"\n",(0,s.jsx)(t.p,{children:"Execute these commands to set the permissions and add yourself to the group"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"sudo gpasswd -a $USER vboxsf\n"})}),"\n",(0,s.jsx)(t.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"VBOX Kernel",src:r(74848).Z+"",width:"500",height:"336"})}),"\n",(0,s.jsxs)(t.p,{children:["The Error ",(0,s.jsx)(t.code,{children:"Kernel driver not installed (rc=-1908)"})," may occur if"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"The computer was not restarted before launching VirtualBox for the first time"}),"\n",(0,s.jsx)(t.li,{children:"The computer is not booted on the latest kernel. Make sure to apply the updates from the Software Center and restart your machine."}),"\n",(0,s.jsx)(t.li,{children:"The wrong VirtualBox package was installed. Please check the instructions just above to install the correct package for your kernel."}),"\n",(0,s.jsx)(t.li,{children:"VirtualBox was manually installed and it conflicts with the version installed from the Solus Repository."}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},74848:(e,t,r)=>{r.d(t,{Z:()=>s});const s=r.p+"assets/images/vbox-kernel-85eb11034e02dafe61706f4d967580fe.png"},11151:(e,t,r)=>{r.d(t,{Z:()=>l,a:()=>i});var s=r(67294);const n={},o=s.createContext(n);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/75c41d11.a746d816.js b/assets/js/75c41d11.4c49f3fa.js similarity index 94% rename from assets/js/75c41d11.a746d816.js rename to assets/js/75c41d11.4c49f3fa.js index a2195cb8b..a8ec55c2d 100644 --- a/assets/js/75c41d11.a746d816.js +++ b/assets/js/75c41d11.4c49f3fa.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3337],{75584:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>a});var r=s(85893),n=s(11151);const i={title:"Tips and Tricks",summary:"Helpful tips and tricks for using XFCE on Solus"},o="Tips and Tricks",c={id:"user/editions/xfce/tips-and-tricks",title:"Tips and Tricks",description:"XFCE Keyboard Shortcuts",source:"@site/docs/user/editions/xfce/tips-and-tricks.md",sourceDirName:"user/editions/xfce",slug:"/user/editions/xfce/tips-and-tricks",permalink:"/docs/user/editions/xfce/tips-and-tricks",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/xfce/tips-and-tricks.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Tips and Tricks",summary:"Helpful tips and tricks for using XFCE on Solus"},sidebar:"userSidebar",previous:{title:"Configuration",permalink:"/docs/user/editions/xfce/configuration"},next:{title:"Hardware",permalink:"/docs/user/hardware/"}},d={},a=[{value:"XFCE Keyboard Shortcuts",id:"xfce-keyboard-shortcuts",level:2}];function u(e){const t={h1:"h1",h2:"h2",header:"header",p:"p",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,r.jsx)(t.h2,{id:"xfce-keyboard-shortcuts",children:"XFCE Keyboard Shortcuts"}),"\n",(0,r.jsx)(t.p,{children:"TODO: Provide a table of short-cuts like we did for Budgie"}),"\n",(0,r.jsx)(t.p,{children:"TODO: Add a few other tips and tricks useful to XFCE users"})]})}function l(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>c,a:()=>o});var r=s(67294);const n={},i=r.createContext(n);function o(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3337],{75584:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>a});var r=s(85893),n=s(11151);const i={title:"Tips and Tricks",summary:"Helpful tips and tricks for using XFCE on Solus"},o="Tips and Tricks",c={id:"user/editions/xfce/tips-and-tricks",title:"Tips and Tricks",description:"XFCE Keyboard Shortcuts",source:"@site/docs/user/editions/xfce/tips-and-tricks.md",sourceDirName:"user/editions/xfce",slug:"/user/editions/xfce/tips-and-tricks",permalink:"/docs/user/editions/xfce/tips-and-tricks",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/xfce/tips-and-tricks.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Tips and Tricks",summary:"Helpful tips and tricks for using XFCE on Solus"},sidebar:"userSidebar",previous:{title:"Configuration",permalink:"/docs/user/editions/xfce/configuration"},next:{title:"Hardware",permalink:"/docs/user/hardware/"}},d={},a=[{value:"XFCE Keyboard Shortcuts",id:"xfce-keyboard-shortcuts",level:2}];function u(e){const t={h1:"h1",h2:"h2",header:"header",p:"p",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,r.jsx)(t.h2,{id:"xfce-keyboard-shortcuts",children:"XFCE Keyboard Shortcuts"}),"\n",(0,r.jsx)(t.p,{children:"TODO: Provide a table of short-cuts like we did for Budgie"}),"\n",(0,r.jsx)(t.p,{children:"TODO: Add a few other tips and tricks useful to XFCE users"})]})}function l(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>c,a:()=>o});var r=s(67294);const n={},i=r.createContext(n);function o(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/793c86b2.bde2ce98.js b/assets/js/793c86b2.8a6806e5.js similarity index 99% rename from assets/js/793c86b2.bde2ce98.js rename to assets/js/793c86b2.8a6806e5.js index 5f66aae17..330e94e4a 100644 --- a/assets/js/793c86b2.bde2ce98.js +++ b/assets/js/793c86b2.8a6806e5.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[168],{41426:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>r,contentTitle:()=>h,default:()=>c,frontMatter:()=>o,metadata:()=>a,toc:()=>t});var i=s(85893),l=s(11151);const o={title:"Command Line",summary:"Installation and configuration of popular command line programs on Solus"},h="Command Line",a={id:"user/software/command-line/index",title:"Command Line",description:"Changing Shell",source:"@site/docs/user/software/command-line/index.md",sourceDirName:"user/software/command-line",slug:"/user/software/command-line/",permalink:"/docs/user/software/command-line/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/command-line/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Command Line",summary:"Installation and configuration of popular command line programs on Solus"},sidebar:"userSidebar",previous:{title:"DroidCam",permalink:"/docs/user/software/camera/droidcam"},next:{title:"Configuration File Locations",permalink:"/docs/user/software/configuration_files"}},r={},t=[{value:"Changing Shell",id:"changing-shell",level:2},{value:"Installation",id:"installation",level:3},{value:"Switching",id:"switching",level:3},{value:"Troubleshooting",id:"troubleshooting",level:3},{value:"fzf",id:"fzf",level:2},{value:"Installation",id:"installation-1",level:3},{value:"Fuzzy Auto-Completion",id:"fuzzy-auto-completion",level:3},{value:"Bash",id:"bash",level:4},{value:"Zsh",id:"zsh",level:4},{value:"Key Bindings",id:"key-bindings",level:3},{value:"Bash",id:"bash-1",level:4},{value:"Fish",id:"fish",level:4},{value:"Zsh",id:"zsh-1",level:4},{value:"Powerline Shell Prompt",id:"powerline-shell-prompt",level:2},{value:"Installation",id:"installation-2",level:3},{value:"Shell Prompts",id:"shell-prompts",level:3},{value:"Bash",id:"bash-2",level:4},{value:"Busybox and dash",id:"busybox-and-dash",level:4},{value:"Fish",id:"fish-1",level:4},{value:"Zsh",id:"zsh-2",level:4}];function d(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,l.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"command-line",children:"Command Line"})}),"\n",(0,i.jsx)(n.h2,{id:"changing-shell",children:"Changing Shell"}),"\n",(0,i.jsx)(n.p,{children:"When using a terminal session to perform command-line activities, a Unix shell is used to interpret commands. The default shell on Solus is Bash, however changing your shell may enable additional features and functionality."}),"\n",(0,i.jsxs)(n.p,{children:["Solus makes available other shells via our repository, with a full list available in ",(0,i.jsx)(n.code,{children:"/usr/share/defaults/etc/shells"}),". Common shells, aside from Bash, are:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"http://gondor.apana.org.au/~herbert/dash/",children:"DASH"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://fishshell.com/",children:"fish"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://zsh.sourceforge.io/",children:"zsh"})}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,i.jsxs)(n.p,{children:["In order to use a shell different from Bash, you may need to install the respective package for the shell to be able to work. You will find those packages in the Software Center within the ",(0,i.jsx)(n.em,{children:"System utilities"})," category, or via the command-line with ",(0,i.jsx)(n.code,{children:"sudo eopkg install "}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install fish\n"})}),"\n",(0,i.jsx)(n.h3,{id:"switching",children:"Switching"}),"\n",(0,i.jsxs)(n.p,{children:["To switch to another shell, first install the appropriate package, followed by the command ",(0,i.jsx)(n.code,{children:"chsh"})," (change shell) to change the shell for your user session, using the path provided in ",(0,i.jsx)(n.code,{children:"/usr/share/defaults/etc/shells"}),". Lastly you need to log out and back in again for the change to take effect."]}),"\n",(0,i.jsx)(n.p,{children:"Example:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["For zsh: ",(0,i.jsx)(n.code,{children:"chsh -s /bin/zsh"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["For fish: ",(0,i.jsx)(n.code,{children:"chsh -s /usr/bin/fish"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,i.jsxs)(n.p,{children:["If the default shell is not changed, you must add the shell to ",(0,i.jsx)(n.code,{children:"/etc/shells"})," via the command ",(0,i.jsx)(n.code,{children:"sh"})," with ",(0,i.jsx)(n.code,{children:"sudo"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Example:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["For zsh: ",(0,i.jsx)(n.code,{children:'echo "/bin/zsh" | sudo tee -a /etc/shells'})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["For fish: ",(0,i.jsx)(n.code,{children:'echo "/usr/bin/fish" | sudo tee -a /etc/shells'})]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"fzf",children:"fzf"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://github.com/junegunn/fzf",children:"fzf"})," is a general-purpose command-line fuzzy finder. It can be used as an interactive Unix filter with any list: files, command history, processes, hostnames, bookmarks, git commits, etc."]}),"\n",(0,i.jsx)(n.h3,{id:"installation-1",children:"Installation"}),"\n",(0,i.jsxs)(n.p,{children:["The fzf project consists of the following components: an ",(0,i.jsx)(n.code,{children:"fzf"})," executable, an ",(0,i.jsx)(n.code,{children:"fzf-tmux"})," script for launching fzf in a tmux pane, shell extensions (including key bindings and command-line fuzzy auto-completion), and a vim/Neovim plugin file. They are all available in the ",(0,i.jsx)(n.code,{children:"fzf"})," package in the Software Center or via eopkg in a terminal:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it fzf\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The shell extensions are not enabled by default after the ",(0,i.jsx)(n.code,{children:"fzf"})," package is installed. The procedures to enable these features are described below. For more tips and examples on the usage of ",(0,i.jsx)(n.code,{children:"fzf"}),", visit its ",(0,i.jsx)(n.a,{href:"https://github.com/junegunn/fzf",children:"GitHub repository"})," and ",(0,i.jsx)(n.a,{href:"https://github.com/junegunn/fzf/wiki/examples",children:"Wiki pages"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"fuzzy-auto-completion",children:"Fuzzy Auto-Completion"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://github.com/junegunn/fzf#fuzzy-completion-for-bash-and-zsh",children:"Fuzzy completion"})," for files and directories can be triggered by a trigger sequence (",(0,i.jsx)(n.code,{children:"**"})," by default) followed by the ",(0,i.jsx)(n.code,{children:"TAB"})," key for ",(0,i.jsx)(n.code,{children:"bash"})," and ",(0,i.jsx)(n.code,{children:"zsh"}),". To enable this feature, add the following lines to the shell configuration file depending on the shell you use (",(0,i.jsx)(n.code,{children:"~/.bashrc"})," for ",(0,i.jsx)(n.code,{children:"bash"})," and ",(0,i.jsx)(n.code,{children:"~/.zshrc"})," for ",(0,i.jsx)(n.code,{children:"zsh"}),")."]}),"\n",(0,i.jsx)(n.h4,{id:"bash",children:"Bash"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"FZF_COMPLETION_FILE=/usr/share/bash-completion/completions/fzf\n[[ -f $FZF_COMPLETION_FILE ]] && source $FZF_COMPLETION_FILE\n"})}),"\n",(0,i.jsx)(n.h4,{id:"zsh",children:"Zsh"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"FZF_COMPLETION_FILE=/usr/share/zsh/site-functions/_fzf\n[[ -f $FZF_COMPLETION_FILE ]] && source $FZF_COMPLETION_FILE\n"})}),"\n",(0,i.jsx)(n.h3,{id:"key-bindings",children:"Key Bindings"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"fzf"})," can use specific ",(0,i.jsx)(n.a,{href:"https://github.com/junegunn/fzf#key-bindings-for-command-line",children:"key bindings"})," to trigger a search over a list of files, command history and directories and paste the result onto the command-line. Follow these steps to set up the key bindings for your favorite shell."]}),"\n",(0,i.jsx)(n.h4,{id:"bash-1",children:"Bash"}),"\n",(0,i.jsxs)(n.p,{children:["Add the following content to ",(0,i.jsx)(n.code,{children:"~/.bashrc"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"FZF_KEYBINDING_FILE=/usr/share/fzf/key-bindings.bash\n[[ -f $FZF_KEYBINDING_FILE ]] && source $FZF_KEYBINDING_FILE\n"})}),"\n",(0,i.jsx)(n.h4,{id:"fish",children:"Fish"}),"\n",(0,i.jsx)(n.p,{children:"First create the following directory if it does not already exist:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"mkdir -p $HOME/.config/fish/functions\n"})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"cd"})," into this directory and make a file ",(0,i.jsx)(n.code,{children:"fish_user_key_bindings.fish"})," with the following content:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"function fish_user_key_bindings\n fzf_key_bindings\nend\n"})}),"\n",(0,i.jsx)(n.p,{children:"Then create the following symlink:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"ln -s /usr/share/fzf/key-bindings.fish $HOME/.config/fish/functions/fzf_key_bindings.fish\n"})}),"\n",(0,i.jsx)(n.h4,{id:"zsh-1",children:"Zsh"}),"\n",(0,i.jsxs)(n.p,{children:["Add the following content to ",(0,i.jsx)(n.code,{children:"~/.zshrc"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"FZF_KEYBINDING_FILE=/usr/share/fzf/key-bindings.zsh\n[[ -f $FZF_KEYBINDING_FILE ]] && source $FZF_KEYBINDING_FILE\n"})}),"\n",(0,i.jsx)(n.h2,{id:"powerline-shell-prompt",children:"Powerline Shell Prompt"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://github.com/powerline",children:"Powerline"})," is a statusline plugin for vim, and provides statuslines and prompts for several other applications, including zsh, bash, tmux, IPython, Awesome and Qtile."]}),"\n",(0,i.jsx)(n.h3,{id:"installation-2",children:"Installation"}),"\n",(0,i.jsxs)(n.p,{children:["Powerline has two components, the plugin system itself ",(0,i.jsx)(n.code,{children:"powerline"})," and the\nfonts ",(0,i.jsx)(n.code,{children:"powerline-fonts"}),". Both are available in the Software Center or via ",(0,i.jsx)(n.code,{children:"eopkg"})," in a terminal:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it powerline powerline-fonts\n"})}),"\n",(0,i.jsxs)(n.p,{children:["To get powerline working inside your terminal, you need to add the following commands to the ",(0,i.jsx)(n.code,{children:".bashrc"})," inside your ",(0,i.jsx)(n.code,{children:"$HOME"})," directory."]}),"\n",(0,i.jsx)(n.h3,{id:"shell-prompts",children:"Shell Prompts"}),"\n",(0,i.jsx)(n.p,{children:"The Powerline daemon is not running automatically by any of the bindings. It is advised to add the following before any other powerline-related code in the shell configuration file"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"powerline-daemon -q\n"})}),"\n",(0,i.jsx)(n.h4,{id:"bash-2",children:"Bash"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"powerline-daemon -q\nPOWERLINE_BASH_CONTINUATION=1\nPOWERLINE_BASH_SELECT=1\nsource /usr/lib/python3.11/site-packages/powerline/bindings/bash/powerline.sh\n"})}),"\n",(0,i.jsx)(n.h4,{id:"busybox-and-dash",children:"Busybox and dash"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"source /usr/lib/python3.11/site-packages/powerline/bindings/shell/powerline.sh\n"})}),"\n",(0,i.jsx)(n.h4,{id:"fish-1",children:"Fish"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'set fish_function_path $fish_function_path "/usr/lib/python3.11/site-packages/powerline/bindings/fish/"\n'})}),"\n",(0,i.jsx)(n.h4,{id:"zsh-2",children:"Zsh"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"source /usr/lib/python3.11/site-packages/powerline/bindings/zsh/powerline.zsh\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Read more about powerline on its ",(0,i.jsx)(n.a,{href:"https://powerline.readthedocs.io/en/master/usage.html#shell-prompts-requirements",children:"docs website"})]})]})}function c(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,n,s)=>{s.d(n,{Z:()=>a,a:()=>h});var i=s(67294);const l={},o=i.createContext(l);function h(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:h(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[168],{41426:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>r,contentTitle:()=>h,default:()=>c,frontMatter:()=>o,metadata:()=>a,toc:()=>t});var i=s(85893),l=s(11151);const o={title:"Command Line",summary:"Installation and configuration of popular command line programs on Solus"},h="Command Line",a={id:"user/software/command-line/index",title:"Command Line",description:"Changing Shell",source:"@site/docs/user/software/command-line/index.md",sourceDirName:"user/software/command-line",slug:"/user/software/command-line/",permalink:"/docs/user/software/command-line/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/command-line/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Command Line",summary:"Installation and configuration of popular command line programs on Solus"},sidebar:"userSidebar",previous:{title:"DroidCam",permalink:"/docs/user/software/camera/droidcam"},next:{title:"Configuration File Locations",permalink:"/docs/user/software/configuration_files"}},r={},t=[{value:"Changing Shell",id:"changing-shell",level:2},{value:"Installation",id:"installation",level:3},{value:"Switching",id:"switching",level:3},{value:"Troubleshooting",id:"troubleshooting",level:3},{value:"fzf",id:"fzf",level:2},{value:"Installation",id:"installation-1",level:3},{value:"Fuzzy Auto-Completion",id:"fuzzy-auto-completion",level:3},{value:"Bash",id:"bash",level:4},{value:"Zsh",id:"zsh",level:4},{value:"Key Bindings",id:"key-bindings",level:3},{value:"Bash",id:"bash-1",level:4},{value:"Fish",id:"fish",level:4},{value:"Zsh",id:"zsh-1",level:4},{value:"Powerline Shell Prompt",id:"powerline-shell-prompt",level:2},{value:"Installation",id:"installation-2",level:3},{value:"Shell Prompts",id:"shell-prompts",level:3},{value:"Bash",id:"bash-2",level:4},{value:"Busybox and dash",id:"busybox-and-dash",level:4},{value:"Fish",id:"fish-1",level:4},{value:"Zsh",id:"zsh-2",level:4}];function d(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,l.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"command-line",children:"Command Line"})}),"\n",(0,i.jsx)(n.h2,{id:"changing-shell",children:"Changing Shell"}),"\n",(0,i.jsx)(n.p,{children:"When using a terminal session to perform command-line activities, a Unix shell is used to interpret commands. The default shell on Solus is Bash, however changing your shell may enable additional features and functionality."}),"\n",(0,i.jsxs)(n.p,{children:["Solus makes available other shells via our repository, with a full list available in ",(0,i.jsx)(n.code,{children:"/usr/share/defaults/etc/shells"}),". Common shells, aside from Bash, are:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"http://gondor.apana.org.au/~herbert/dash/",children:"DASH"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://fishshell.com/",children:"fish"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://zsh.sourceforge.io/",children:"zsh"})}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,i.jsxs)(n.p,{children:["In order to use a shell different from Bash, you may need to install the respective package for the shell to be able to work. You will find those packages in the Software Center within the ",(0,i.jsx)(n.em,{children:"System utilities"})," category, or via the command-line with ",(0,i.jsx)(n.code,{children:"sudo eopkg install "}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install fish\n"})}),"\n",(0,i.jsx)(n.h3,{id:"switching",children:"Switching"}),"\n",(0,i.jsxs)(n.p,{children:["To switch to another shell, first install the appropriate package, followed by the command ",(0,i.jsx)(n.code,{children:"chsh"})," (change shell) to change the shell for your user session, using the path provided in ",(0,i.jsx)(n.code,{children:"/usr/share/defaults/etc/shells"}),". Lastly you need to log out and back in again for the change to take effect."]}),"\n",(0,i.jsx)(n.p,{children:"Example:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["For zsh: ",(0,i.jsx)(n.code,{children:"chsh -s /bin/zsh"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["For fish: ",(0,i.jsx)(n.code,{children:"chsh -s /usr/bin/fish"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,i.jsxs)(n.p,{children:["If the default shell is not changed, you must add the shell to ",(0,i.jsx)(n.code,{children:"/etc/shells"})," via the command ",(0,i.jsx)(n.code,{children:"sh"})," with ",(0,i.jsx)(n.code,{children:"sudo"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Example:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["For zsh: ",(0,i.jsx)(n.code,{children:'echo "/bin/zsh" | sudo tee -a /etc/shells'})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["For fish: ",(0,i.jsx)(n.code,{children:'echo "/usr/bin/fish" | sudo tee -a /etc/shells'})]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"fzf",children:"fzf"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://github.com/junegunn/fzf",children:"fzf"})," is a general-purpose command-line fuzzy finder. It can be used as an interactive Unix filter with any list: files, command history, processes, hostnames, bookmarks, git commits, etc."]}),"\n",(0,i.jsx)(n.h3,{id:"installation-1",children:"Installation"}),"\n",(0,i.jsxs)(n.p,{children:["The fzf project consists of the following components: an ",(0,i.jsx)(n.code,{children:"fzf"})," executable, an ",(0,i.jsx)(n.code,{children:"fzf-tmux"})," script for launching fzf in a tmux pane, shell extensions (including key bindings and command-line fuzzy auto-completion), and a vim/Neovim plugin file. They are all available in the ",(0,i.jsx)(n.code,{children:"fzf"})," package in the Software Center or via eopkg in a terminal:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it fzf\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The shell extensions are not enabled by default after the ",(0,i.jsx)(n.code,{children:"fzf"})," package is installed. The procedures to enable these features are described below. For more tips and examples on the usage of ",(0,i.jsx)(n.code,{children:"fzf"}),", visit its ",(0,i.jsx)(n.a,{href:"https://github.com/junegunn/fzf",children:"GitHub repository"})," and ",(0,i.jsx)(n.a,{href:"https://github.com/junegunn/fzf/wiki/examples",children:"Wiki pages"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"fuzzy-auto-completion",children:"Fuzzy Auto-Completion"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://github.com/junegunn/fzf#fuzzy-completion-for-bash-and-zsh",children:"Fuzzy completion"})," for files and directories can be triggered by a trigger sequence (",(0,i.jsx)(n.code,{children:"**"})," by default) followed by the ",(0,i.jsx)(n.code,{children:"TAB"})," key for ",(0,i.jsx)(n.code,{children:"bash"})," and ",(0,i.jsx)(n.code,{children:"zsh"}),". To enable this feature, add the following lines to the shell configuration file depending on the shell you use (",(0,i.jsx)(n.code,{children:"~/.bashrc"})," for ",(0,i.jsx)(n.code,{children:"bash"})," and ",(0,i.jsx)(n.code,{children:"~/.zshrc"})," for ",(0,i.jsx)(n.code,{children:"zsh"}),")."]}),"\n",(0,i.jsx)(n.h4,{id:"bash",children:"Bash"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"FZF_COMPLETION_FILE=/usr/share/bash-completion/completions/fzf\n[[ -f $FZF_COMPLETION_FILE ]] && source $FZF_COMPLETION_FILE\n"})}),"\n",(0,i.jsx)(n.h4,{id:"zsh",children:"Zsh"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"FZF_COMPLETION_FILE=/usr/share/zsh/site-functions/_fzf\n[[ -f $FZF_COMPLETION_FILE ]] && source $FZF_COMPLETION_FILE\n"})}),"\n",(0,i.jsx)(n.h3,{id:"key-bindings",children:"Key Bindings"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"fzf"})," can use specific ",(0,i.jsx)(n.a,{href:"https://github.com/junegunn/fzf#key-bindings-for-command-line",children:"key bindings"})," to trigger a search over a list of files, command history and directories and paste the result onto the command-line. Follow these steps to set up the key bindings for your favorite shell."]}),"\n",(0,i.jsx)(n.h4,{id:"bash-1",children:"Bash"}),"\n",(0,i.jsxs)(n.p,{children:["Add the following content to ",(0,i.jsx)(n.code,{children:"~/.bashrc"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"FZF_KEYBINDING_FILE=/usr/share/fzf/key-bindings.bash\n[[ -f $FZF_KEYBINDING_FILE ]] && source $FZF_KEYBINDING_FILE\n"})}),"\n",(0,i.jsx)(n.h4,{id:"fish",children:"Fish"}),"\n",(0,i.jsx)(n.p,{children:"First create the following directory if it does not already exist:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"mkdir -p $HOME/.config/fish/functions\n"})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"cd"})," into this directory and make a file ",(0,i.jsx)(n.code,{children:"fish_user_key_bindings.fish"})," with the following content:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"function fish_user_key_bindings\n fzf_key_bindings\nend\n"})}),"\n",(0,i.jsx)(n.p,{children:"Then create the following symlink:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"ln -s /usr/share/fzf/key-bindings.fish $HOME/.config/fish/functions/fzf_key_bindings.fish\n"})}),"\n",(0,i.jsx)(n.h4,{id:"zsh-1",children:"Zsh"}),"\n",(0,i.jsxs)(n.p,{children:["Add the following content to ",(0,i.jsx)(n.code,{children:"~/.zshrc"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"FZF_KEYBINDING_FILE=/usr/share/fzf/key-bindings.zsh\n[[ -f $FZF_KEYBINDING_FILE ]] && source $FZF_KEYBINDING_FILE\n"})}),"\n",(0,i.jsx)(n.h2,{id:"powerline-shell-prompt",children:"Powerline Shell Prompt"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://github.com/powerline",children:"Powerline"})," is a statusline plugin for vim, and provides statuslines and prompts for several other applications, including zsh, bash, tmux, IPython, Awesome and Qtile."]}),"\n",(0,i.jsx)(n.h3,{id:"installation-2",children:"Installation"}),"\n",(0,i.jsxs)(n.p,{children:["Powerline has two components, the plugin system itself ",(0,i.jsx)(n.code,{children:"powerline"})," and the\nfonts ",(0,i.jsx)(n.code,{children:"powerline-fonts"}),". Both are available in the Software Center or via ",(0,i.jsx)(n.code,{children:"eopkg"})," in a terminal:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it powerline powerline-fonts\n"})}),"\n",(0,i.jsxs)(n.p,{children:["To get powerline working inside your terminal, you need to add the following commands to the ",(0,i.jsx)(n.code,{children:".bashrc"})," inside your ",(0,i.jsx)(n.code,{children:"$HOME"})," directory."]}),"\n",(0,i.jsx)(n.h3,{id:"shell-prompts",children:"Shell Prompts"}),"\n",(0,i.jsx)(n.p,{children:"The Powerline daemon is not running automatically by any of the bindings. It is advised to add the following before any other powerline-related code in the shell configuration file"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"powerline-daemon -q\n"})}),"\n",(0,i.jsx)(n.h4,{id:"bash-2",children:"Bash"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"powerline-daemon -q\nPOWERLINE_BASH_CONTINUATION=1\nPOWERLINE_BASH_SELECT=1\nsource /usr/lib/python3.11/site-packages/powerline/bindings/bash/powerline.sh\n"})}),"\n",(0,i.jsx)(n.h4,{id:"busybox-and-dash",children:"Busybox and dash"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"source /usr/lib/python3.11/site-packages/powerline/bindings/shell/powerline.sh\n"})}),"\n",(0,i.jsx)(n.h4,{id:"fish-1",children:"Fish"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'set fish_function_path $fish_function_path "/usr/lib/python3.11/site-packages/powerline/bindings/fish/"\n'})}),"\n",(0,i.jsx)(n.h4,{id:"zsh-2",children:"Zsh"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"source /usr/lib/python3.11/site-packages/powerline/bindings/zsh/powerline.zsh\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Read more about powerline on its ",(0,i.jsx)(n.a,{href:"https://powerline.readthedocs.io/en/master/usage.html#shell-prompts-requirements",children:"docs website"})]})]})}function c(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,n,s)=>{s.d(n,{Z:()=>a,a:()=>h});var i=s(67294);const l={},o=i.createContext(l);function h(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:h(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7a24477a.c470cba2.js b/assets/js/7a24477a.313ad2fb.js similarity index 99% rename from assets/js/7a24477a.c470cba2.js rename to assets/js/7a24477a.313ad2fb.js index 0cc87689f..9c3f55ca8 100644 --- a/assets/js/7a24477a.c470cba2.js +++ b/assets/js/7a24477a.313ad2fb.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9135],{44308:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=i(85893),s=i(11151);const o={title:"Getting Involved",summary:"Getting involved with the Solus community"},r="Getting Involved",l={id:"user/contributing/getting-involved",title:"Getting Involved",description:"Solus is a big undertaking, and as such there are many ways in which your involvement can help us. Naturally, that means there are also many ways in which you can help out.",source:"@site/docs/user/contributing/getting-involved.md",sourceDirName:"user/contributing",slug:"/user/contributing/getting-involved",permalink:"/docs/user/contributing/getting-involved",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/contributing/getting-involved.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Getting Involved",summary:"Getting involved with the Solus community"},sidebar:"userSidebar",previous:{title:"Community Guidelines",permalink:"/docs/user/contributing/community-guidelines"},next:{title:"Solus Style Guide",permalink:"/docs/user/contributing/style"}},a={},u=[{value:"Engaging with the community",id:"engaging-with-the-community",level:2},{value:"Community guidelines",id:"community-guidelines",level:3},{value:"Community forums",id:"community-forums",level:3},{value:"Matrix (chat)",id:"matrix-chat",level:3},{value:"Social Media",id:"social-media",level:3},{value:"Funding",id:"funding",level:2},{value:"Improving documentation",id:"improving-documentation",level:2},{value:"Packaging",id:"packaging",level:2},{value:"Report bugs",id:"report-bugs",level:2},{value:"Translations",id:"translations",level:2}];function c(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"getting-involved",children:"Getting Involved"})}),"\n",(0,n.jsx)(t.p,{children:"Solus is a big undertaking, and as such there are many ways in which your involvement can help us. Naturally, that means there are also many ways in which you can help out."}),"\n",(0,n.jsx)(t.h2,{id:"engaging-with-the-community",children:"Engaging with the community"}),"\n",(0,n.jsx)(t.h3,{id:"community-guidelines",children:"Community guidelines"}),"\n",(0,n.jsxs)(t.p,{children:["Solus enforces a set of community guidelines to maintain respect and professionalism, as well as a family-friendly environment. Please view our community guidelines ",(0,n.jsx)(t.a,{href:"/docs/user/contributing/community-guidelines",children:"here"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"community-forums",children:"Community forums"}),"\n",(0,n.jsxs)(t.p,{children:["With so many new users joining, there are always more people needing help. A great way to help us out, would be to help out our users on the ",(0,n.jsx)(t.a,{href:"https://discuss.getsol.us",children:"Solus Forums"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"matrix-chat",children:"Matrix (chat)"}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https:/.wikipedia.org/wiki/Matrix_(protocol)",children:"Matrix"})," is a great way to discuss issues and development with the community, and project developers in real-time. It's also a great place for getting support, but remember due\nto timezone differences there might not always be people there to answer your question immediately. You can access Matrix using a client like ",(0,n.jsx)(t.a,{href:"https://app.element.io/",children:"Element Web"}),", or many ",(0,n.jsx)(t.a,{href:"https://matrix.org/ecosystem/clients/",children:"others"}),". You will need a Matrix account."]}),"\n",(0,n.jsxs)(t.p,{children:["You will find the following Solus rooms on the ",(0,n.jsx)(t.code,{children:"matrix.org"})," homeserver:"]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsxs)(t.a,{href:"https://matrix.to/#/#solus-support:matrix.org",children:["#solus-support",":matrix",".org"]})," Support room"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsxs)(t.a,{href:"https://matrix.to/#/#solus-off-topic:matrix.org",children:["#solus-off-topic",":matrix",".org"]})," Off-topic room"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsxs)(t.a,{href:"https://matrix.to/#/#solus-packaging:matrix.org",children:["#solus-packaging",":matrix",".org"]})," Packaging-related room"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsxs)(t.a,{href:"https://matrix.to/#/#solus-development:matrix.org",children:["#solus-development",":matrix",".org"]})," Development-related room"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsxs)(t.a,{href:"https://matrix.to/#/#solus-devlog:matrix.org",children:["#solus-devlog",":matrix",".org"]})," Commit and Pull Request notifications from the ",(0,n.jsx)(t.code,{children:"getsolus"})," GitHub organization (developer oriented, read-only)"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsxs)(t.a,{href:"https://matrix.to/#/#solus:matrix.org",children:["#solus",":matrix",".org"]})," ",(0,n.jsx)(t.strong,{children:"Matrix Space containing all rooms"})]}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"social-media",children:"Social Media"}),"\n",(0,n.jsx)(t.p,{children:"Alongside the forums, you can communicate with developers or others in the community by using one of the following websites:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://www.facebook.com/get.solus",children:"Facebook"})}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://fosstodon.org/@Solus",children:"Mastodon"})}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://www.reddit.com/r/SolusProject/",children:"Reddit"})}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"funding",children:"Funding"}),"\n",(0,n.jsxs)(t.p,{children:["Solus is funded through our ",(0,n.jsx)(t.a,{href:"https://opencollective.com/getsolus",children:"Open Collective"}),", with our fiscal host being the non-profit 501(c)(3) organization ",(0,n.jsx)(t.a,{href:"https://oscollective.org/",children:"Open Source Collective"}),". To read more about what this funding enables us to do take a look at the ",(0,n.jsx)(t.a,{href:"https://opencollective.com/getsolus#category-ABOUT",children:'"About" section of our Open Collective page'}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"improving-documentation",children:"Improving documentation"}),"\n",(0,n.jsxs)(t.p,{children:["Our Help Center improves when the documentation improves. If there are docs that you think would be valuable to add, get involved by submitting pull requests to our ",(0,n.jsx)(t.a,{href:"https://github.com/getsolus/help-center-docs",children:"Help Center Docs"})," repository!"]}),"\n",(0,n.jsx)(t.h2,{id:"packaging",children:"Packaging"}),"\n",(0,n.jsxs)(t.p,{children:["There may be software you wish to have on your system that is currently not available in the repository. While you are more than welcome to submit a bug and wait for someone else to package the software you want, you can also improve\nand contribute to the community by packaging software. If you're interested in learning to package software, feel free to visit our documentation ",(0,n.jsx)(t.a,{href:"/docs/packaging/",children:"here"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"report-bugs",children:"Report bugs"}),"\n",(0,n.jsx)(t.p,{children:"We're always looking to improve our systems, especially when they're not functioning as expected. By reporting bugs, you improve the system not only for you, but for all Solus users."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://issues.getsol.us",children:"Main Solus GitHub Issue Tracker"}),"\nMost bug reports about Solus itself, and its packages, should be filed here."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/getsolus",children:"Other Solus GitHub Repositories"}),"\nCertain parts of Solus, such as the Software Center, have repositories in the ",(0,n.jsx)(t.code,{children:"getsolus"})," organization on GitHub. Check here to see if the system in question is listed. If so, file the bug in the appropriate repository."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/BuddiesOfBudgie/budgie-desktop/issues",children:"Budgie Desktop"}),"\nBudgie Desktop issues are filed in the ",(0,n.jsx)(t.code,{children:"BuddiesOfBudgie/budgie-desktop"})," repository on GitHub."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"translations",children:"Translations"}),"\n",(0,n.jsxs)(t.p,{children:["Assistance is always welcome in translating our projects ",(0,n.jsx)(t.a,{href:"/docs/packaging/translation-instructions",children:"to other languages"}),"!"]})]})}function h(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},11151:(e,t,i)=>{i.d(t,{Z:()=>l,a:()=>r});var n=i(67294);const s={},o=n.createContext(s);function r(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9135],{44308:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=i(85893),s=i(11151);const o={title:"Getting Involved",summary:"Getting involved with the Solus community"},r="Getting Involved",l={id:"user/contributing/getting-involved",title:"Getting Involved",description:"Solus is a big undertaking, and as such there are many ways in which your involvement can help us. Naturally, that means there are also many ways in which you can help out.",source:"@site/docs/user/contributing/getting-involved.md",sourceDirName:"user/contributing",slug:"/user/contributing/getting-involved",permalink:"/docs/user/contributing/getting-involved",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/contributing/getting-involved.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Getting Involved",summary:"Getting involved with the Solus community"},sidebar:"userSidebar",previous:{title:"Community Guidelines",permalink:"/docs/user/contributing/community-guidelines"},next:{title:"Solus Style Guide",permalink:"/docs/user/contributing/style"}},a={},u=[{value:"Engaging with the community",id:"engaging-with-the-community",level:2},{value:"Community guidelines",id:"community-guidelines",level:3},{value:"Community forums",id:"community-forums",level:3},{value:"Matrix (chat)",id:"matrix-chat",level:3},{value:"Social Media",id:"social-media",level:3},{value:"Funding",id:"funding",level:2},{value:"Improving documentation",id:"improving-documentation",level:2},{value:"Packaging",id:"packaging",level:2},{value:"Report bugs",id:"report-bugs",level:2},{value:"Translations",id:"translations",level:2}];function c(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"getting-involved",children:"Getting Involved"})}),"\n",(0,n.jsx)(t.p,{children:"Solus is a big undertaking, and as such there are many ways in which your involvement can help us. Naturally, that means there are also many ways in which you can help out."}),"\n",(0,n.jsx)(t.h2,{id:"engaging-with-the-community",children:"Engaging with the community"}),"\n",(0,n.jsx)(t.h3,{id:"community-guidelines",children:"Community guidelines"}),"\n",(0,n.jsxs)(t.p,{children:["Solus enforces a set of community guidelines to maintain respect and professionalism, as well as a family-friendly environment. Please view our community guidelines ",(0,n.jsx)(t.a,{href:"/docs/user/contributing/community-guidelines",children:"here"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"community-forums",children:"Community forums"}),"\n",(0,n.jsxs)(t.p,{children:["With so many new users joining, there are always more people needing help. A great way to help us out, would be to help out our users on the ",(0,n.jsx)(t.a,{href:"https://discuss.getsol.us",children:"Solus Forums"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"matrix-chat",children:"Matrix (chat)"}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https:/.wikipedia.org/wiki/Matrix_(protocol)",children:"Matrix"})," is a great way to discuss issues and development with the community, and project developers in real-time. It's also a great place for getting support, but remember due\nto timezone differences there might not always be people there to answer your question immediately. You can access Matrix using a client like ",(0,n.jsx)(t.a,{href:"https://app.element.io/",children:"Element Web"}),", or many ",(0,n.jsx)(t.a,{href:"https://matrix.org/ecosystem/clients/",children:"others"}),". You will need a Matrix account."]}),"\n",(0,n.jsxs)(t.p,{children:["You will find the following Solus rooms on the ",(0,n.jsx)(t.code,{children:"matrix.org"})," homeserver:"]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsxs)(t.a,{href:"https://matrix.to/#/#solus-support:matrix.org",children:["#solus-support",":matrix",".org"]})," Support room"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsxs)(t.a,{href:"https://matrix.to/#/#solus-off-topic:matrix.org",children:["#solus-off-topic",":matrix",".org"]})," Off-topic room"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsxs)(t.a,{href:"https://matrix.to/#/#solus-packaging:matrix.org",children:["#solus-packaging",":matrix",".org"]})," Packaging-related room"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsxs)(t.a,{href:"https://matrix.to/#/#solus-development:matrix.org",children:["#solus-development",":matrix",".org"]})," Development-related room"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsxs)(t.a,{href:"https://matrix.to/#/#solus-devlog:matrix.org",children:["#solus-devlog",":matrix",".org"]})," Commit and Pull Request notifications from the ",(0,n.jsx)(t.code,{children:"getsolus"})," GitHub organization (developer oriented, read-only)"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsxs)(t.a,{href:"https://matrix.to/#/#solus:matrix.org",children:["#solus",":matrix",".org"]})," ",(0,n.jsx)(t.strong,{children:"Matrix Space containing all rooms"})]}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"social-media",children:"Social Media"}),"\n",(0,n.jsx)(t.p,{children:"Alongside the forums, you can communicate with developers or others in the community by using one of the following websites:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://www.facebook.com/get.solus",children:"Facebook"})}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://fosstodon.org/@Solus",children:"Mastodon"})}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://www.reddit.com/r/SolusProject/",children:"Reddit"})}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"funding",children:"Funding"}),"\n",(0,n.jsxs)(t.p,{children:["Solus is funded through our ",(0,n.jsx)(t.a,{href:"https://opencollective.com/getsolus",children:"Open Collective"}),", with our fiscal host being the non-profit 501(c)(3) organization ",(0,n.jsx)(t.a,{href:"https://oscollective.org/",children:"Open Source Collective"}),". To read more about what this funding enables us to do take a look at the ",(0,n.jsx)(t.a,{href:"https://opencollective.com/getsolus#category-ABOUT",children:'"About" section of our Open Collective page'}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"improving-documentation",children:"Improving documentation"}),"\n",(0,n.jsxs)(t.p,{children:["Our Help Center improves when the documentation improves. If there are docs that you think would be valuable to add, get involved by submitting pull requests to our ",(0,n.jsx)(t.a,{href:"https://github.com/getsolus/help-center-docs",children:"Help Center Docs"})," repository!"]}),"\n",(0,n.jsx)(t.h2,{id:"packaging",children:"Packaging"}),"\n",(0,n.jsxs)(t.p,{children:["There may be software you wish to have on your system that is currently not available in the repository. While you are more than welcome to submit a bug and wait for someone else to package the software you want, you can also improve\nand contribute to the community by packaging software. If you're interested in learning to package software, feel free to visit our documentation ",(0,n.jsx)(t.a,{href:"/docs/packaging/",children:"here"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"report-bugs",children:"Report bugs"}),"\n",(0,n.jsx)(t.p,{children:"We're always looking to improve our systems, especially when they're not functioning as expected. By reporting bugs, you improve the system not only for you, but for all Solus users."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://issues.getsol.us",children:"Main Solus GitHub Issue Tracker"}),"\nMost bug reports about Solus itself, and its packages, should be filed here."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/getsolus",children:"Other Solus GitHub Repositories"}),"\nCertain parts of Solus, such as the Software Center, have repositories in the ",(0,n.jsx)(t.code,{children:"getsolus"})," organization on GitHub. Check here to see if the system in question is listed. If so, file the bug in the appropriate repository."]}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.a,{href:"https://github.com/BuddiesOfBudgie/budgie-desktop/issues",children:"Budgie Desktop"}),"\nBudgie Desktop issues are filed in the ",(0,n.jsx)(t.code,{children:"BuddiesOfBudgie/budgie-desktop"})," repository on GitHub."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"translations",children:"Translations"}),"\n",(0,n.jsxs)(t.p,{children:["Assistance is always welcome in translating our projects ",(0,n.jsx)(t.a,{href:"/docs/packaging/translation-instructions",children:"to other languages"}),"!"]})]})}function h(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},11151:(e,t,i)=>{i.d(t,{Z:()=>l,a:()=>r});var n=i(67294);const s={},o=n.createContext(s);function r(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7c1fb106.a883ee2e.js b/assets/js/7c1fb106.4e5283bc.js similarity index 99% rename from assets/js/7c1fb106.a883ee2e.js rename to assets/js/7c1fb106.4e5283bc.js index b8085707e..83eeb1d90 100644 --- a/assets/js/7c1fb106.a883ee2e.js +++ b/assets/js/7c1fb106.4e5283bc.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4605],{66334:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var i=a(85893),n=a(11151);const s={title:"Appstream Metainfo",summary:"The purpose and format of Appstream Metainfo"},r="AppStream Metainfo",o={id:"packaging/appstream-metainfo",title:"Appstream Metainfo",description:"AppStream metainfo is required for all graphical application in Solus repository.",source:"@site/docs/packaging/appstream-metainfo.md",sourceDirName:"packaging",slug:"/packaging/appstream-metainfo",permalink:"/docs/packaging/appstream-metainfo",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/appstream-metainfo.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Appstream Metainfo",summary:"The purpose and format of Appstream Metainfo"},sidebar:"packagingSidebar",previous:{title:"Local Repository",permalink:"/docs/packaging/advanced-config/local-repository"},next:{title:"Git Basics",permalink:"/docs/packaging/git-basics"}},p={},c=[{value:"Adding appstream metainfo to an existing package",id:"adding-appstream-metainfo-to-an-existing-package",level:2},{value:"Testing appstream metainfo",id:"testing-appstream-metainfo",level:2},{value:"Other Info",id:"other-info",level:2}];function d(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"appstream-metainfo",children:"AppStream Metainfo"})}),"\n",(0,i.jsx)(t.admonition,{type:"important",children:(0,i.jsx)(t.p,{children:"AppStream metainfo is required for all graphical application in Solus repository."})}),"\n",(0,i.jsx)(t.p,{children:"AppStream allows upstream projects to define metadata about the components they provide using small XML files, metainfo files, which get installed into locations on the client system and are used by distributors to enhance their metadata."}),"\n",(0,i.jsx)(t.p,{children:"AppStream metainfo become a requirement for all graphical application in Solus repository because software centers such as GNOME software and KDE Discover rely on it to display applications that are available in repository. AppStream metainfo should be shipped by the upstream project, bundled in with its source, but sometimes upstream projects don't do so. In which case, packagers are required to add AppStream metainfo themselves."}),"\n",(0,i.jsx)(t.h2,{id:"adding-appstream-metainfo-to-an-existing-package",children:"Adding appstream metainfo to an existing package"}),"\n",(0,i.jsx)(t.p,{children:"There are a few scenarios that Packagers might encounter:"}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"No"}),(0,i.jsx)(t.th,{children:"Scenario"}),(0,i.jsx)(t.th,{children:"Solution"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"1"}),(0,i.jsx)(t.td,{children:"An application already provides appstream metainfo"}),(0,i.jsx)(t.td,{children:"Nothing to do"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"2"}),(0,i.jsx)(t.td,{children:"An application contains appstream metainfo in the source package but we do not install it"}),(0,i.jsxs)(t.td,{children:["Install the appstream metainfo to ",(0,i.jsx)(t.code,{children:"/usr/share/metainfo"}),". ",(0,i.jsx)(t.em,{children:"Example"}),": ",(0,i.jsx)(t.a,{href:"https://github.com/getsolus/packages/commit/0a726a53454e7c8a6b0e66de69d59bcc66f0fc19",children:"here"})]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"3"}),(0,i.jsx)(t.td,{children:"An application doesn't contain appstream metainfo in the source package but it exists on Flathub"}),(0,i.jsxs)(t.td,{children:["Borrow and tweak the appstream metainfo from the Flathub repo. Encourage upstream project to add it to their source. ",(0,i.jsx)(t.em,{children:"Example"}),": ",(0,i.jsx)(t.a,{href:"https://github.com/getsolus/packages/commit/da2f65b93f412da43d1db9edbcb08bb90517a0eb",children:"here"})]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"4"}),(0,i.jsx)(t.td,{children:"An application doesn't provide appstream metainfo and it doesn't exist on flathub"}),(0,i.jsxs)(t.td,{children:["Write the appstream metadata, submit it to upstream project. ",(0,i.jsx)(t.em,{children:"Example"}),": ",(0,i.jsx)(t.a,{href:"https://github.com/getsolus/packages/commit/414219d8b2ceeabe85178d3a467f81b9131016f4",children:"here"})]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"5"}),(0,i.jsx)(t.td,{children:"Appstream metainfo is provided but generation of it is failing"}),(0,i.jsxs)(t.td,{children:["See ",(0,i.jsx)(t.a,{href:"https://github.com/getsolus/solus-appstream-data#debugging-failures",children:"here"}),". ",(0,i.jsx)(t.em,{children:"Example"}),": ",(0,i.jsx)(t.a,{href:"https://github.com/getsolus/packages/commit/583b7c742caf50e2f66a70e9b62e9b91566c03f5",children:"here"}),"."]})]})]})]}),"\n",(0,i.jsxs)(t.p,{children:["AppStream metainfo is to be installed in the ",(0,i.jsx)(t.code,{children:"/usr/share/metainfo/"})," directory. It must be placed in the package which should be installed in order to get the software described by the respective metadata. This means that you might need to move the _.metainfo.xml or _.appdata.xml to the right (sub)package."]}),"\n",(0,i.jsx)(t.p,{children:'In case your AppStream metainfo is describing a desktop-application (you can tell by the XML root-node having a type="desktop-application" or type="desktop" attribute), the .appdata.xml file must be placed in the same package as the .desktop file already is, which (as above) must be the package containing the application itself.'}),"\n",(0,i.jsx)(t.h2,{id:"testing-appstream-metainfo",children:"Testing appstream metainfo"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Clone the package repo"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Build it or eopkg fetch pkgname"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["Run ",(0,i.jsx)(t.code,{children:"sudo eopkg it appstream-glib"}),", ",(0,i.jsx)(t.code,{children:"appstream-builder --packages-dir=. --include-failed -v"})]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["Look in the ",(0,i.jsx)(t.code,{children:"example-failed.xml.gz"})," file to see if the appstream generation failed"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["Look in the ",(0,i.jsx)(t.code,{children:"example.xml.gz"})," file to see if the appstream generation succeeded."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"other-info",children:"Other Info"}),"\n",(0,i.jsx)(t.p,{children:"A package must provide one appstream metainfo file, an icon file and a .desktop file for AppStream generation to succeed. However, there are exceptions to this. If an application provides more than one AppStream metainfo file then the package must be subpackaged for generation of all the appstream metainfo files to succeed."})]})}function l(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,t,a)=>{a.d(t,{Z:()=>o,a:()=>r});var i=a(67294);const n={},s=i.createContext(n);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4605],{66334:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var i=a(85893),n=a(11151);const s={title:"Appstream Metainfo",summary:"The purpose and format of Appstream Metainfo"},r="AppStream Metainfo",o={id:"packaging/appstream-metainfo",title:"Appstream Metainfo",description:"AppStream metainfo is required for all graphical application in Solus repository.",source:"@site/docs/packaging/appstream-metainfo.md",sourceDirName:"packaging",slug:"/packaging/appstream-metainfo",permalink:"/docs/packaging/appstream-metainfo",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/appstream-metainfo.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Appstream Metainfo",summary:"The purpose and format of Appstream Metainfo"},sidebar:"packagingSidebar",previous:{title:"Local Repository",permalink:"/docs/packaging/advanced-config/local-repository"},next:{title:"Git Basics",permalink:"/docs/packaging/git-basics"}},p={},c=[{value:"Adding appstream metainfo to an existing package",id:"adding-appstream-metainfo-to-an-existing-package",level:2},{value:"Testing appstream metainfo",id:"testing-appstream-metainfo",level:2},{value:"Other Info",id:"other-info",level:2}];function d(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"appstream-metainfo",children:"AppStream Metainfo"})}),"\n",(0,i.jsx)(t.admonition,{type:"important",children:(0,i.jsx)(t.p,{children:"AppStream metainfo is required for all graphical application in Solus repository."})}),"\n",(0,i.jsx)(t.p,{children:"AppStream allows upstream projects to define metadata about the components they provide using small XML files, metainfo files, which get installed into locations on the client system and are used by distributors to enhance their metadata."}),"\n",(0,i.jsx)(t.p,{children:"AppStream metainfo become a requirement for all graphical application in Solus repository because software centers such as GNOME software and KDE Discover rely on it to display applications that are available in repository. AppStream metainfo should be shipped by the upstream project, bundled in with its source, but sometimes upstream projects don't do so. In which case, packagers are required to add AppStream metainfo themselves."}),"\n",(0,i.jsx)(t.h2,{id:"adding-appstream-metainfo-to-an-existing-package",children:"Adding appstream metainfo to an existing package"}),"\n",(0,i.jsx)(t.p,{children:"There are a few scenarios that Packagers might encounter:"}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"No"}),(0,i.jsx)(t.th,{children:"Scenario"}),(0,i.jsx)(t.th,{children:"Solution"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"1"}),(0,i.jsx)(t.td,{children:"An application already provides appstream metainfo"}),(0,i.jsx)(t.td,{children:"Nothing to do"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"2"}),(0,i.jsx)(t.td,{children:"An application contains appstream metainfo in the source package but we do not install it"}),(0,i.jsxs)(t.td,{children:["Install the appstream metainfo to ",(0,i.jsx)(t.code,{children:"/usr/share/metainfo"}),". ",(0,i.jsx)(t.em,{children:"Example"}),": ",(0,i.jsx)(t.a,{href:"https://github.com/getsolus/packages/commit/0a726a53454e7c8a6b0e66de69d59bcc66f0fc19",children:"here"})]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"3"}),(0,i.jsx)(t.td,{children:"An application doesn't contain appstream metainfo in the source package but it exists on Flathub"}),(0,i.jsxs)(t.td,{children:["Borrow and tweak the appstream metainfo from the Flathub repo. Encourage upstream project to add it to their source. ",(0,i.jsx)(t.em,{children:"Example"}),": ",(0,i.jsx)(t.a,{href:"https://github.com/getsolus/packages/commit/da2f65b93f412da43d1db9edbcb08bb90517a0eb",children:"here"})]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"4"}),(0,i.jsx)(t.td,{children:"An application doesn't provide appstream metainfo and it doesn't exist on flathub"}),(0,i.jsxs)(t.td,{children:["Write the appstream metadata, submit it to upstream project. ",(0,i.jsx)(t.em,{children:"Example"}),": ",(0,i.jsx)(t.a,{href:"https://github.com/getsolus/packages/commit/414219d8b2ceeabe85178d3a467f81b9131016f4",children:"here"})]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"5"}),(0,i.jsx)(t.td,{children:"Appstream metainfo is provided but generation of it is failing"}),(0,i.jsxs)(t.td,{children:["See ",(0,i.jsx)(t.a,{href:"https://github.com/getsolus/solus-appstream-data#debugging-failures",children:"here"}),". ",(0,i.jsx)(t.em,{children:"Example"}),": ",(0,i.jsx)(t.a,{href:"https://github.com/getsolus/packages/commit/583b7c742caf50e2f66a70e9b62e9b91566c03f5",children:"here"}),"."]})]})]})]}),"\n",(0,i.jsxs)(t.p,{children:["AppStream metainfo is to be installed in the ",(0,i.jsx)(t.code,{children:"/usr/share/metainfo/"})," directory. It must be placed in the package which should be installed in order to get the software described by the respective metadata. This means that you might need to move the _.metainfo.xml or _.appdata.xml to the right (sub)package."]}),"\n",(0,i.jsx)(t.p,{children:'In case your AppStream metainfo is describing a desktop-application (you can tell by the XML root-node having a type="desktop-application" or type="desktop" attribute), the .appdata.xml file must be placed in the same package as the .desktop file already is, which (as above) must be the package containing the application itself.'}),"\n",(0,i.jsx)(t.h2,{id:"testing-appstream-metainfo",children:"Testing appstream metainfo"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Clone the package repo"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Build it or eopkg fetch pkgname"}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["Run ",(0,i.jsx)(t.code,{children:"sudo eopkg it appstream-glib"}),", ",(0,i.jsx)(t.code,{children:"appstream-builder --packages-dir=. --include-failed -v"})]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["Look in the ",(0,i.jsx)(t.code,{children:"example-failed.xml.gz"})," file to see if the appstream generation failed"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:["Look in the ",(0,i.jsx)(t.code,{children:"example.xml.gz"})," file to see if the appstream generation succeeded."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"other-info",children:"Other Info"}),"\n",(0,i.jsx)(t.p,{children:"A package must provide one appstream metainfo file, an icon file and a .desktop file for AppStream generation to succeed. However, there are exceptions to this. If an application provides more than one AppStream metainfo file then the package must be subpackaged for generation of all the appstream metainfo files to succeed."})]})}function l(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,t,a)=>{a.d(t,{Z:()=>o,a:()=>r});var i=a(67294);const n={},s=i.createContext(n);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7e4100d6.2cf6c6ac.js b/assets/js/7e4100d6.6a9680f6.js similarity index 98% rename from assets/js/7e4100d6.2cf6c6ac.js rename to assets/js/7e4100d6.6a9680f6.js index 3a52ac3df..906fdc10a 100644 --- a/assets/js/7e4100d6.2cf6c6ac.js +++ b/assets/js/7e4100d6.6a9680f6.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6990],{18193:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>n,metadata:()=>i,toc:()=>h});var t=s(85893),a=s(11151);const n={title:"Wireshark",summary:"A quick start guide to Wireshark on Solus"},o="Wireshark",i={id:"user/software/networking/wireshark",title:"Wireshark",description:"Wireshark is a widely-used network protocol analyzer that lets you see what\u2019s happening on a network at a microscopic level.",source:"@site/docs/user/software/networking/wireshark.md",sourceDirName:"user/software/networking",slug:"/user/software/networking/wireshark",permalink:"/docs/user/software/networking/wireshark",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/networking/wireshark.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Wireshark",summary:"A quick start guide to Wireshark on Solus"},sidebar:"userSidebar",previous:{title:"TigerVNC",permalink:"/docs/user/software/networking/tigervnc"},next:{title:"XRDP",permalink:"/docs/user/software/networking/xrdp"}},c={},h=[{value:"Installation",id:"installation",level:2},{value:"Use wireshark as a non-root user",id:"use-wireshark-as-a-non-root-user",level:2},{value:"Usage",id:"usage",level:2}];function l(e){const r={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.header,{children:(0,t.jsx)(r.h1,{id:"wireshark",children:"Wireshark"})}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.a,{href:"https://www.wireshark.org/",children:"Wireshark"})," is a widely-used network protocol analyzer that lets you see what\u2019s happening on a network at a microscopic level."]}),"\n",(0,t.jsx)(r.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(r.p,{children:"Wireshark can be installed either from the Software Center or via terminal:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",children:"sudo eopkg it wireshark\n"})}),"\n",(0,t.jsx)(r.h2,{id:"use-wireshark-as-a-non-root-user",children:"Use wireshark as a non-root user"}),"\n",(0,t.jsx)(r.p,{children:"For security reasons, it is strongly unadvised to run Wireshark as root. To capture packets as non-root user, execute these commands:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",children:"sudo gpasswd -a $USER wireshark\nsudo setcap cap_dac_override,cap_net_admin,cap_net_raw+eip /usr/bin/dumpcap\n"})}),"\n",(0,t.jsx)(r.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsxs)(r.p,{children:["Wireshark ",(0,t.jsx)(r.a,{href:"https://www.wireshark.org/docs/wsug_html_chunked/",children:"User\u2019s Guide"})," and ",(0,t.jsx)(r.a,{href:"https://www.wireshark.org/docs/",children:"learning material"})," are available on ",(0,t.jsx)(r.a,{href:"https://www.wireshark.org",children:"https://www.wireshark.org"}),"."]})]})}function d(e={}){const{wrapper:r}={...(0,a.a)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,r,s)=>{s.d(r,{Z:()=>i,a:()=>o});var t=s(67294);const a={},n=t.createContext(a);function o(e){const r=t.useContext(n);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function i(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),t.createElement(n.Provider,{value:r},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6990],{18193:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>n,metadata:()=>i,toc:()=>h});var t=s(85893),a=s(11151);const n={title:"Wireshark",summary:"A quick start guide to Wireshark on Solus"},o="Wireshark",i={id:"user/software/networking/wireshark",title:"Wireshark",description:"Wireshark is a widely-used network protocol analyzer that lets you see what\u2019s happening on a network at a microscopic level.",source:"@site/docs/user/software/networking/wireshark.md",sourceDirName:"user/software/networking",slug:"/user/software/networking/wireshark",permalink:"/docs/user/software/networking/wireshark",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/networking/wireshark.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Wireshark",summary:"A quick start guide to Wireshark on Solus"},sidebar:"userSidebar",previous:{title:"TigerVNC",permalink:"/docs/user/software/networking/tigervnc"},next:{title:"XRDP",permalink:"/docs/user/software/networking/xrdp"}},c={},h=[{value:"Installation",id:"installation",level:2},{value:"Use wireshark as a non-root user",id:"use-wireshark-as-a-non-root-user",level:2},{value:"Usage",id:"usage",level:2}];function l(e){const r={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.header,{children:(0,t.jsx)(r.h1,{id:"wireshark",children:"Wireshark"})}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.a,{href:"https://www.wireshark.org/",children:"Wireshark"})," is a widely-used network protocol analyzer that lets you see what\u2019s happening on a network at a microscopic level."]}),"\n",(0,t.jsx)(r.h2,{id:"installation",children:"Installation"}),"\n",(0,t.jsx)(r.p,{children:"Wireshark can be installed either from the Software Center or via terminal:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",children:"sudo eopkg it wireshark\n"})}),"\n",(0,t.jsx)(r.h2,{id:"use-wireshark-as-a-non-root-user",children:"Use wireshark as a non-root user"}),"\n",(0,t.jsx)(r.p,{children:"For security reasons, it is strongly unadvised to run Wireshark as root. To capture packets as non-root user, execute these commands:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",children:"sudo gpasswd -a $USER wireshark\nsudo setcap cap_dac_override,cap_net_admin,cap_net_raw+eip /usr/bin/dumpcap\n"})}),"\n",(0,t.jsx)(r.h2,{id:"usage",children:"Usage"}),"\n",(0,t.jsxs)(r.p,{children:["Wireshark ",(0,t.jsx)(r.a,{href:"https://www.wireshark.org/docs/wsug_html_chunked/",children:"User\u2019s Guide"})," and ",(0,t.jsx)(r.a,{href:"https://www.wireshark.org/docs/",children:"learning material"})," are available on ",(0,t.jsx)(r.a,{href:"https://www.wireshark.org",children:"https://www.wireshark.org"}),"."]})]})}function d(e={}){const{wrapper:r}={...(0,a.a)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,r,s)=>{s.d(r,{Z:()=>i,a:()=>o});var t=s(67294);const a={},n=t.createContext(a);function o(e){const r=t.useContext(n);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function i(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),t.createElement(n.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/814f3328.55779541.js b/assets/js/814f3328.55779541.js deleted file mode 100644 index 37211d479..000000000 --- a/assets/js/814f3328.55779541.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2535],{45641:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"Intro to Optimizing Packages on Solus","permalink":"/blog/solus-optimizing-packages","unlisted":false,"date":"2024-02-09T00:00:00.000Z"},{"title":"Don\'t call me MATE, pal!","permalink":"/blog/don\'t-call-me-mate-pal","unlisted":false,"date":"2024-01-29T00:00:00.000Z"},{"title":"eopkg is dead, long live eopkg","permalink":"/blog/eopkg-is-dead-long-live-eopkg","unlisted":false,"date":"2024-01-19T00:00:00.000Z"},{"title":"Welcome to the Solus Devlog","permalink":"/blog/welcome-solus-devlog-v1","unlisted":false,"date":"2024-01-13T00:00:00.000Z"}]}')}}]); \ No newline at end of file diff --git a/assets/js/814f3328.6bedb449.js b/assets/js/814f3328.6bedb449.js new file mode 100644 index 000000000..58893d1bd --- /dev/null +++ b/assets/js/814f3328.6bedb449.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2535],{45641:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"Clean, clean, clean!","permalink":"/blog/clean-clean-clean","unlisted":false,"date":"2024-11-21T00:00:00.000Z"},{"title":"Intro to Optimizing Packages on Solus","permalink":"/blog/solus-optimizing-packages","unlisted":false,"date":"2024-02-09T00:00:00.000Z"},{"title":"Don\'t call me MATE, pal!","permalink":"/blog/don\'t-call-me-mate-pal","unlisted":false,"date":"2024-01-29T00:00:00.000Z"},{"title":"eopkg is dead, long live eopkg","permalink":"/blog/eopkg-is-dead-long-live-eopkg","unlisted":false,"date":"2024-01-19T00:00:00.000Z"},{"title":"Welcome to the Solus Devlog","permalink":"/blog/welcome-solus-devlog-v1","unlisted":false,"date":"2024-01-13T00:00:00.000Z"}]}')}}]); \ No newline at end of file diff --git a/assets/js/8490a22d.69e63e2e.js b/assets/js/8490a22d.246da908.js similarity index 99% rename from assets/js/8490a22d.69e63e2e.js rename to assets/js/8490a22d.246da908.js index def27b73c..b476b7245 100644 --- a/assets/js/8490a22d.69e63e2e.js +++ b/assets/js/8490a22d.246da908.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8575],{5734:(e,o,l)=>{l.r(o),l.d(o,{assets:()=>t,contentTitle:()=>r,default:()=>p,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var i=l(85893),s=l(11151);const n={title:"Local Repository",summary:"Packaging using a local repository"},r="Packaging using a local repository",a={id:"packaging/advanced-config/local-repository",title:"Local Repository",description:"This guide walks you through the steps necessary to tell solbuild how to use your locally built .eopkg files that are not yet in the Solus repository.",source:"@site/docs/packaging/advanced-config/local-repository.md",sourceDirName:"packaging/advanced-config",slug:"/packaging/advanced-config/local-repository",permalink:"/docs/packaging/advanced-config/local-repository",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/advanced-config/local-repository.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Local Repository",summary:"Packaging using a local repository"},sidebar:"packagingSidebar",previous:{title:"Eopkg Configuration",permalink:"/docs/packaging/advanced-config/eopkg-configuration"},next:{title:"Appstream Metainfo",permalink:"/docs/packaging/appstream-metainfo"}},t={},c=[{value:"Install the local profile",id:"install-the-local-profile",level:2},{value:"Using the local repository",id:"using-the-local-repository",level:2},{value:"Copying .eopkg files to the local repository",id:"copying-eopkg-files-to-the-local-repository",level:3},{value:"Listing locally built eopkg files",id:"listing-locally-built-eopkg-files",level:3},{value:"Using the local repository to build a package",id:"using-the-local-repository-to-build-a-package",level:3},{value:"A streamlined local repository workflow for stack updates",id:"a-streamlined-local-repository-workflow-for-stack-updates",level:3},{value:"Best practices when working with a solbuild local repository",id:"best-practices-when-working-with-a-solbuild-local-repository",level:3},{value:"Installing packages from the local repository index",id:"installing-packages-from-the-local-repository-index",level:2},{value:"Creating or updating the local repository index",id:"creating-or-updating-the-local-repository-index",level:3},{value:"Package resolution priority in eopkg",id:"package-resolution-priority-in-eopkg",level:3},{value:"Adding the local repository index to the eopkg repository database",id:"adding-the-local-repository-index-to-the-eopkg-repository-database",level:3},{value:"Disabling the local solbuild repository in eopkg",id:"disabling-the-local-solbuild-repository-in-eopkg",level:4},{value:"Closing thoughts",id:"closing-thoughts",level:2}];function d(e){const o={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"packaging-using-a-local-repository",children:"Packaging using a local repository"})}),"\n",(0,i.jsxs)(o.p,{children:["This guide walks you through the steps necessary to tell ",(0,i.jsx)(o.code,{children:"solbuild"})," how to use your locally built ",(0,i.jsx)(o.code,{children:".eopkg"})," files that are not yet in the Solus repository."]}),"\n",(0,i.jsx)(o.admonition,{type:"note",children:(0,i.jsxs)(o.p,{children:["It is not necessary to use a local repository to test most package submissions. The easier and recommended way is to install the ",(0,i.jsx)(o.code,{children:".eopkg"})," files created when a package is built. This procedure is intended for use with stack upgrades, rebuilds, or new packages that need new dependencies that are not yet in the repository."]})}),"\n",(0,i.jsxs)(o.p,{children:["We assume you have worked through the ",(0,i.jsx)(o.a,{href:"/docs/packaging",children:"packaging"})," material for creating a package with ",(0,i.jsx)(o.code,{children:"solbuild"}),"."]}),"\n",(0,i.jsx)(o.h2,{id:"install-the-local-profile",children:"Install the local profile"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo eopkg install solbuild-config-local-unstable\n"})}),"\n",(0,i.jsxs)(o.p,{children:["You will also need to ensure that your repository is fully up to date. See ",(0,i.jsx)(o.a,{href:"/docs/packaging/update-dev-environment",children:"Update Your Development Environment"})]}),"\n",(0,i.jsx)(o.h2,{id:"using-the-local-repository",children:"Using the local repository"}),"\n",(0,i.jsxs)(o.p,{children:["The local repository index and any local eopkg files are stored in ",(0,i.jsx)(o.code,{children:"/var/lib/solbuild/local/"})]}),"\n",(0,i.jsxs)(o.h3,{id:"copying-eopkg-files-to-the-local-repository",children:["Copying ",(0,i.jsx)(o.code,{children:".eopkg"})," files to the local repository"]}),"\n",(0,i.jsxs)(o.p,{children:["To use your locally built ",(0,i.jsx)(o.code,{children:".eopkg"})," package files as dependencies for another package, you must copy the regular package files, and any accompanying ",(0,i.jsx)(o.code,{children:"-devel"})," package files to the ",(0,i.jsx)(o.code,{children:"/var/lib/solbuild/local"})," local repository directory."]}),"\n",(0,i.jsxs)(o.p,{children:["For example, building the package ",(0,i.jsx)(o.code,{children:"libcmis"})," produces the packages ",(0,i.jsx)(o.code,{children:"libcmis"})," and ",(0,i.jsx)(o.code,{children:"libcmis-devel"}),". Both should be copied to the local repository to build other packages against ",(0,i.jsx)(o.code,{children:"libcmis"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["To copy all ",(0,i.jsx)(o.code,{children:".eopkg"})," files within a directory to the local repository, use the following command:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo cp -v *.eopkg /var/lib/solbuild/local\n"})}),"\n",(0,i.jsx)(o.h3,{id:"listing-locally-built-eopkg-files",children:"Listing locally built eopkg files"}),"\n",(0,i.jsx)(o.p,{children:"Use this to list all index and eopkg files in the local repository:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task list-local\n"})}),"\n",(0,i.jsx)(o.h3,{id:"using-the-local-repository-to-build-a-package",children:"Using the local repository to build a package"}),"\n",(0,i.jsxs)(o.p,{children:["With the ",(0,i.jsx)(o.code,{children:".eopkg"})," files now present in the local repository, you can use them to build a package by running ",(0,i.jsx)(o.code,{children:"go-task build-local"}),", rather than just ",(0,i.jsx)(o.code,{children:"go-task"}),", and ",(0,i.jsx)(o.code,{children:"solbuild"})," will prefer your packages over packages found in the Solus repository."]}),"\n",(0,i.jsxs)(o.p,{children:["Every time you run ",(0,i.jsx)(o.code,{children:"go-task build-local"}),", all ",(0,i.jsx)(o.code,{children:".eopkg"})," files in the local repository will be re-indexed."]}),"\n",(0,i.jsx)(o.h3,{id:"a-streamlined-local-repository-workflow-for-stack-updates",children:"A streamlined local repository workflow for stack updates"}),"\n",(0,i.jsx)(o.p,{children:"If you know ahead of time that you are going to need to put the package files from the current build into the local repository as dependencies for subsequent builds, you can use:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task build-localcp\n"})}),"\n",(0,i.jsxs)(o.p,{children:["The ",(0,i.jsx)(o.code,{children:"build-localcp"})," task will:"]}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsx)(o.li,{children:"Build the current package against any existing packages in your local repository."}),"\n",(0,i.jsx)(o.li,{children:"Copy the newly built package files to your local repository."}),"\n",(0,i.jsx)(o.li,{children:"Re-index your local repository."}),"\n"]}),"\n",(0,i.jsxs)(o.p,{children:["The ",(0,i.jsx)(o.code,{children:"build-localcp"})," workflow can be very convenient when you are doing stack updates."]}),"\n",(0,i.jsx)(o.h3,{id:"best-practices-when-working-with-a-solbuild-local-repository",children:"Best practices when working with a solbuild local repository"}),"\n",(0,i.jsx)(o.p,{children:"There are some important things to know when working with local repositories, as they may lead to issues later on."}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:[(0,i.jsx)(o.code,{children:"solbuild"})," will use your version of a package from the local repository regardless of whether there's a higher release in the Solus repository. Therefore:","\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Only use the ",(0,i.jsx)(o.code,{children:"build-local"})," or ",(0,i.jsx)(o.code,{children:"build-localcp"})," tasks when required."]}),"\n",(0,i.jsxs)(o.li,{children:["Old packages in the local repository can be removed with the ",(0,i.jsx)(o.code,{children:"clean-local"})," task:","\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task clean-local\n"})}),"\n","Note that the ",(0,i.jsx)(o.code,{children:"clean-local"})," task will automatically re-index the (now empty) local repository."]}),"\n",(0,i.jsxs)(o.li,{children:["If a package is already installed in the ",(0,i.jsx)(o.code,{children:"solbuild"})," image, the release number of the updated version must be higher for it to be installed and used as a dependency at build time."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(o.h2,{id:"installing-packages-from-the-local-repository-index",children:"Installing packages from the local repository index"}),"\n",(0,i.jsxs)(o.p,{children:[(0,i.jsx)(o.code,{children:"eopkg"})," supports resolving packages from more than one repository. This can be used to configure ",(0,i.jsx)(o.code,{children:"eopkg"})," to prefer installing local repository packages over packages from the Solus repository."]}),"\n",(0,i.jsxs)(o.p,{children:["This requires an existing local repository index. If you have used the command ",(0,i.jsx)(o.code,{children:"go-task build-local"}),", then an index was created automatically. Otherwise, you must create one."]}),"\n",(0,i.jsx)(o.h3,{id:"creating-or-updating-the-local-repository-index",children:"Creating or updating the local repository index"}),"\n",(0,i.jsxs)(o.p,{children:["To generate or refresh the ",(0,i.jsx)(o.code,{children:"eopkg"})," index in ",(0,i.jsx)(o.code,{children:"/var/lib/solbuild/local"}),", use the following command:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task build-localindex\n"})}),"\n",(0,i.jsxs)(o.p,{children:["Or, if you have our ",(0,i.jsx)(o.a,{href:"/docs/packaging/prepare-for-packaging#set-up-repository-helper-functions-optional",children:"helper functions"})," set up, you get the same result by running:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"localrepo_reindex\n"})}),"\n",(0,i.jsxs)(o.p,{children:["Keep in mind that the index needs to be refreshed whenever you add or remove locally built packages to your local repository. Otherwise, ",(0,i.jsx)(o.code,{children:"eopkg"})," won't know that new packages are available or have been removed from the local repository."]}),"\n",(0,i.jsx)(o.h3,{id:"package-resolution-priority-in-eopkg",children:"Package resolution priority in eopkg"}),"\n",(0,i.jsxs)(o.p,{children:[(0,i.jsx)(o.code,{children:"eopkg"})," will always prefer packages from the topmost repository listed with ",(0,i.jsx)(o.code,{children:"eopkg lr"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["In other words, if a package exists both in the local repository and the Solus repository, ",(0,i.jsx)(o.code,{children:"eopkg"})," will only consider the package from the first repository listed with ",(0,i.jsx)(o.code,{children:"eopkg lr"})," ",(0,i.jsx)(o.em,{children:"regardless of its release number"}),"."]}),"\n",(0,i.jsx)(o.h3,{id:"adding-the-local-repository-index-to-the-eopkg-repository-database",children:"Adding the local repository index to the eopkg repository database"}),"\n",(0,i.jsxs)(o.p,{children:["The easiest way to add the local repository index to the list of repositories known to ",(0,i.jsx)(o.code,{children:"eopkg"}),", in the correct order, is to add the local repository and then ",(0,i.jsx)(o.em,{children:"re-add"})," the official Solus repository:"]}),"\n",(0,i.jsxs)(o.ol,{children:["\n",(0,i.jsxs)(o.li,{children:["First, let's list the repositories currently known to ",(0,i.jsx)(o.code,{children:"eopkg"})," with ",(0,i.jsx)(o.code,{children:"eopkg lr"}),". This should produce output similar to:"]}),"\n"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"Solus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsxs)(o.ol,{start:"2",children:["\n",(0,i.jsx)(o.li,{children:"Now the repositories need to be added to account for the desired dependency resolution order:"}),"\n"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo eopkg ar Local /var/lib/solbuild/local/eopkg-index.xml.xz\nsudo eopkg ar Solus https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsx)(o.p,{children:"This should yield output similar to:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"$ sudo eopkg ar Local /var/lib/solbuild/local/eopkg-index.xml.xz\nRepo Local added to system.\nUpdating repository: Local\nPackage database updated.\n$ sudo eopkg ar Solus https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\nRepo already present with name Solus and same URL. Removing first.\nRepo Solus added to system.\nUpdating repository: Solus\neopkg-index.xml.xz.sha1sum (40.0 B)100% 765.61 KB/s [00:00:00] [complete]\neopkg-index.xml.xz (2.1 MB)100% 914.38 KB/s [00:00:01] [complete]\nPackage database updated.\n"})}),"\n",(0,i.jsxs)(o.ol,{start:"3",children:["\n",(0,i.jsxs)(o.li,{children:["Check that the dependency resolution order is correct so that packages from the local ",(0,i.jsx)(o.code,{children:"solbuild"})," repository are preferred over the upstream Solus repository."]}),"\n"]}),"\n",(0,i.jsxs)(o.p,{children:[(0,i.jsx)(o.code,{children:"eopkg lr"})," should yield output similar to:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"$ eopkg lr\nLocal [active]\n /var/lib/solbuild/local/eopkg-index.xml.xz\nSolus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsx)(o.h4,{id:"disabling-the-local-solbuild-repository-in-eopkg",children:"Disabling the local solbuild repository in eopkg"}),"\n",(0,i.jsxs)(o.p,{children:['To reset the system to use only packages from the official Solus repository, disable the "Local" ',(0,i.jsx)(o.code,{children:"eopkg"})," repository using the command ",(0,i.jsx)(o.code,{children:"sudo eopkg disable-repo Local"}),"."]}),"\n",(0,i.jsx)(o.p,{children:"The output should look similar to:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"$ sudo eopkg disable-repo Local\n$ sudo eopkg lr\nLocal [inactive]\n /var/lib/solbuild/local/eopkg-index.xml.xz\nSolus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsxs)(o.p,{children:['The "Local" ',(0,i.jsx)(o.code,{children:"eopkg"})," repository can be re-enabled with ",(0,i.jsx)(o.code,{children:"sudo eopkg enable-repo Local"}),"."]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"$ sudo eopkg enable-repo Local\n$ sudo eopkg lr\nLocal [active]\n /var/lib/solbuild/local/eopkg-index.xml.xz\nSolus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsx)(o.h2,{id:"closing-thoughts",children:"Closing thoughts"}),"\n",(0,i.jsx)(o.p,{children:"Congratulations on making it this far! Your system should now be ready for convenient deployment and testing of locally built packages."})]})}function p(e={}){const{wrapper:o}={...(0,s.a)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,o,l)=>{l.d(o,{Z:()=>a,a:()=>r});var i=l(67294);const s={},n=i.createContext(s);function r(e){const o=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(n.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8575],{5734:(e,o,l)=>{l.r(o),l.d(o,{assets:()=>t,contentTitle:()=>r,default:()=>p,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var i=l(85893),s=l(11151);const n={title:"Local Repository",summary:"Packaging using a local repository"},r="Packaging using a local repository",a={id:"packaging/advanced-config/local-repository",title:"Local Repository",description:"This guide walks you through the steps necessary to tell solbuild how to use your locally built .eopkg files that are not yet in the Solus repository.",source:"@site/docs/packaging/advanced-config/local-repository.md",sourceDirName:"packaging/advanced-config",slug:"/packaging/advanced-config/local-repository",permalink:"/docs/packaging/advanced-config/local-repository",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/advanced-config/local-repository.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Local Repository",summary:"Packaging using a local repository"},sidebar:"packagingSidebar",previous:{title:"Eopkg Configuration",permalink:"/docs/packaging/advanced-config/eopkg-configuration"},next:{title:"Appstream Metainfo",permalink:"/docs/packaging/appstream-metainfo"}},t={},c=[{value:"Install the local profile",id:"install-the-local-profile",level:2},{value:"Using the local repository",id:"using-the-local-repository",level:2},{value:"Copying .eopkg files to the local repository",id:"copying-eopkg-files-to-the-local-repository",level:3},{value:"Listing locally built eopkg files",id:"listing-locally-built-eopkg-files",level:3},{value:"Using the local repository to build a package",id:"using-the-local-repository-to-build-a-package",level:3},{value:"A streamlined local repository workflow for stack updates",id:"a-streamlined-local-repository-workflow-for-stack-updates",level:3},{value:"Best practices when working with a solbuild local repository",id:"best-practices-when-working-with-a-solbuild-local-repository",level:3},{value:"Installing packages from the local repository index",id:"installing-packages-from-the-local-repository-index",level:2},{value:"Creating or updating the local repository index",id:"creating-or-updating-the-local-repository-index",level:3},{value:"Package resolution priority in eopkg",id:"package-resolution-priority-in-eopkg",level:3},{value:"Adding the local repository index to the eopkg repository database",id:"adding-the-local-repository-index-to-the-eopkg-repository-database",level:3},{value:"Disabling the local solbuild repository in eopkg",id:"disabling-the-local-solbuild-repository-in-eopkg",level:4},{value:"Closing thoughts",id:"closing-thoughts",level:2}];function d(e){const o={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"packaging-using-a-local-repository",children:"Packaging using a local repository"})}),"\n",(0,i.jsxs)(o.p,{children:["This guide walks you through the steps necessary to tell ",(0,i.jsx)(o.code,{children:"solbuild"})," how to use your locally built ",(0,i.jsx)(o.code,{children:".eopkg"})," files that are not yet in the Solus repository."]}),"\n",(0,i.jsx)(o.admonition,{type:"note",children:(0,i.jsxs)(o.p,{children:["It is not necessary to use a local repository to test most package submissions. The easier and recommended way is to install the ",(0,i.jsx)(o.code,{children:".eopkg"})," files created when a package is built. This procedure is intended for use with stack upgrades, rebuilds, or new packages that need new dependencies that are not yet in the repository."]})}),"\n",(0,i.jsxs)(o.p,{children:["We assume you have worked through the ",(0,i.jsx)(o.a,{href:"/docs/packaging",children:"packaging"})," material for creating a package with ",(0,i.jsx)(o.code,{children:"solbuild"}),"."]}),"\n",(0,i.jsx)(o.h2,{id:"install-the-local-profile",children:"Install the local profile"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo eopkg install solbuild-config-local-unstable\n"})}),"\n",(0,i.jsxs)(o.p,{children:["You will also need to ensure that your repository is fully up to date. See ",(0,i.jsx)(o.a,{href:"/docs/packaging/update-dev-environment",children:"Update Your Development Environment"})]}),"\n",(0,i.jsx)(o.h2,{id:"using-the-local-repository",children:"Using the local repository"}),"\n",(0,i.jsxs)(o.p,{children:["The local repository index and any local eopkg files are stored in ",(0,i.jsx)(o.code,{children:"/var/lib/solbuild/local/"})]}),"\n",(0,i.jsxs)(o.h3,{id:"copying-eopkg-files-to-the-local-repository",children:["Copying ",(0,i.jsx)(o.code,{children:".eopkg"})," files to the local repository"]}),"\n",(0,i.jsxs)(o.p,{children:["To use your locally built ",(0,i.jsx)(o.code,{children:".eopkg"})," package files as dependencies for another package, you must copy the regular package files, and any accompanying ",(0,i.jsx)(o.code,{children:"-devel"})," package files to the ",(0,i.jsx)(o.code,{children:"/var/lib/solbuild/local"})," local repository directory."]}),"\n",(0,i.jsxs)(o.p,{children:["For example, building the package ",(0,i.jsx)(o.code,{children:"libcmis"})," produces the packages ",(0,i.jsx)(o.code,{children:"libcmis"})," and ",(0,i.jsx)(o.code,{children:"libcmis-devel"}),". Both should be copied to the local repository to build other packages against ",(0,i.jsx)(o.code,{children:"libcmis"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["To copy all ",(0,i.jsx)(o.code,{children:".eopkg"})," files within a directory to the local repository, use the following command:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo cp -v *.eopkg /var/lib/solbuild/local\n"})}),"\n",(0,i.jsx)(o.h3,{id:"listing-locally-built-eopkg-files",children:"Listing locally built eopkg files"}),"\n",(0,i.jsx)(o.p,{children:"Use this to list all index and eopkg files in the local repository:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task list-local\n"})}),"\n",(0,i.jsx)(o.h3,{id:"using-the-local-repository-to-build-a-package",children:"Using the local repository to build a package"}),"\n",(0,i.jsxs)(o.p,{children:["With the ",(0,i.jsx)(o.code,{children:".eopkg"})," files now present in the local repository, you can use them to build a package by running ",(0,i.jsx)(o.code,{children:"go-task build-local"}),", rather than just ",(0,i.jsx)(o.code,{children:"go-task"}),", and ",(0,i.jsx)(o.code,{children:"solbuild"})," will prefer your packages over packages found in the Solus repository."]}),"\n",(0,i.jsxs)(o.p,{children:["Every time you run ",(0,i.jsx)(o.code,{children:"go-task build-local"}),", all ",(0,i.jsx)(o.code,{children:".eopkg"})," files in the local repository will be re-indexed."]}),"\n",(0,i.jsx)(o.h3,{id:"a-streamlined-local-repository-workflow-for-stack-updates",children:"A streamlined local repository workflow for stack updates"}),"\n",(0,i.jsx)(o.p,{children:"If you know ahead of time that you are going to need to put the package files from the current build into the local repository as dependencies for subsequent builds, you can use:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task build-localcp\n"})}),"\n",(0,i.jsxs)(o.p,{children:["The ",(0,i.jsx)(o.code,{children:"build-localcp"})," task will:"]}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsx)(o.li,{children:"Build the current package against any existing packages in your local repository."}),"\n",(0,i.jsx)(o.li,{children:"Copy the newly built package files to your local repository."}),"\n",(0,i.jsx)(o.li,{children:"Re-index your local repository."}),"\n"]}),"\n",(0,i.jsxs)(o.p,{children:["The ",(0,i.jsx)(o.code,{children:"build-localcp"})," workflow can be very convenient when you are doing stack updates."]}),"\n",(0,i.jsx)(o.h3,{id:"best-practices-when-working-with-a-solbuild-local-repository",children:"Best practices when working with a solbuild local repository"}),"\n",(0,i.jsx)(o.p,{children:"There are some important things to know when working with local repositories, as they may lead to issues later on."}),"\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:[(0,i.jsx)(o.code,{children:"solbuild"})," will use your version of a package from the local repository regardless of whether there's a higher release in the Solus repository. Therefore:","\n",(0,i.jsxs)(o.ul,{children:["\n",(0,i.jsxs)(o.li,{children:["Only use the ",(0,i.jsx)(o.code,{children:"build-local"})," or ",(0,i.jsx)(o.code,{children:"build-localcp"})," tasks when required."]}),"\n",(0,i.jsxs)(o.li,{children:["Old packages in the local repository can be removed with the ",(0,i.jsx)(o.code,{children:"clean-local"})," task:","\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task clean-local\n"})}),"\n","Note that the ",(0,i.jsx)(o.code,{children:"clean-local"})," task will automatically re-index the (now empty) local repository."]}),"\n",(0,i.jsxs)(o.li,{children:["If a package is already installed in the ",(0,i.jsx)(o.code,{children:"solbuild"})," image, the release number of the updated version must be higher for it to be installed and used as a dependency at build time."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(o.h2,{id:"installing-packages-from-the-local-repository-index",children:"Installing packages from the local repository index"}),"\n",(0,i.jsxs)(o.p,{children:[(0,i.jsx)(o.code,{children:"eopkg"})," supports resolving packages from more than one repository. This can be used to configure ",(0,i.jsx)(o.code,{children:"eopkg"})," to prefer installing local repository packages over packages from the Solus repository."]}),"\n",(0,i.jsxs)(o.p,{children:["This requires an existing local repository index. If you have used the command ",(0,i.jsx)(o.code,{children:"go-task build-local"}),", then an index was created automatically. Otherwise, you must create one."]}),"\n",(0,i.jsx)(o.h3,{id:"creating-or-updating-the-local-repository-index",children:"Creating or updating the local repository index"}),"\n",(0,i.jsxs)(o.p,{children:["To generate or refresh the ",(0,i.jsx)(o.code,{children:"eopkg"})," index in ",(0,i.jsx)(o.code,{children:"/var/lib/solbuild/local"}),", use the following command:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"go-task build-localindex\n"})}),"\n",(0,i.jsxs)(o.p,{children:["Or, if you have our ",(0,i.jsx)(o.a,{href:"/docs/packaging/prepare-for-packaging#set-up-repository-helper-functions-optional",children:"helper functions"})," set up, you get the same result by running:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"localrepo_reindex\n"})}),"\n",(0,i.jsxs)(o.p,{children:["Keep in mind that the index needs to be refreshed whenever you add or remove locally built packages to your local repository. Otherwise, ",(0,i.jsx)(o.code,{children:"eopkg"})," won't know that new packages are available or have been removed from the local repository."]}),"\n",(0,i.jsx)(o.h3,{id:"package-resolution-priority-in-eopkg",children:"Package resolution priority in eopkg"}),"\n",(0,i.jsxs)(o.p,{children:[(0,i.jsx)(o.code,{children:"eopkg"})," will always prefer packages from the topmost repository listed with ",(0,i.jsx)(o.code,{children:"eopkg lr"}),"."]}),"\n",(0,i.jsxs)(o.p,{children:["In other words, if a package exists both in the local repository and the Solus repository, ",(0,i.jsx)(o.code,{children:"eopkg"})," will only consider the package from the first repository listed with ",(0,i.jsx)(o.code,{children:"eopkg lr"})," ",(0,i.jsx)(o.em,{children:"regardless of its release number"}),"."]}),"\n",(0,i.jsx)(o.h3,{id:"adding-the-local-repository-index-to-the-eopkg-repository-database",children:"Adding the local repository index to the eopkg repository database"}),"\n",(0,i.jsxs)(o.p,{children:["The easiest way to add the local repository index to the list of repositories known to ",(0,i.jsx)(o.code,{children:"eopkg"}),", in the correct order, is to add the local repository and then ",(0,i.jsx)(o.em,{children:"re-add"})," the official Solus repository:"]}),"\n",(0,i.jsxs)(o.ol,{children:["\n",(0,i.jsxs)(o.li,{children:["First, let's list the repositories currently known to ",(0,i.jsx)(o.code,{children:"eopkg"})," with ",(0,i.jsx)(o.code,{children:"eopkg lr"}),". This should produce output similar to:"]}),"\n"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"Solus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsxs)(o.ol,{start:"2",children:["\n",(0,i.jsx)(o.li,{children:"Now the repositories need to be added to account for the desired dependency resolution order:"}),"\n"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{className:"language-bash",children:"sudo eopkg ar Local /var/lib/solbuild/local/eopkg-index.xml.xz\nsudo eopkg ar Solus https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsx)(o.p,{children:"This should yield output similar to:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"$ sudo eopkg ar Local /var/lib/solbuild/local/eopkg-index.xml.xz\nRepo Local added to system.\nUpdating repository: Local\nPackage database updated.\n$ sudo eopkg ar Solus https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\nRepo already present with name Solus and same URL. Removing first.\nRepo Solus added to system.\nUpdating repository: Solus\neopkg-index.xml.xz.sha1sum (40.0 B)100% 765.61 KB/s [00:00:00] [complete]\neopkg-index.xml.xz (2.1 MB)100% 914.38 KB/s [00:00:01] [complete]\nPackage database updated.\n"})}),"\n",(0,i.jsxs)(o.ol,{start:"3",children:["\n",(0,i.jsxs)(o.li,{children:["Check that the dependency resolution order is correct so that packages from the local ",(0,i.jsx)(o.code,{children:"solbuild"})," repository are preferred over the upstream Solus repository."]}),"\n"]}),"\n",(0,i.jsxs)(o.p,{children:[(0,i.jsx)(o.code,{children:"eopkg lr"})," should yield output similar to:"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"$ eopkg lr\nLocal [active]\n /var/lib/solbuild/local/eopkg-index.xml.xz\nSolus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsx)(o.h4,{id:"disabling-the-local-solbuild-repository-in-eopkg",children:"Disabling the local solbuild repository in eopkg"}),"\n",(0,i.jsxs)(o.p,{children:['To reset the system to use only packages from the official Solus repository, disable the "Local" ',(0,i.jsx)(o.code,{children:"eopkg"})," repository using the command ",(0,i.jsx)(o.code,{children:"sudo eopkg disable-repo Local"}),"."]}),"\n",(0,i.jsx)(o.p,{children:"The output should look similar to:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"$ sudo eopkg disable-repo Local\n$ sudo eopkg lr\nLocal [inactive]\n /var/lib/solbuild/local/eopkg-index.xml.xz\nSolus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsxs)(o.p,{children:['The "Local" ',(0,i.jsx)(o.code,{children:"eopkg"})," repository can be re-enabled with ",(0,i.jsx)(o.code,{children:"sudo eopkg enable-repo Local"}),"."]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:"$ sudo eopkg enable-repo Local\n$ sudo eopkg lr\nLocal [active]\n /var/lib/solbuild/local/eopkg-index.xml.xz\nSolus [active]\n https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz\n"})}),"\n",(0,i.jsx)(o.h2,{id:"closing-thoughts",children:"Closing thoughts"}),"\n",(0,i.jsx)(o.p,{children:"Congratulations on making it this far! Your system should now be ready for convenient deployment and testing of locally built packages."})]})}function p(e={}){const{wrapper:o}={...(0,s.a)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,o,l)=>{l.d(o,{Z:()=>a,a:()=>r});var i=l(67294);const s={},n=i.createContext(s);function r(e){const o=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(n.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/88a83a8c.bafc94c1.js b/assets/js/88a83a8c.edbaa425.js similarity index 99% rename from assets/js/88a83a8c.bafc94c1.js rename to assets/js/88a83a8c.edbaa425.js index daed38c31..c5529b169 100644 --- a/assets/js/88a83a8c.bafc94c1.js +++ b/assets/js/88a83a8c.edbaa425.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1242],{65574:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>r,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var n=t(85893),a=t(11151);const o={title:"KDE Wallet",summary:"A quick introduction to using KWallet on Solus"},i="KDE Wallet and SSH keys",l={id:"user/software/utilities/kwallet",title:"KDE Wallet",description:"In KDE Plasma, the KDE Wallet is responsible for securely storing and supplying user credentials to the various KDE applications that request them.",source:"@site/docs/user/software/utilities/kwallet.md",sourceDirName:"user/software/utilities",slug:"/user/software/utilities/kwallet",permalink:"/docs/user/software/utilities/kwallet",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/utilities/kwallet.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"KDE Wallet",summary:"A quick introduction to using KWallet on Solus"},sidebar:"userSidebar",previous:{title:"KSysGuard",permalink:"/docs/user/software/utilities/ksysguard"},next:{title:"Virtualization",permalink:"/docs/category/virtualization"}},r={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"The SSH_ASKPASS environment variable",id:"the-ssh_askpass-environment-variable",level:2},{value:"Create ~/.config/autostart/ssh-add.desktop",id:"create-configautostartssh-adddesktop",level:2},{value:"Example",id:"example",level:3},{value:"Set correct permissions",id:"set-correct-permissions",level:3},{value:"Re-log to test your changes",id:"re-log-to-test-your-changes",level:2},{value:"Unlock SSH key passphrases automatically on login",id:"unlock-ssh-key-passphrases-automatically-on-login",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2}];function h(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"kde-wallet-and-ssh-keys",children:"KDE Wallet and SSH keys"})}),"\n",(0,n.jsx)(s.p,{children:"In KDE Plasma, the KDE Wallet is responsible for securely storing and supplying user credentials to the various KDE applications that request them."}),"\n",(0,n.jsx)(s.p,{children:"Out of the box, the Solus KDE Plasma Desktop is already configured to use the KDE Wallet PAM module, which unlocks the KDE Wallet on session login."}),"\n",(0,n.jsx)(s.p,{children:"However, additional configuration is needed to make the KDE Wallet manage SSH key passphrases."}),"\n",(0,n.jsx)(s.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,n.jsx)(s.p,{children:"This document assumes that you are familiar with utilising SSH key passphrases."}),"\n",(0,n.jsxs)(s.p,{children:["For more information, see ",(0,n.jsx)(s.a,{href:"https://docs.github.com/en/authentication/connecting-to-github-with-ssh/working-with-ssh-key-passphrases",children:"working with SSH key passphrases"})]}),"\n",(0,n.jsxs)(s.h2,{id:"the-ssh_askpass-environment-variable",children:["The ",(0,n.jsx)(s.code,{children:"SSH_ASKPASS"})," environment variable"]}),"\n",(0,n.jsxs)(s.p,{children:["The ",(0,n.jsx)(s.code,{children:"SSH_ASKPASS"})," environment variable tells the SSH subsystem which application to use when prompting the user for SSH key passphrases."]}),"\n",(0,n.jsxs)(s.p,{children:["On the Solus KDE Plasma Desktop spin, ",(0,n.jsx)(s.code,{children:"ksshaskpass"})," is installed out of the box and ",(0,n.jsx)(s.code,{children:"SSH_ASKPASS"})," is set to ",(0,n.jsx)(s.code,{children:"ksshaskpass"})," in the file ",(0,n.jsx)(s.code,{children:"/usr/share/xdg/plasma-workspace/env/50-solus-defaults.sh"})," by default."]}),"\n",(0,n.jsxs)(s.h2,{id:"create-configautostartssh-adddesktop",children:["Create ",(0,n.jsx)(s.code,{children:"~/.config/autostart/ssh-add.desktop"})]}),"\n",(0,n.jsxs)(s.p,{children:["The contents of ",(0,n.jsx)(s.code,{children:"~/.config/autostart/ssh-add.desktop"})," should reflect the SSH keys you want to manage using the KDE Wallet."]}),"\n",(0,n.jsx)(s.h3,{id:"example",children:"Example"}),"\n",(0,n.jsxs)(s.p,{children:["Below is an example of the contents of ",(0,n.jsx)(s.code,{children:"~/.config/autostart/ssh-add.desktop"}),":"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-ini",children:"[Desktop Entry]\nExec=ssh-add -q\nName=ssh-add\nType=Application\n"})}),"\n",(0,n.jsxs)(s.p,{children:["Tip: The above ssh-add.desktop file will only add the default key ",(0,n.jsx)(s.code,{children:"~/.ssh/id_rsa"}),". Assuming you have different keys named key1, key2 etc you need to change the above desktop file to"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-ini",children:"[Desktop Entry]\nExec=ssh-add -q ~/.ssh/key1 ~/.ssh/key2 ~/.ssh/key3\nName=ssh-add\nType=Application\n"})}),"\n",(0,n.jsx)(s.h3,{id:"set-correct-permissions",children:"Set correct permissions"}),"\n",(0,n.jsx)(s.p,{children:"After you created your file inside the autostart folder you have to give it the correct permissions"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"chmod 700 ~/.config/autostart/ssh-add.desktop\n"})}),"\n",(0,n.jsx)(s.p,{children:"with this the file should appear inside the autostart settings"}),"\n",(0,n.jsx)(s.h2,{id:"re-log-to-test-your-changes",children:"Re-log to test your changes"}),"\n",(0,n.jsx)(s.p,{children:"After logging out and back in, you should now be prompted by the KDE Wallet to input your SSH key passphrases."}),"\n",(0,n.jsx)(s.h2,{id:"unlock-ssh-key-passphrases-automatically-on-login",children:"Unlock SSH key passphrases automatically on login"}),"\n",(0,n.jsx)(s.p,{children:"KDE Wallet supports automatically unlocking your SSH key passphrases on login."}),"\n",(0,n.jsx)(s.p,{children:"For this to work, your KDE Wallet password needs to be identical to your login password."}),"\n",(0,n.jsx)(s.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,n.jsx)(s.p,{children:"ssh key doesn't get triggered, you can force this manually by running this command."}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"SSH_ASKPASS=/usr/bin/ksshaskpass ssh-add < /dev/null\n"})})]})}function c(e={}){const{wrapper:s}={...(0,a.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>l,a:()=>i});var n=t(67294);const a={},o=n.createContext(a);function i(e){const s=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1242],{65574:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>r,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var n=t(85893),a=t(11151);const o={title:"KDE Wallet",summary:"A quick introduction to using KWallet on Solus"},i="KDE Wallet and SSH keys",l={id:"user/software/utilities/kwallet",title:"KDE Wallet",description:"In KDE Plasma, the KDE Wallet is responsible for securely storing and supplying user credentials to the various KDE applications that request them.",source:"@site/docs/user/software/utilities/kwallet.md",sourceDirName:"user/software/utilities",slug:"/user/software/utilities/kwallet",permalink:"/docs/user/software/utilities/kwallet",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/utilities/kwallet.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"KDE Wallet",summary:"A quick introduction to using KWallet on Solus"},sidebar:"userSidebar",previous:{title:"KSysGuard",permalink:"/docs/user/software/utilities/ksysguard"},next:{title:"Virtualization",permalink:"/docs/category/virtualization"}},r={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"The SSH_ASKPASS environment variable",id:"the-ssh_askpass-environment-variable",level:2},{value:"Create ~/.config/autostart/ssh-add.desktop",id:"create-configautostartssh-adddesktop",level:2},{value:"Example",id:"example",level:3},{value:"Set correct permissions",id:"set-correct-permissions",level:3},{value:"Re-log to test your changes",id:"re-log-to-test-your-changes",level:2},{value:"Unlock SSH key passphrases automatically on login",id:"unlock-ssh-key-passphrases-automatically-on-login",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2}];function h(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"kde-wallet-and-ssh-keys",children:"KDE Wallet and SSH keys"})}),"\n",(0,n.jsx)(s.p,{children:"In KDE Plasma, the KDE Wallet is responsible for securely storing and supplying user credentials to the various KDE applications that request them."}),"\n",(0,n.jsx)(s.p,{children:"Out of the box, the Solus KDE Plasma Desktop is already configured to use the KDE Wallet PAM module, which unlocks the KDE Wallet on session login."}),"\n",(0,n.jsx)(s.p,{children:"However, additional configuration is needed to make the KDE Wallet manage SSH key passphrases."}),"\n",(0,n.jsx)(s.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,n.jsx)(s.p,{children:"This document assumes that you are familiar with utilising SSH key passphrases."}),"\n",(0,n.jsxs)(s.p,{children:["For more information, see ",(0,n.jsx)(s.a,{href:"https://docs.github.com/en/authentication/connecting-to-github-with-ssh/working-with-ssh-key-passphrases",children:"working with SSH key passphrases"})]}),"\n",(0,n.jsxs)(s.h2,{id:"the-ssh_askpass-environment-variable",children:["The ",(0,n.jsx)(s.code,{children:"SSH_ASKPASS"})," environment variable"]}),"\n",(0,n.jsxs)(s.p,{children:["The ",(0,n.jsx)(s.code,{children:"SSH_ASKPASS"})," environment variable tells the SSH subsystem which application to use when prompting the user for SSH key passphrases."]}),"\n",(0,n.jsxs)(s.p,{children:["On the Solus KDE Plasma Desktop spin, ",(0,n.jsx)(s.code,{children:"ksshaskpass"})," is installed out of the box and ",(0,n.jsx)(s.code,{children:"SSH_ASKPASS"})," is set to ",(0,n.jsx)(s.code,{children:"ksshaskpass"})," in the file ",(0,n.jsx)(s.code,{children:"/usr/share/xdg/plasma-workspace/env/50-solus-defaults.sh"})," by default."]}),"\n",(0,n.jsxs)(s.h2,{id:"create-configautostartssh-adddesktop",children:["Create ",(0,n.jsx)(s.code,{children:"~/.config/autostart/ssh-add.desktop"})]}),"\n",(0,n.jsxs)(s.p,{children:["The contents of ",(0,n.jsx)(s.code,{children:"~/.config/autostart/ssh-add.desktop"})," should reflect the SSH keys you want to manage using the KDE Wallet."]}),"\n",(0,n.jsx)(s.h3,{id:"example",children:"Example"}),"\n",(0,n.jsxs)(s.p,{children:["Below is an example of the contents of ",(0,n.jsx)(s.code,{children:"~/.config/autostart/ssh-add.desktop"}),":"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-ini",children:"[Desktop Entry]\nExec=ssh-add -q\nName=ssh-add\nType=Application\n"})}),"\n",(0,n.jsxs)(s.p,{children:["Tip: The above ssh-add.desktop file will only add the default key ",(0,n.jsx)(s.code,{children:"~/.ssh/id_rsa"}),". Assuming you have different keys named key1, key2 etc you need to change the above desktop file to"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-ini",children:"[Desktop Entry]\nExec=ssh-add -q ~/.ssh/key1 ~/.ssh/key2 ~/.ssh/key3\nName=ssh-add\nType=Application\n"})}),"\n",(0,n.jsx)(s.h3,{id:"set-correct-permissions",children:"Set correct permissions"}),"\n",(0,n.jsx)(s.p,{children:"After you created your file inside the autostart folder you have to give it the correct permissions"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"chmod 700 ~/.config/autostart/ssh-add.desktop\n"})}),"\n",(0,n.jsx)(s.p,{children:"with this the file should appear inside the autostart settings"}),"\n",(0,n.jsx)(s.h2,{id:"re-log-to-test-your-changes",children:"Re-log to test your changes"}),"\n",(0,n.jsx)(s.p,{children:"After logging out and back in, you should now be prompted by the KDE Wallet to input your SSH key passphrases."}),"\n",(0,n.jsx)(s.h2,{id:"unlock-ssh-key-passphrases-automatically-on-login",children:"Unlock SSH key passphrases automatically on login"}),"\n",(0,n.jsx)(s.p,{children:"KDE Wallet supports automatically unlocking your SSH key passphrases on login."}),"\n",(0,n.jsx)(s.p,{children:"For this to work, your KDE Wallet password needs to be identical to your login password."}),"\n",(0,n.jsx)(s.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,n.jsx)(s.p,{children:"ssh key doesn't get triggered, you can force this manually by running this command."}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"SSH_ASKPASS=/usr/bin/ksshaskpass ssh-add < /dev/null\n"})})]})}function c(e={}){const{wrapper:s}={...(0,a.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>l,a:()=>i});var n=t(67294);const a={},o=n.createContext(a);function i(e){const s=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8d193990.043ec1a8.js b/assets/js/8d193990.043ec1a8.js deleted file mode 100644 index 571354421..000000000 --- a/assets/js/8d193990.043ec1a8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1539],{5436:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>r,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var s=o(85893),n=o(11151);const i={title:"eopkg is dead, long live eopkg",slug:"eopkg-is-dead-long-live-eopkg",authors:"david",tags:["eopkg","devlog","moss","solus"],hide_table_of_contents:!1},l=void 0,a={permalink:"/blog/eopkg-is-dead-long-live-eopkg",source:"@site/devlog/2024-01-19-eopkg-is-dead.md",title:"eopkg is dead, long live eopkg",description:"Close watchers of our packages repository may have noticed some strange looking items:",date:"2024-01-19T00:00:00.000Z",tags:[{inline:!0,label:"eopkg",permalink:"/blog/tags/eopkg"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"moss",permalink:"/blog/tags/moss"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:1.645,hasTruncateMarker:!0,authors:[{name:"David Harder",title:"Solus Staff",page:{permalink:"/blog/authors/david"},socials:{github:"https://github.com/davidjharder"},imageURL:"https://avatars.githubusercontent.com/u/23007135?v=4",key:"david"}],frontMatter:{title:"eopkg is dead, long live eopkg",slug:"eopkg-is-dead-long-live-eopkg",authors:"david",tags:["eopkg","devlog","moss","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Don't call me MATE, pal!",permalink:"/blog/don't-call-me-mate-pal"},nextItem:{title:"Welcome to the Solus Devlog",permalink:"/blog/welcome-solus-devlog-v1"}},r={authorsImageUrls:[void 0]},c=[];function h(e){const t={a:"a",code:"code",em:"em",li:"li",p:"p",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["Close watchers of our ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages",children:"packages repository"})," may have noticed some strange looking items:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages/pull/1305",children:"Initial inclusion of eopkg4-bin"})}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/1316",children:"Testing the eopkg4-bin package"})," Warning: Minions GIF"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"It's a long story."}),"\n",(0,s.jsxs)(t.p,{children:["Our package manager ",(0,s.jsx)(t.code,{children:"eopkg"})," is written in Python2. Python2 was originally planned to hit end-of-life all the way back in 2015! So Solus contributors past and present have wrestled with three thorny issues:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Do we really want to just port ",(0,s.jsx)(t.code,{children:"eopkg"})," to python3? Surely we could build something newer and shinier."]}),"\n",(0,s.jsxs)(t.li,{children:["How exactly do we want to port ",(0,s.jsx)(t.code,{children:"eopkg"})," to Python3? (We'll call this ported version ",(0,s.jsx)(t.code,{children:"eopkg3"})," for short)"]}),"\n",(0,s.jsxs)(t.li,{children:["How do we make sure ",(0,s.jsx)(t.code,{children:"eopkg3"})," works even if something goes wrong with the Python3 libraries on someone's machine?"]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Here's the plan to solve this: Ikey and friends over at Serpent OS are actively building a new package manager ",(0,s.jsx)(t.a,{href:"https://github.com/serpent-os/moss",children:(0,s.jsx)(t.em,{children:"moss"})})," that we are excited about. And they're building it with Solus in mind as an eventual user. This will be our fix for the first problem. In the meantime, we're taking a pragmatic approach to the last two issues so that (frankly) we can do more exciting things."]}),"\n",(0,s.jsxs)(t.p,{children:["Sheepman, Livingsilver, and others completed a ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/eopkg/commits/python3",children:"direct Python3 port"}),", which we never expect our users to actually run directly like a traditional Python program. Instead, that port will be compiled into a ",(0,s.jsx)(t.em,{children:"binary"})," using ",(0,s.jsx)(t.a,{href:"https://nuitka.net/doc/download.html",children:"nuitka"}),". We're calling this compiled ",(0,s.jsx)(t.code,{children:"eopkg3"})," binary ",(0,s.jsx)(t.code,{children:"eopkg4-bin"})," for now. Critically, this binary will have ",(0,s.jsx)(t.em,{children:"no dependencies"})," other than ",(0,s.jsx)(t.code,{children:"libc"}),". If we can successfully swap ",(0,s.jsx)(t.code,{children:"eopkg"})," with ",(0,s.jsx)(t.code,{children:"eopkg4-bin"})," on user's machines, then we've solved the last issue: Python3 can be updated without worrying about also wrecking the package manager. Got it?"]}),"\n",(0,s.jsxs)(t.p,{children:["But what about Python2? Well, now that Evan and Joey have seen off a ",(0,s.jsx)(t.a,{href:"https://getsol.us/2024/01/08/solus-4-5-released/",children:"successful ISO release"})," with a ",(0,s.jsx)(t.code,{children:"calamares"})," based installer, we can cross ",(0,s.jsx)(t.code,{children:"os-installer"})," ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/270",children:"off the list"}),". And ",(0,s.jsx)(t.code,{children:"eopkg4-bin"})," will let us cross off a whole bunch more. The rest of that list is a story for another day."]})]})}function d(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},11151:(e,t,o)=>{o.d(t,{Z:()=>a,a:()=>l});var s=o(67294);const n={},i=s.createContext(n);function l(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:l(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8d193990.e1e40f22.js b/assets/js/8d193990.e1e40f22.js new file mode 100644 index 000000000..5b91b8c8e --- /dev/null +++ b/assets/js/8d193990.e1e40f22.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1539],{5436:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>r,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var s=o(85893),n=o(11151);const i={title:"eopkg is dead, long live eopkg",slug:"eopkg-is-dead-long-live-eopkg",authors:"david",tags:["eopkg","devlog","moss","solus"],hide_table_of_contents:!1},l=void 0,a={permalink:"/blog/eopkg-is-dead-long-live-eopkg",source:"@site/devlog/2024-01-19-eopkg-is-dead.md",title:"eopkg is dead, long live eopkg",description:"Close watchers of our packages repository may have noticed some strange looking items:",date:"2024-01-19T00:00:00.000Z",tags:[{inline:!0,label:"eopkg",permalink:"/blog/tags/eopkg"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"moss",permalink:"/blog/tags/moss"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:1.645,hasTruncateMarker:!0,authors:[{name:"David Harder",title:"Solus Staff",page:{permalink:"/blog/authors/david"},socials:{github:"https://github.com/davidjharder"},imageURL:"https://avatars.githubusercontent.com/u/23007135",key:"david"}],frontMatter:{title:"eopkg is dead, long live eopkg",slug:"eopkg-is-dead-long-live-eopkg",authors:"david",tags:["eopkg","devlog","moss","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Don't call me MATE, pal!",permalink:"/blog/don't-call-me-mate-pal"},nextItem:{title:"Welcome to the Solus Devlog",permalink:"/blog/welcome-solus-devlog-v1"}},r={authorsImageUrls:[void 0]},c=[];function h(e){const t={a:"a",code:"code",em:"em",li:"li",p:"p",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(t.p,{children:["Close watchers of our ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages",children:"packages repository"})," may have noticed some strange looking items:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages/pull/1305",children:"Initial inclusion of eopkg4-bin"})}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/1316",children:"Testing the eopkg4-bin package"})," Warning: Minions GIF"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"It's a long story."}),"\n",(0,s.jsxs)(t.p,{children:["Our package manager ",(0,s.jsx)(t.code,{children:"eopkg"})," is written in Python2. Python2 was originally planned to hit end-of-life all the way back in 2015! So Solus contributors past and present have wrestled with three thorny issues:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Do we really want to just port ",(0,s.jsx)(t.code,{children:"eopkg"})," to python3? Surely we could build something newer and shinier."]}),"\n",(0,s.jsxs)(t.li,{children:["How exactly do we want to port ",(0,s.jsx)(t.code,{children:"eopkg"})," to Python3? (We'll call this ported version ",(0,s.jsx)(t.code,{children:"eopkg3"})," for short)"]}),"\n",(0,s.jsxs)(t.li,{children:["How do we make sure ",(0,s.jsx)(t.code,{children:"eopkg3"})," works even if something goes wrong with the Python3 libraries on someone's machine?"]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Here's the plan to solve this: Ikey and friends over at Serpent OS are actively building a new package manager ",(0,s.jsx)(t.a,{href:"https://github.com/serpent-os/moss",children:(0,s.jsx)(t.em,{children:"moss"})})," that we are excited about. And they're building it with Solus in mind as an eventual user. This will be our fix for the first problem. In the meantime, we're taking a pragmatic approach to the last two issues so that (frankly) we can do more exciting things."]}),"\n",(0,s.jsxs)(t.p,{children:["Sheepman, Livingsilver, and others completed a ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/eopkg/commits/python3",children:"direct Python3 port"}),", which we never expect our users to actually run directly like a traditional Python program. Instead, that port will be compiled into a ",(0,s.jsx)(t.em,{children:"binary"})," using ",(0,s.jsx)(t.a,{href:"https://nuitka.net/doc/download.html",children:"nuitka"}),". We're calling this compiled ",(0,s.jsx)(t.code,{children:"eopkg3"})," binary ",(0,s.jsx)(t.code,{children:"eopkg4-bin"})," for now. Critically, this binary will have ",(0,s.jsx)(t.em,{children:"no dependencies"})," other than ",(0,s.jsx)(t.code,{children:"libc"}),". If we can successfully swap ",(0,s.jsx)(t.code,{children:"eopkg"})," with ",(0,s.jsx)(t.code,{children:"eopkg4-bin"})," on user's machines, then we've solved the last issue: Python3 can be updated without worrying about also wrecking the package manager. Got it?"]}),"\n",(0,s.jsxs)(t.p,{children:["But what about Python2? Well, now that Evan and Joey have seen off a ",(0,s.jsx)(t.a,{href:"https://getsol.us/2024/01/08/solus-4-5-released/",children:"successful ISO release"})," with a ",(0,s.jsx)(t.code,{children:"calamares"})," based installer, we can cross ",(0,s.jsx)(t.code,{children:"os-installer"})," ",(0,s.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/270",children:"off the list"}),". And ",(0,s.jsx)(t.code,{children:"eopkg4-bin"})," will let us cross off a whole bunch more. The rest of that list is a story for another day."]})]})}function d(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},11151:(e,t,o)=>{o.d(t,{Z:()=>a,a:()=>l});var s=o(67294);const n={},i=s.createContext(n);function l(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:l(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8e3d5b32.6f81261a.js b/assets/js/8e3d5b32.c1cc1aff.js similarity index 98% rename from assets/js/8e3d5b32.6f81261a.js rename to assets/js/8e3d5b32.c1cc1aff.js index 7b095fb56..8300814bf 100644 --- a/assets/js/8e3d5b32.6f81261a.js +++ b/assets/js/8e3d5b32.c1cc1aff.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8499],{15838:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>d});var t=n(85893),s=n(11151);const a={title:"IBus",summary:"Configuration of additional languages via IBUS"},o="IBus",r={id:"user/software/localization/ibus",title:"IBus",description:"Configuration",source:"@site/docs/user/software/localization/ibus.md",sourceDirName:"user/software/localization",slug:"/user/software/localization/ibus",permalink:"/docs/user/software/localization/ibus",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/localization/ibus.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"IBus",summary:"Configuration of additional languages via IBUS"},sidebar:"userSidebar",previous:{title:"Localization",permalink:"/docs/category/localization"},next:{title:"Networking",permalink:"/docs/category/networking"}},l={},d=[{value:"Configuration",id:"configuration",level:2},{value:"IBus IME package list",id:"ibus-ime-package-list",level:2}];function c(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"ibus",children:"IBus"})}),"\n",(0,t.jsx)(i.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsxs)(i.p,{children:["Find the IME (Input Method Editor) you require from the ",(0,t.jsx)(i.a,{href:"#ibus-ime-package-list",children:"IBus IME package list"}),' and then search for it in the Software Center. Click "Install" to add the IME.']}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"IBus IME Install",src:n(38161).Z+"",width:"812",height:"315"})}),"\n",(0,t.jsx)(i.p,{children:"You may have to agree to install some additional dependencies and will need to type in your user password as authentication is required."}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"IBus IME Dependencies",src:n(11533).Z+"",width:"446",height:"445"})}),"\n",(0,t.jsxs)(i.p,{children:["Once it has finished installing, logout of your computer and then login again. Now you'll be able to select the newly installed IME by following the same steps as detailed above for changing keyboard layouts in Budgie. For instance, in this example we have installed the ",(0,t.jsx)(i.code,{children:"ibus-hangul"})," package for the Korean language. By following the steps above and then searching for Korean keyboard layouts, we are now able to select Korean (Hangul) as an input source."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"IBus Region and Language",src:n(99809).Z+"",width:"742",height:"394"})}),"\n",(0,t.jsxs)(i.p,{children:["Additionally, once you have added the IME and have it selected in the Region & Languages window, you can click on the cog icon under the input sources to load the settings window for your specific IME. The ",(0,t.jsx)(i.code,{children:"ibus-hangul"})," settings window is shown below but this will vary between the different IME's."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"IBus IME Settings Example: Hangul",src:n(40584).Z+"",width:"347",height:"405"})}),"\n",(0,t.jsx)(i.h2,{id:"ibus-ime-package-list",children:"IBus IME package list"}),"\n",(0,t.jsx)(i.p,{children:"A list of IBus IME packages available in the Solus software repository."}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Package"}),(0,t.jsx)(i.th,{children:"Input Method"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-anthy"}),(0,t.jsx)(i.td,{children:"Japanese"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-chewing"}),(0,t.jsx)(i.td,{children:"Phonetic Chinese input method for Zhuyin (Bopomofo)"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-hangul"}),(0,t.jsx)(i.td,{children:"Korean"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-m17n"}),(0,t.jsx)(i.td,{children:"Multiple Languages"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-unikey"}),(0,t.jsx)(i.td,{children:"Vietnamese"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-libpinyin"}),(0,t.jsx)(i.td,{children:"Chinese Pinyin and Bopomofo"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-libzhuyin"}),(0,t.jsx)(i.td,{children:"Chinese Zhuyin"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-cangjie"}),(0,t.jsx)(i.td,{children:"Simplified Cangjie"})]})]})]})]})}function h(e={}){const{wrapper:i}={...(0,s.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},11533:(e,i,n)=>{n.d(i,{Z:()=>t});const t=n.p+"assets/images/ibus-ime-dependencies-0dc4668d437230c7528de2f86647531b.jpg"},38161:(e,i,n)=>{n.d(i,{Z:()=>t});const t=n.p+"assets/images/ibus-ime-install-68ba41c372dec67147393ad161a0f6f9.jpg"},40584:(e,i,n)=>{n.d(i,{Z:()=>t});const t=n.p+"assets/images/ibus-ime-settings-hangul-27a3a73e189a7c7e02287539008b825c.jpg"},99809:(e,i,n)=>{n.d(i,{Z:()=>t});const t=n.p+"assets/images/ibus-region-and-languages-beb500ff774fb2dc414857fe1d196515.jpg"},11151:(e,i,n)=>{n.d(i,{Z:()=>r,a:()=>o});var t=n(67294);const s={},a=t.createContext(s);function o(e){const i=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8499],{15838:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>d});var t=n(85893),s=n(11151);const a={title:"IBus",summary:"Configuration of additional languages via IBUS"},o="IBus",r={id:"user/software/localization/ibus",title:"IBus",description:"Configuration",source:"@site/docs/user/software/localization/ibus.md",sourceDirName:"user/software/localization",slug:"/user/software/localization/ibus",permalink:"/docs/user/software/localization/ibus",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/localization/ibus.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"IBus",summary:"Configuration of additional languages via IBUS"},sidebar:"userSidebar",previous:{title:"Localization",permalink:"/docs/category/localization"},next:{title:"Networking",permalink:"/docs/category/networking"}},l={},d=[{value:"Configuration",id:"configuration",level:2},{value:"IBus IME package list",id:"ibus-ime-package-list",level:2}];function c(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"ibus",children:"IBus"})}),"\n",(0,t.jsx)(i.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsxs)(i.p,{children:["Find the IME (Input Method Editor) you require from the ",(0,t.jsx)(i.a,{href:"#ibus-ime-package-list",children:"IBus IME package list"}),' and then search for it in the Software Center. Click "Install" to add the IME.']}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"IBus IME Install",src:n(38161).Z+"",width:"812",height:"315"})}),"\n",(0,t.jsx)(i.p,{children:"You may have to agree to install some additional dependencies and will need to type in your user password as authentication is required."}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"IBus IME Dependencies",src:n(11533).Z+"",width:"446",height:"445"})}),"\n",(0,t.jsxs)(i.p,{children:["Once it has finished installing, logout of your computer and then login again. Now you'll be able to select the newly installed IME by following the same steps as detailed above for changing keyboard layouts in Budgie. For instance, in this example we have installed the ",(0,t.jsx)(i.code,{children:"ibus-hangul"})," package for the Korean language. By following the steps above and then searching for Korean keyboard layouts, we are now able to select Korean (Hangul) as an input source."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"IBus Region and Language",src:n(99809).Z+"",width:"742",height:"394"})}),"\n",(0,t.jsxs)(i.p,{children:["Additionally, once you have added the IME and have it selected in the Region & Languages window, you can click on the cog icon under the input sources to load the settings window for your specific IME. The ",(0,t.jsx)(i.code,{children:"ibus-hangul"})," settings window is shown below but this will vary between the different IME's."]}),"\n",(0,t.jsx)(i.p,{children:(0,t.jsx)(i.img,{alt:"IBus IME Settings Example: Hangul",src:n(40584).Z+"",width:"347",height:"405"})}),"\n",(0,t.jsx)(i.h2,{id:"ibus-ime-package-list",children:"IBus IME package list"}),"\n",(0,t.jsx)(i.p,{children:"A list of IBus IME packages available in the Solus software repository."}),"\n",(0,t.jsxs)(i.table,{children:[(0,t.jsx)(i.thead,{children:(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.th,{children:"Package"}),(0,t.jsx)(i.th,{children:"Input Method"})]})}),(0,t.jsxs)(i.tbody,{children:[(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-anthy"}),(0,t.jsx)(i.td,{children:"Japanese"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-chewing"}),(0,t.jsx)(i.td,{children:"Phonetic Chinese input method for Zhuyin (Bopomofo)"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-hangul"}),(0,t.jsx)(i.td,{children:"Korean"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-m17n"}),(0,t.jsx)(i.td,{children:"Multiple Languages"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-unikey"}),(0,t.jsx)(i.td,{children:"Vietnamese"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-libpinyin"}),(0,t.jsx)(i.td,{children:"Chinese Pinyin and Bopomofo"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-libzhuyin"}),(0,t.jsx)(i.td,{children:"Chinese Zhuyin"})]}),(0,t.jsxs)(i.tr,{children:[(0,t.jsx)(i.td,{children:"ibus-cangjie"}),(0,t.jsx)(i.td,{children:"Simplified Cangjie"})]})]})]})]})}function h(e={}){const{wrapper:i}={...(0,s.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},11533:(e,i,n)=>{n.d(i,{Z:()=>t});const t=n.p+"assets/images/ibus-ime-dependencies-0dc4668d437230c7528de2f86647531b.jpg"},38161:(e,i,n)=>{n.d(i,{Z:()=>t});const t=n.p+"assets/images/ibus-ime-install-68ba41c372dec67147393ad161a0f6f9.jpg"},40584:(e,i,n)=>{n.d(i,{Z:()=>t});const t=n.p+"assets/images/ibus-ime-settings-hangul-27a3a73e189a7c7e02287539008b825c.jpg"},99809:(e,i,n)=>{n.d(i,{Z:()=>t});const t=n.p+"assets/images/ibus-region-and-languages-beb500ff774fb2dc414857fe1d196515.jpg"},11151:(e,i,n)=>{n.d(i,{Z:()=>r,a:()=>o});var t=n(67294);const s={},a=t.createContext(s);function o(e){const i=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8e861970.06f1c4da.js b/assets/js/8e861970.2715b317.js similarity index 98% rename from assets/js/8e861970.06f1c4da.js rename to assets/js/8e861970.2715b317.js index 8c25de852..c823ffdc7 100644 --- a/assets/js/8e861970.06f1c4da.js +++ b/assets/js/8e861970.2715b317.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8026],{95751:(e,s,a)=>{a.r(s),a.d(s,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>o,toc:()=>u});var t=a(85893),n=a(11151);const r={title:"Requesting a Package",summary:"Requesting a new package"},i="Requesting A Package",o={id:"packaging/procedures/request-a-package",title:"Requesting a Package",description:"If you think Solus is missing a package that would be useful, you can let us know using our Issue Tracker.",source:"@site/docs/packaging/procedures/request-a-package.md",sourceDirName:"packaging/procedures",slug:"/packaging/procedures/request-a-package",permalink:"/docs/packaging/procedures/request-a-package",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/request-a-package.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Requesting a Package",summary:"Requesting a new package"},sidebar:"packagingSidebar",previous:{title:"Requesting a Package Update",permalink:"/docs/packaging/procedures/request-a-package-update"},next:{title:"Rebuilding a stack",permalink:"/docs/packaging/stack-rebuilds"}},c={},u=[{value:"Steps to request a new package",id:"steps-to-request-a-new-package",level:2}];function l(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,n.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"requesting-a-package",children:"Requesting A Package"})}),"\n",(0,t.jsx)(s.p,{children:"If you think Solus is missing a package that would be useful, you can let us know using our Issue Tracker."}),"\n",(0,t.jsx)(s.h2,{id:"steps-to-request-a-new-package",children:"Steps to request a new package"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.a,{href:"https://github.com/getsolus/packages/issues?q=sort%3Aupdated-desc+is%3Aopen+label%3A%22Package%3A+Addition+Request%22",children:"Look to see if an issue has already been filed"})," for the package you want. If there is already request for your package, please do not open another issue. Instead, add your comments to the existing issue."]}),"\n",(0,t.jsxs)(s.li,{children:["Skim our ",(0,t.jsx)(s.a,{href:"/docs/packaging/procedures/package-inclusion",children:"Package inclusion policy"})," to make sure your request won't be rejected."]}),"\n",(0,t.jsxs)(s.li,{children:["Open a new ",(0,t.jsx)(s.a,{href:"https://github.com/getsolus/packages/issues/new?assignees=&labels=Package%3A+Addition+Request%2CPriority%3A+Wishlist&projects=&template=request-new-package.yml&title=What%27s+the+package+name%3F",children:"issue"})," for your package using the ",(0,t.jsx)(s.em,{children:"Request a new package"})," template. The template will ask you for the following information. Please complete as much as you can.","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"Name"}),"\n",(0,t.jsx)(s.li,{children:"Homepage"}),"\n",(0,t.jsxs)(s.li,{children:["Why should this be included in the repository? If we already offer similar packages in our repository ",(0,t.jsx)(s.strong,{children:"or third party repository"}),", please tell us what your new package does that our existing packages do not (",(0,t.jsx)(s.em,{children:"How is it different or better"}),")."]}),"\n",(0,t.jsxs)(s.li,{children:["Are we allowed to distribute it?","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["For Solus to distribute the package it must use a license found on the ",(0,t.jsx)(s.a,{href:"https://spdx.org/licenses/",children:"SPDX License List"}),", or Solus must be given permission to redistribute it by the owner."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.li,{children:"What kind of user will use this package, and how many users do you think will use this package?"}),"\n",(0,t.jsxs)(s.li,{children:["Link to source tarball/zip file. This must point to a stable, versioned source, for example: ",(0,t.jsx)(s.code,{children:"1.2.3.tar.gz"})," or ",(0,t.jsx)(s.code,{children:"packagename-1.2.3"}),". Nightlies, snapshots and pre-releases are not allowed."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.li,{children:"Wait for Solus Staff to approve or reject your request."}),"\n"]})]})}function d(e={}){const{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,s,a)=>{a.d(s,{Z:()=>o,a:()=>i});var t=a(67294);const n={},r=t.createContext(n);function i(e){const s=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8026],{95751:(e,s,a)=>{a.r(s),a.d(s,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>o,toc:()=>u});var t=a(85893),n=a(11151);const r={title:"Requesting a Package",summary:"Requesting a new package"},i="Requesting A Package",o={id:"packaging/procedures/request-a-package",title:"Requesting a Package",description:"If you think Solus is missing a package that would be useful, you can let us know using our Issue Tracker.",source:"@site/docs/packaging/procedures/request-a-package.md",sourceDirName:"packaging/procedures",slug:"/packaging/procedures/request-a-package",permalink:"/docs/packaging/procedures/request-a-package",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/request-a-package.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Requesting a Package",summary:"Requesting a new package"},sidebar:"packagingSidebar",previous:{title:"Requesting a Package Update",permalink:"/docs/packaging/procedures/request-a-package-update"},next:{title:"Rebuilding a stack",permalink:"/docs/packaging/stack-rebuilds"}},c={},u=[{value:"Steps to request a new package",id:"steps-to-request-a-new-package",level:2}];function l(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,n.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"requesting-a-package",children:"Requesting A Package"})}),"\n",(0,t.jsx)(s.p,{children:"If you think Solus is missing a package that would be useful, you can let us know using our Issue Tracker."}),"\n",(0,t.jsx)(s.h2,{id:"steps-to-request-a-new-package",children:"Steps to request a new package"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.a,{href:"https://github.com/getsolus/packages/issues?q=sort%3Aupdated-desc+is%3Aopen+label%3A%22Package%3A+Addition+Request%22",children:"Look to see if an issue has already been filed"})," for the package you want. If there is already request for your package, please do not open another issue. Instead, add your comments to the existing issue."]}),"\n",(0,t.jsxs)(s.li,{children:["Skim our ",(0,t.jsx)(s.a,{href:"/docs/packaging/procedures/package-inclusion",children:"Package inclusion policy"})," to make sure your request won't be rejected."]}),"\n",(0,t.jsxs)(s.li,{children:["Open a new ",(0,t.jsx)(s.a,{href:"https://github.com/getsolus/packages/issues/new?assignees=&labels=Package%3A+Addition+Request%2CPriority%3A+Wishlist&projects=&template=request-new-package.yml&title=What%27s+the+package+name%3F",children:"issue"})," for your package using the ",(0,t.jsx)(s.em,{children:"Request a new package"})," template. The template will ask you for the following information. Please complete as much as you can.","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"Name"}),"\n",(0,t.jsx)(s.li,{children:"Homepage"}),"\n",(0,t.jsxs)(s.li,{children:["Why should this be included in the repository? If we already offer similar packages in our repository ",(0,t.jsx)(s.strong,{children:"or third party repository"}),", please tell us what your new package does that our existing packages do not (",(0,t.jsx)(s.em,{children:"How is it different or better"}),")."]}),"\n",(0,t.jsxs)(s.li,{children:["Are we allowed to distribute it?","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["For Solus to distribute the package it must use a license found on the ",(0,t.jsx)(s.a,{href:"https://spdx.org/licenses/",children:"SPDX License List"}),", or Solus must be given permission to redistribute it by the owner."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.li,{children:"What kind of user will use this package, and how many users do you think will use this package?"}),"\n",(0,t.jsxs)(s.li,{children:["Link to source tarball/zip file. This must point to a stable, versioned source, for example: ",(0,t.jsx)(s.code,{children:"1.2.3.tar.gz"})," or ",(0,t.jsx)(s.code,{children:"packagename-1.2.3"}),". Nightlies, snapshots and pre-releases are not allowed."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.li,{children:"Wait for Solus Staff to approve or reject your request."}),"\n"]})]})}function d(e={}){const{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,s,a)=>{a.d(s,{Z:()=>o,a:()=>i});var t=a(67294);const n={},r=t.createContext(n);function i(e){const s=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8e886580.28508e9f.js b/assets/js/8e886580.36d0b6a0.js similarity index 98% rename from assets/js/8e886580.28508e9f.js rename to assets/js/8e886580.36d0b6a0.js index d331bf27c..1818ed3c8 100644 --- a/assets/js/8e886580.28508e9f.js +++ b/assets/js/8e886580.36d0b6a0.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4978],{71137:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>c,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var n=s(85893),o=s(11151);const r={title:"Rust",summary:"A quick guide to getting set up for Rust development on Solus"},i="Rust",l={id:"user/software/development/rust",title:"Rust",description:"There are two ways to install Rust. This article explains how they differ and which one should be used, according to users' needs.",source:"@site/docs/user/software/development/rust.md",sourceDirName:"user/software/development",slug:"/user/software/development/rust",permalink:"/docs/user/software/development/rust",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/rust.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Rust",summary:"A quick guide to getting set up for Rust development on Solus"},sidebar:"userSidebar",previous:{title:"R and RStudio",permalink:"/docs/user/software/development/r-and-rstudio"},next:{title:"Web Development",permalink:"/docs/user/software/development/web"}},a={},d=[];function u(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"rust",children:"Rust"})}),"\n",(0,n.jsx)(t.p,{children:"There are two ways to install Rust. This article explains how they differ and which one should be used, according to users' needs."}),"\n",(0,n.jsx)(t.p,{children:"Rust can be obtained by:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Installing the ",(0,n.jsx)(t.code,{children:"rustup"})," package, then installing any Rust target and/or tool using ",(0,n.jsx)(t.code,{children:"rustup"})," itself"]}),"\n",(0,n.jsxs)(t.li,{children:["Installing the ",(0,n.jsx)(t.code,{children:"rust"})," package"]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["Users should prefer the ",(0,n.jsx)(t.code,{children:"rustup"})," way, since it gives the freedom to install any tools and targets, including nightly versions and debugging utilities, although it may require editing the ",(0,n.jsx)(t.code,{children:"PATH"})," variable depending on your shell setup. According to the official Rust ",(0,n.jsx)(t.a,{href:"https://www.rust-lang.org/tools/install",children:"installation guide"}),":"]}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsxs)(t.p,{children:["It is customary for Rust developers to include ",(0,n.jsx)(t.code,{children:"~/.cargo/bin"})," in their ",(0,n.jsx)(t.code,{children:"PATH "}),"environment variable. During installation rustup will attempt to configure the ",(0,n.jsx)(t.code,{children:"PATH"}),". Because of differences between platforms, command shells, and bugs in rustup, the modifications to ",(0,n.jsx)(t.code,{children:"PATH"})," may not take effect until the console is restarted, or the user is logged out, or it may not succeed at all."]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"rust"})," package, in fact, is present in the Solus repository for building packages that depend on it and it is not intended to be used by the final user, although it is possible and supported. Users that want to use the ",(0,n.jsx)(t.code,{children:"rust"})," package for their projects will be limited to the targets and tools that Solus needs to support, namely x86_64 and i686 Linux targets and ",(0,n.jsx)(t.code,{children:"cargo"}),". On the other hand, the ",(0,n.jsx)(t.code,{children:"rust"})," package is ready to use after its installation with no extra configurations."]}),"\n",(0,n.jsxs)(t.p,{children:["Either way, it is also recommended to install our ",(0,n.jsx)(t.code,{children:"system.devel"})," component, which is typically required for compiling. See our documentation for it ",(0,n.jsx)(t.a,{href:"/docs/user/software/development",children:"here"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["As a final note, it is possible to ",(0,n.jsx)(t.a,{href:"https://rust-lang.github.io/rustup/installation/already-installed-rust.html",children:"configure"})," ",(0,n.jsx)(t.code,{children:"rustup"})," to use the system toolchain. This setup is ",(0,n.jsx)(t.strong,{children:"discouraged"})," unless aimed at developing applications targeting Solus itself."]})]})}function c(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>l,a:()=>i});var n=s(67294);const o={},r=n.createContext(o);function i(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4978],{71137:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>c,frontMatter:()=>r,metadata:()=>l,toc:()=>d});var n=s(85893),o=s(11151);const r={title:"Rust",summary:"A quick guide to getting set up for Rust development on Solus"},i="Rust",l={id:"user/software/development/rust",title:"Rust",description:"There are two ways to install Rust. This article explains how they differ and which one should be used, according to users' needs.",source:"@site/docs/user/software/development/rust.md",sourceDirName:"user/software/development",slug:"/user/software/development/rust",permalink:"/docs/user/software/development/rust",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/rust.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Rust",summary:"A quick guide to getting set up for Rust development on Solus"},sidebar:"userSidebar",previous:{title:"R and RStudio",permalink:"/docs/user/software/development/r-and-rstudio"},next:{title:"Web Development",permalink:"/docs/user/software/development/web"}},a={},d=[];function u(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"rust",children:"Rust"})}),"\n",(0,n.jsx)(t.p,{children:"There are two ways to install Rust. This article explains how they differ and which one should be used, according to users' needs."}),"\n",(0,n.jsx)(t.p,{children:"Rust can be obtained by:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Installing the ",(0,n.jsx)(t.code,{children:"rustup"})," package, then installing any Rust target and/or tool using ",(0,n.jsx)(t.code,{children:"rustup"})," itself"]}),"\n",(0,n.jsxs)(t.li,{children:["Installing the ",(0,n.jsx)(t.code,{children:"rust"})," package"]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["Users should prefer the ",(0,n.jsx)(t.code,{children:"rustup"})," way, since it gives the freedom to install any tools and targets, including nightly versions and debugging utilities, although it may require editing the ",(0,n.jsx)(t.code,{children:"PATH"})," variable depending on your shell setup. According to the official Rust ",(0,n.jsx)(t.a,{href:"https://www.rust-lang.org/tools/install",children:"installation guide"}),":"]}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsxs)(t.p,{children:["It is customary for Rust developers to include ",(0,n.jsx)(t.code,{children:"~/.cargo/bin"})," in their ",(0,n.jsx)(t.code,{children:"PATH "}),"environment variable. During installation rustup will attempt to configure the ",(0,n.jsx)(t.code,{children:"PATH"}),". Because of differences between platforms, command shells, and bugs in rustup, the modifications to ",(0,n.jsx)(t.code,{children:"PATH"})," may not take effect until the console is restarted, or the user is logged out, or it may not succeed at all."]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"rust"})," package, in fact, is present in the Solus repository for building packages that depend on it and it is not intended to be used by the final user, although it is possible and supported. Users that want to use the ",(0,n.jsx)(t.code,{children:"rust"})," package for their projects will be limited to the targets and tools that Solus needs to support, namely x86_64 and i686 Linux targets and ",(0,n.jsx)(t.code,{children:"cargo"}),". On the other hand, the ",(0,n.jsx)(t.code,{children:"rust"})," package is ready to use after its installation with no extra configurations."]}),"\n",(0,n.jsxs)(t.p,{children:["Either way, it is also recommended to install our ",(0,n.jsx)(t.code,{children:"system.devel"})," component, which is typically required for compiling. See our documentation for it ",(0,n.jsx)(t.a,{href:"/docs/user/software/development",children:"here"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["As a final note, it is possible to ",(0,n.jsx)(t.a,{href:"https://rust-lang.github.io/rustup/installation/already-installed-rust.html",children:"configure"})," ",(0,n.jsx)(t.code,{children:"rustup"})," to use the system toolchain. This setup is ",(0,n.jsx)(t.strong,{children:"discouraged"})," unless aimed at developing applications targeting Solus itself."]})]})}function c(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>l,a:()=>i});var n=s(67294);const o={},r=n.createContext(o);function i(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9284d474.0391793d.js b/assets/js/9284d474.3452b32d.js similarity index 99% rename from assets/js/9284d474.0391793d.js rename to assets/js/9284d474.3452b32d.js index cce7281a8..559fd60b0 100644 --- a/assets/js/9284d474.0391793d.js +++ b/assets/js/9284d474.3452b32d.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7626],{8110:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>l,toc:()=>d});var i=s(85893),r=s(11151);const t={title:"Gaming",summary:"Instructions for installing various gaming software on Solus"},a="Gaming",l={id:"user/software/gaming/index",title:"Gaming",description:"Heroes of Newerth",source:"@site/docs/user/software/gaming/index.md",sourceDirName:"user/software/gaming",slug:"/user/software/gaming/",permalink:"/docs/user/software/gaming/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/gaming/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Gaming",summary:"Instructions for installing various gaming software on Solus"},sidebar:"userSidebar",previous:{title:"Web Development",permalink:"/docs/user/software/development/web"},next:{title:"Localization",permalink:"/docs/category/localization"}},o={},d=[{value:"Heroes of Newerth",id:"heroes-of-newerth",level:2},{value:"Lutris",id:"lutris",level:2},{value:"About",id:"about",level:3},{value:"Minecraft",id:"minecraft",level:2},{value:"Installation",id:"installation",level:3},{value:"Prism Launcher",id:"prism-launcher",level:3},{value:"RetroArch",id:"retroarch",level:2},{value:"Installing the assets",id:"installing-the-assets",level:3},{value:"Steam",id:"steam",level:2},{value:"NVIDIA",id:"nvidia",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"gaming",children:"Gaming"})}),"\n",(0,i.jsx)(n.h2,{id:"heroes-of-newerth",children:"Heroes of Newerth"}),"\n",(0,i.jsx)(n.p,{children:'First, install the latest version of HoN by downloading it and running "HoNClient.sh".'}),"\n",(0,i.jsx)(n.p,{children:"Assuming that you install to ~/HoN (default), you only need to run two commands:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it gconf libgcrypt11 libglu\n"})}),"\n",(0,i.jsx)(n.p,{children:"That installs all of the dependencies that HoN needs."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"rm ~/HoN/libs-x86_64/{libcurl.so.4,libfreetype.so.6,libgcc_s.so.1,libgcrypt.so.11,libspeexdsp.so.1,libspeex.so.1,libstdc++.so.6,libudev.so.0}\n"})}),"\n",(0,i.jsx)(n.p,{children:"This removes all the libraries that conflict with the ones in Solus."}),"\n",(0,i.jsx)(n.h2,{id:"lutris",children:"Lutris"}),"\n",(0,i.jsxs)(n.p,{children:["Lutris is currently available via the Solus repository, as the ",(0,i.jsx)(n.code,{children:"lutris"})," package."]}),"\n",(0,i.jsx)(n.h3,{id:"about",children:"About"}),"\n",(0,i.jsx)(n.p,{children:"Lutris is an open gaming platform for Linux. It helps you install and manage your games in a unified interface. Their goal is to support every game which runs on Linux, from native to Windows games (via Wine) to emulators and browser games. The desktop application and the website are libre software, contributions are welcome!"}),"\n",(0,i.jsxs)(n.p,{children:["For more information you can visit their website at ",(0,i.jsx)(n.a,{href:"https://lutris.net",children:"lutris.net"}),". You can also see their list of games ",(0,i.jsx)(n.a,{href:"https://lutris.net/games/",children:"here"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"minecraft",children:"Minecraft"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://www.minecraft.net",children:"Minecraft"}),' is a sandbox independent video game originally created by Swedish programmer Markus "Notch" Persson and later developed and published by the Swedish company Mojang.']}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Minecraft Screenshot",src:s(15528).Z+"",width:"1920",height:"1080"})}),"\n",(0,i.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(n.p,{children:"Install dependencies and download Minecraft:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it gconf binutils\nwget https://launcher.mojang.com/download/Minecraft.deb\n"})}),"\n",(0,i.jsx)(n.p,{children:"Extract files and remove old archive:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo ar xf Minecraft.deb\nsudo tar xf data.tar.xz -C /\nsudo rm control.tar.xz data.tar.xz debian-binary Minecraft.deb\n"})}),"\n",(0,i.jsx)(n.p,{children:"Integrate the installed files into your system:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo usysconf run -f\n"})}),"\n",(0,i.jsx)(n.h3,{id:"prism-launcher",children:"Prism Launcher"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://prismlauncher.org/",children:"Prism Launcher"})," is an Open Source Minecraft launcher with the ability to manage multiple instances, accounts and mods. Focused on user freedom and free redistributability."]}),"\n",(0,i.jsxs)(n.p,{children:["Prism Launcher is currently available via the Solus repository, as the ",(0,i.jsx)(n.code,{children:"prism-launcher"})," package."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"The official Minecraft launcher is not required to use Prism Launcher"})}),"\n",(0,i.jsx)(n.h2,{id:"retroarch",children:"RetroArch"}),"\n",(0,i.jsx)(n.p,{children:"RetroArch is a frontend for emulators, game engines and media players. It has all you need to run classic games through its polished graphical interface."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"RetroArch Screenshot",src:s(30963).Z+"",width:"960",height:"746"})}),"\n",(0,i.jsx)(n.h3,{id:"installing-the-assets",children:"Installing the assets"}),"\n",(0,i.jsx)(n.p,{children:'The assets are not packaged with RetroArch itself and have to be downloaded from inside the program. This can easily be done by going into the Online Updater from the Main Menu and selecting "Update Assets".'}),"\n",(0,i.jsx)(n.h2,{id:"steam",children:"Steam"}),"\n",(0,i.jsxs)(n.p,{children:["Steam is currently available via the Solus repository, as the ",(0,i.jsx)(n.code,{children:"steam"})," package."]}),"\n",(0,i.jsx)(n.h3,{id:"nvidia",children:"NVIDIA"}),"\n",(0,i.jsx)(n.p,{children:"For systems running NVIDIA graphics hardware, you will need to install the corresponding 32bit video driver for your card, listed below:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Current Gen: ",(0,i.jsx)(n.code,{children:"nvidia-glx-driver-32bit"})]}),"\n",(0,i.jsxs)(n.li,{children:["470 series: ",(0,i.jsx)(n.code,{children:"nvidia-470-glx-driver-32bit"})]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:'You can use our "Hardware Drivers" utility to find the right driver for your system.'})})]})}function h(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},15528:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/minecraft-7079f00591b397a6d96d8b3603f5d05f.jpg"},30963:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/retroarch-9d687fb4c01f4d4f393f10b277b10e9c.jpg"},11151:(e,n,s)=>{s.d(n,{Z:()=>l,a:()=>a});var i=s(67294);const r={},t=i.createContext(r);function a(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7626],{8110:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>l,toc:()=>d});var i=s(85893),r=s(11151);const t={title:"Gaming",summary:"Instructions for installing various gaming software on Solus"},a="Gaming",l={id:"user/software/gaming/index",title:"Gaming",description:"Heroes of Newerth",source:"@site/docs/user/software/gaming/index.md",sourceDirName:"user/software/gaming",slug:"/user/software/gaming/",permalink:"/docs/user/software/gaming/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/gaming/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Gaming",summary:"Instructions for installing various gaming software on Solus"},sidebar:"userSidebar",previous:{title:"Web Development",permalink:"/docs/user/software/development/web"},next:{title:"Localization",permalink:"/docs/category/localization"}},o={},d=[{value:"Heroes of Newerth",id:"heroes-of-newerth",level:2},{value:"Lutris",id:"lutris",level:2},{value:"About",id:"about",level:3},{value:"Minecraft",id:"minecraft",level:2},{value:"Installation",id:"installation",level:3},{value:"Prism Launcher",id:"prism-launcher",level:3},{value:"RetroArch",id:"retroarch",level:2},{value:"Installing the assets",id:"installing-the-assets",level:3},{value:"Steam",id:"steam",level:2},{value:"NVIDIA",id:"nvidia",level:3}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"gaming",children:"Gaming"})}),"\n",(0,i.jsx)(n.h2,{id:"heroes-of-newerth",children:"Heroes of Newerth"}),"\n",(0,i.jsx)(n.p,{children:'First, install the latest version of HoN by downloading it and running "HoNClient.sh".'}),"\n",(0,i.jsx)(n.p,{children:"Assuming that you install to ~/HoN (default), you only need to run two commands:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it gconf libgcrypt11 libglu\n"})}),"\n",(0,i.jsx)(n.p,{children:"That installs all of the dependencies that HoN needs."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"rm ~/HoN/libs-x86_64/{libcurl.so.4,libfreetype.so.6,libgcc_s.so.1,libgcrypt.so.11,libspeexdsp.so.1,libspeex.so.1,libstdc++.so.6,libudev.so.0}\n"})}),"\n",(0,i.jsx)(n.p,{children:"This removes all the libraries that conflict with the ones in Solus."}),"\n",(0,i.jsx)(n.h2,{id:"lutris",children:"Lutris"}),"\n",(0,i.jsxs)(n.p,{children:["Lutris is currently available via the Solus repository, as the ",(0,i.jsx)(n.code,{children:"lutris"})," package."]}),"\n",(0,i.jsx)(n.h3,{id:"about",children:"About"}),"\n",(0,i.jsx)(n.p,{children:"Lutris is an open gaming platform for Linux. It helps you install and manage your games in a unified interface. Their goal is to support every game which runs on Linux, from native to Windows games (via Wine) to emulators and browser games. The desktop application and the website are libre software, contributions are welcome!"}),"\n",(0,i.jsxs)(n.p,{children:["For more information you can visit their website at ",(0,i.jsx)(n.a,{href:"https://lutris.net",children:"lutris.net"}),". You can also see their list of games ",(0,i.jsx)(n.a,{href:"https://lutris.net/games/",children:"here"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"minecraft",children:"Minecraft"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://www.minecraft.net",children:"Minecraft"}),' is a sandbox independent video game originally created by Swedish programmer Markus "Notch" Persson and later developed and published by the Swedish company Mojang.']}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Minecraft Screenshot",src:s(15528).Z+"",width:"1920",height:"1080"})}),"\n",(0,i.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(n.p,{children:"Install dependencies and download Minecraft:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it gconf binutils\nwget https://launcher.mojang.com/download/Minecraft.deb\n"})}),"\n",(0,i.jsx)(n.p,{children:"Extract files and remove old archive:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo ar xf Minecraft.deb\nsudo tar xf data.tar.xz -C /\nsudo rm control.tar.xz data.tar.xz debian-binary Minecraft.deb\n"})}),"\n",(0,i.jsx)(n.p,{children:"Integrate the installed files into your system:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo usysconf run -f\n"})}),"\n",(0,i.jsx)(n.h3,{id:"prism-launcher",children:"Prism Launcher"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://prismlauncher.org/",children:"Prism Launcher"})," is an Open Source Minecraft launcher with the ability to manage multiple instances, accounts and mods. Focused on user freedom and free redistributability."]}),"\n",(0,i.jsxs)(n.p,{children:["Prism Launcher is currently available via the Solus repository, as the ",(0,i.jsx)(n.code,{children:"prism-launcher"})," package."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"The official Minecraft launcher is not required to use Prism Launcher"})}),"\n",(0,i.jsx)(n.h2,{id:"retroarch",children:"RetroArch"}),"\n",(0,i.jsx)(n.p,{children:"RetroArch is a frontend for emulators, game engines and media players. It has all you need to run classic games through its polished graphical interface."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"RetroArch Screenshot",src:s(30963).Z+"",width:"960",height:"746"})}),"\n",(0,i.jsx)(n.h3,{id:"installing-the-assets",children:"Installing the assets"}),"\n",(0,i.jsx)(n.p,{children:'The assets are not packaged with RetroArch itself and have to be downloaded from inside the program. This can easily be done by going into the Online Updater from the Main Menu and selecting "Update Assets".'}),"\n",(0,i.jsx)(n.h2,{id:"steam",children:"Steam"}),"\n",(0,i.jsxs)(n.p,{children:["Steam is currently available via the Solus repository, as the ",(0,i.jsx)(n.code,{children:"steam"})," package."]}),"\n",(0,i.jsx)(n.h3,{id:"nvidia",children:"NVIDIA"}),"\n",(0,i.jsx)(n.p,{children:"For systems running NVIDIA graphics hardware, you will need to install the corresponding 32bit video driver for your card, listed below:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Current Gen: ",(0,i.jsx)(n.code,{children:"nvidia-glx-driver-32bit"})]}),"\n",(0,i.jsxs)(n.li,{children:["470 series: ",(0,i.jsx)(n.code,{children:"nvidia-470-glx-driver-32bit"})]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:'You can use our "Hardware Drivers" utility to find the right driver for your system.'})})]})}function h(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},15528:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/minecraft-7079f00591b397a6d96d8b3603f5d05f.jpg"},30963:(e,n,s)=>{s.d(n,{Z:()=>i});const i=s.p+"assets/images/retroarch-9d687fb4c01f4d4f393f10b277b10e9c.jpg"},11151:(e,n,s)=>{s.d(n,{Z:()=>l,a:()=>a});var i=s(67294);const r={},t=i.createContext(r);function a(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/947d9ca4.55aa0c2e.js b/assets/js/947d9ca4.505bb376.js similarity index 99% rename from assets/js/947d9ca4.55aa0c2e.js rename to assets/js/947d9ca4.505bb376.js index 91fac09e9..ee3d88fce 100644 --- a/assets/js/947d9ca4.55aa0c2e.js +++ b/assets/js/947d9ca4.505bb376.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1944],{10025:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>d,toc:()=>r});var o=t(85893),i=t(11151);const s={title:"Web Development",summary:"Install and configure different web development tools on Solus."},l="Web Development",d={id:"user/software/development/web",title:"Web Development",description:"Solus provides multiple web servers for local testing of web applications.",source:"@site/docs/user/software/development/web.md",sourceDirName:"user/software/development",slug:"/user/software/development/web",permalink:"/docs/user/software/development/web",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/web.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Web Development",summary:"Install and configure different web development tools on Solus."},sidebar:"userSidebar",previous:{title:"Rust",permalink:"/docs/user/software/development/rust"},next:{title:"Gaming",permalink:"/docs/user/software/gaming/"}},a={},r=[{value:"Caddy",id:"caddy",level:2},{value:"Installation",id:"installation",level:3},{value:"Configuration",id:"configuration",level:3},{value:"Management",id:"management",level:4},{value:"httpd (Apache)",id:"httpd-apache",level:2},{value:"Installation",id:"installation-1",level:3},{value:"Usage",id:"usage",level:3},{value:"Configuration and DocumentRoot",id:"configuration-and-documentroot",level:4},{value:"Enabling PHP support",id:"enabling-php-support",level:4},{value:"Management",id:"management-1",level:4},{value:"nginx",id:"nginx",level:2},{value:"Installation",id:"installation-2",level:3},{value:"Usage",id:"usage-1",level:3},{value:"Configuration",id:"configuration-1",level:4},{value:"Management",id:"management-2",level:4}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"web-development",children:"Web Development"})}),"\n",(0,o.jsx)(n.h1,{id:"servers",children:"Servers"}),"\n",(0,o.jsx)(n.p,{children:"Solus provides multiple web servers for local testing of web applications."}),"\n",(0,o.jsx)(n.admonition,{title:"Important",type:"caution",children:(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Solus is not a server operating system"}),". Usage of server packages outside local testing is not recommended."]})}),"\n",(0,o.jsx)(n.h2,{id:"caddy",children:"Caddy"}),"\n",(0,o.jsx)(n.p,{children:"Caddy is installed with a default configuration that you can customize as needed."}),"\n",(0,o.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,o.jsxs)(n.p,{children:["To install ",(0,o.jsx)(n.code,{children:"caddy"}),", use the Software Center or execute the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install caddy\n"})}),"\n",(0,o.jsx)(n.h3,{id:"configuration",children:"Configuration"}),"\n",(0,o.jsxs)(n.p,{children:["You can configure Caddy using a ",(0,o.jsx)(n.em,{children:"Caddyfile"}),", a text file that contains configuration directives. The default Caddyfile is located at ",(0,o.jsx)(n.code,{children:"/usr/share/caddy/Caddyfile"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"To reload Caddy with a new configuration file, use the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"caddy reload --config /path/to/new/caddyfile\n"})}),"\n",(0,o.jsxs)(n.p,{children:["For more information, see the Caddy documentation at ",(0,o.jsx)(n.a,{href:"https://caddyserver.com/docs/",children:"https://caddyserver.com/docs/"}),"."]}),"\n",(0,o.jsx)(n.h4,{id:"management",children:"Management"}),"\n",(0,o.jsx)(n.p,{children:"You can use the following commands to manage Caddy:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Enable Caddy on startup and start immediately after enabling: ",(0,o.jsx)(n.code,{children:"sudo systemctl enable --now caddy"})]}),"\n",(0,o.jsxs)(n.li,{children:["Stop Caddy: ",(0,o.jsx)(n.code,{children:"sudo systemctl stop caddy"})]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"httpd-apache",children:"httpd (Apache)"}),"\n",(0,o.jsx)(n.p,{children:"httpd (Apache) is installed with a default configuration that you can customize as needed."}),"\n",(0,o.jsx)(n.h3,{id:"installation-1",children:"Installation"}),"\n",(0,o.jsxs)(n.p,{children:["To install ",(0,o.jsx)(n.code,{children:"httpd"}),", use the Software Center or execute the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install httpd\n"})}),"\n",(0,o.jsx)(n.h3,{id:"usage",children:"Usage"}),"\n",(0,o.jsx)(n.h4,{id:"configuration-and-documentroot",children:"Configuration and DocumentRoot"}),"\n",(0,o.jsxs)(n.p,{children:["The default configuration files for Apache are located in the ",(0,o.jsx)(n.code,{children:"/usr/share/defaults/httpd/"})," directory. To override the default configuration, create a new file with the ",(0,o.jsx)(n.code,{children:".conf"})," extension in the ",(0,o.jsx)(n.code,{children:"/etc/httpd/conf.d"})," directory."]}),"\n",(0,o.jsx)(n.admonition,{title:"Important",type:"caution",children:(0,o.jsxs)(n.p,{children:["If you modify the configuration files located in the ",(0,o.jsx)(n.code,{children:"/usr/share/defaults/httpd/"})," folder, your changes might be overwritten during a system update."]})}),"\n",(0,o.jsxs)(n.p,{children:["The document root is the directory where Apache serves files from. By default, the document root is ",(0,o.jsx)(n.code,{children:"/var/www/"}),"."]}),"\n",(0,o.jsx)(n.h4,{id:"enabling-php-support",children:"Enabling PHP support"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Install ",(0,o.jsx)(n.code,{children:"php"})," from the Software Center or execute the following command: ",(0,o.jsx)(n.code,{children:"sudo eopkg install php"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Create a new ",(0,o.jsx)(n.code,{children:"/etc/httpd/conf.d/php.conf"})," file with the following contents:"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'LoadModule proxy_module lib64/httpd/mod_proxy.so\nLoadModule proxy_fcgi_module lib64/httpd/mod_proxy_fcgi.so\n\nSetHandler "proxy:fcgi://127.0.0.1:9000"\n\n\nDirectoryIndex index.php index.html\n\n'})}),"\n",(0,o.jsxs)(n.ol,{start:"3",children:["\n",(0,o.jsxs)(n.li,{children:["Execute the following command: ",(0,o.jsx)(n.code,{children:"sudo systemctl restart httpd && sudo systemctl restart php-fpm"})]}),"\n"]}),"\n",(0,o.jsx)(n.h4,{id:"management-1",children:"Management"}),"\n",(0,o.jsx)(n.p,{children:"You can use the following commands to manage httpd:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Enable httpd on startup: ",(0,o.jsx)(n.code,{children:"sudo systemctl enable httpd"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Start the web server: ",(0,o.jsx)(n.code,{children:"sudo systemctl start httpd"})]}),"\n",(0,o.jsxs)(n.li,{children:["Stop the web server: ",(0,o.jsx)(n.code,{children:"sudo systemctl stop httpd"})]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"nginx",children:"nginx"}),"\n",(0,o.jsx)(n.p,{children:"nginx is installed with a default configuration that you can customize as needed."}),"\n",(0,o.jsx)(n.h3,{id:"installation-2",children:"Installation"}),"\n",(0,o.jsxs)(n.p,{children:["To install ",(0,o.jsx)(n.code,{children:"nginx"}),", use the Software Center or execute the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install nginx\n"})}),"\n",(0,o.jsx)(n.h3,{id:"usage-1",children:"Usage"}),"\n",(0,o.jsx)(n.h4,{id:"configuration-1",children:"Configuration"}),"\n",(0,o.jsxs)(n.p,{children:["Nginx's configuration files are located in the ",(0,o.jsx)(n.code,{children:"/usr/share/defaults/nginx/"})," directory. To override the default configuration, you can create configuration files in the ",(0,o.jsx)(n.code,{children:"/etc/nginx/conf.d/"})," or the ",(0,o.jsx)(n.code,{children:"/etc/nginx/sites-enabled"})," folders."]}),"\n",(0,o.jsx)(n.admonition,{type:"tip",children:(0,o.jsxs)(n.p,{children:["To revert back to the original settings, delete the ",(0,o.jsx)(n.code,{children:"/etc/nginx/"})," folder."]})}),"\n",(0,o.jsx)(n.h4,{id:"management-2",children:"Management"}),"\n",(0,o.jsx)(n.p,{children:"You can use the following commands to manage nginx:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Enable nginx on startup and start immediately after enabling: ",(0,o.jsx)(n.code,{children:"sudo systemctl enable --now nginx"})]}),"\n",(0,o.jsxs)(n.li,{children:["Stop nginx: ",(0,o.jsx)(n.code,{children:"sudo systemctl stop nginx"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>d,a:()=>l});var o=t(67294);const i={},s=o.createContext(i);function l(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1944],{10025:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>d,toc:()=>r});var o=t(85893),i=t(11151);const s={title:"Web Development",summary:"Install and configure different web development tools on Solus."},l="Web Development",d={id:"user/software/development/web",title:"Web Development",description:"Solus provides multiple web servers for local testing of web applications.",source:"@site/docs/user/software/development/web.md",sourceDirName:"user/software/development",slug:"/user/software/development/web",permalink:"/docs/user/software/development/web",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/web.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Web Development",summary:"Install and configure different web development tools on Solus."},sidebar:"userSidebar",previous:{title:"Rust",permalink:"/docs/user/software/development/rust"},next:{title:"Gaming",permalink:"/docs/user/software/gaming/"}},a={},r=[{value:"Caddy",id:"caddy",level:2},{value:"Installation",id:"installation",level:3},{value:"Configuration",id:"configuration",level:3},{value:"Management",id:"management",level:4},{value:"httpd (Apache)",id:"httpd-apache",level:2},{value:"Installation",id:"installation-1",level:3},{value:"Usage",id:"usage",level:3},{value:"Configuration and DocumentRoot",id:"configuration-and-documentroot",level:4},{value:"Enabling PHP support",id:"enabling-php-support",level:4},{value:"Management",id:"management-1",level:4},{value:"nginx",id:"nginx",level:2},{value:"Installation",id:"installation-2",level:3},{value:"Usage",id:"usage-1",level:3},{value:"Configuration",id:"configuration-1",level:4},{value:"Management",id:"management-2",level:4}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"web-development",children:"Web Development"})}),"\n",(0,o.jsx)(n.h1,{id:"servers",children:"Servers"}),"\n",(0,o.jsx)(n.p,{children:"Solus provides multiple web servers for local testing of web applications."}),"\n",(0,o.jsx)(n.admonition,{title:"Important",type:"caution",children:(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Solus is not a server operating system"}),". Usage of server packages outside local testing is not recommended."]})}),"\n",(0,o.jsx)(n.h2,{id:"caddy",children:"Caddy"}),"\n",(0,o.jsx)(n.p,{children:"Caddy is installed with a default configuration that you can customize as needed."}),"\n",(0,o.jsx)(n.h3,{id:"installation",children:"Installation"}),"\n",(0,o.jsxs)(n.p,{children:["To install ",(0,o.jsx)(n.code,{children:"caddy"}),", use the Software Center or execute the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install caddy\n"})}),"\n",(0,o.jsx)(n.h3,{id:"configuration",children:"Configuration"}),"\n",(0,o.jsxs)(n.p,{children:["You can configure Caddy using a ",(0,o.jsx)(n.em,{children:"Caddyfile"}),", a text file that contains configuration directives. The default Caddyfile is located at ",(0,o.jsx)(n.code,{children:"/usr/share/caddy/Caddyfile"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"To reload Caddy with a new configuration file, use the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"caddy reload --config /path/to/new/caddyfile\n"})}),"\n",(0,o.jsxs)(n.p,{children:["For more information, see the Caddy documentation at ",(0,o.jsx)(n.a,{href:"https://caddyserver.com/docs/",children:"https://caddyserver.com/docs/"}),"."]}),"\n",(0,o.jsx)(n.h4,{id:"management",children:"Management"}),"\n",(0,o.jsx)(n.p,{children:"You can use the following commands to manage Caddy:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Enable Caddy on startup and start immediately after enabling: ",(0,o.jsx)(n.code,{children:"sudo systemctl enable --now caddy"})]}),"\n",(0,o.jsxs)(n.li,{children:["Stop Caddy: ",(0,o.jsx)(n.code,{children:"sudo systemctl stop caddy"})]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"httpd-apache",children:"httpd (Apache)"}),"\n",(0,o.jsx)(n.p,{children:"httpd (Apache) is installed with a default configuration that you can customize as needed."}),"\n",(0,o.jsx)(n.h3,{id:"installation-1",children:"Installation"}),"\n",(0,o.jsxs)(n.p,{children:["To install ",(0,o.jsx)(n.code,{children:"httpd"}),", use the Software Center or execute the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install httpd\n"})}),"\n",(0,o.jsx)(n.h3,{id:"usage",children:"Usage"}),"\n",(0,o.jsx)(n.h4,{id:"configuration-and-documentroot",children:"Configuration and DocumentRoot"}),"\n",(0,o.jsxs)(n.p,{children:["The default configuration files for Apache are located in the ",(0,o.jsx)(n.code,{children:"/usr/share/defaults/httpd/"})," directory. To override the default configuration, create a new file with the ",(0,o.jsx)(n.code,{children:".conf"})," extension in the ",(0,o.jsx)(n.code,{children:"/etc/httpd/conf.d"})," directory."]}),"\n",(0,o.jsx)(n.admonition,{title:"Important",type:"caution",children:(0,o.jsxs)(n.p,{children:["If you modify the configuration files located in the ",(0,o.jsx)(n.code,{children:"/usr/share/defaults/httpd/"})," folder, your changes might be overwritten during a system update."]})}),"\n",(0,o.jsxs)(n.p,{children:["The document root is the directory where Apache serves files from. By default, the document root is ",(0,o.jsx)(n.code,{children:"/var/www/"}),"."]}),"\n",(0,o.jsx)(n.h4,{id:"enabling-php-support",children:"Enabling PHP support"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Install ",(0,o.jsx)(n.code,{children:"php"})," from the Software Center or execute the following command: ",(0,o.jsx)(n.code,{children:"sudo eopkg install php"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Create a new ",(0,o.jsx)(n.code,{children:"/etc/httpd/conf.d/php.conf"})," file with the following contents:"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'LoadModule proxy_module lib64/httpd/mod_proxy.so\nLoadModule proxy_fcgi_module lib64/httpd/mod_proxy_fcgi.so\n\nSetHandler "proxy:fcgi://127.0.0.1:9000"\n\n\nDirectoryIndex index.php index.html\n\n'})}),"\n",(0,o.jsxs)(n.ol,{start:"3",children:["\n",(0,o.jsxs)(n.li,{children:["Execute the following command: ",(0,o.jsx)(n.code,{children:"sudo systemctl restart httpd && sudo systemctl restart php-fpm"})]}),"\n"]}),"\n",(0,o.jsx)(n.h4,{id:"management-1",children:"Management"}),"\n",(0,o.jsx)(n.p,{children:"You can use the following commands to manage httpd:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Enable httpd on startup: ",(0,o.jsx)(n.code,{children:"sudo systemctl enable httpd"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Start the web server: ",(0,o.jsx)(n.code,{children:"sudo systemctl start httpd"})]}),"\n",(0,o.jsxs)(n.li,{children:["Stop the web server: ",(0,o.jsx)(n.code,{children:"sudo systemctl stop httpd"})]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"nginx",children:"nginx"}),"\n",(0,o.jsx)(n.p,{children:"nginx is installed with a default configuration that you can customize as needed."}),"\n",(0,o.jsx)(n.h3,{id:"installation-2",children:"Installation"}),"\n",(0,o.jsxs)(n.p,{children:["To install ",(0,o.jsx)(n.code,{children:"nginx"}),", use the Software Center or execute the following command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install nginx\n"})}),"\n",(0,o.jsx)(n.h3,{id:"usage-1",children:"Usage"}),"\n",(0,o.jsx)(n.h4,{id:"configuration-1",children:"Configuration"}),"\n",(0,o.jsxs)(n.p,{children:["Nginx's configuration files are located in the ",(0,o.jsx)(n.code,{children:"/usr/share/defaults/nginx/"})," directory. To override the default configuration, you can create configuration files in the ",(0,o.jsx)(n.code,{children:"/etc/nginx/conf.d/"})," or the ",(0,o.jsx)(n.code,{children:"/etc/nginx/sites-enabled"})," folders."]}),"\n",(0,o.jsx)(n.admonition,{type:"tip",children:(0,o.jsxs)(n.p,{children:["To revert back to the original settings, delete the ",(0,o.jsx)(n.code,{children:"/etc/nginx/"})," folder."]})}),"\n",(0,o.jsx)(n.h4,{id:"management-2",children:"Management"}),"\n",(0,o.jsx)(n.p,{children:"You can use the following commands to manage nginx:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Enable nginx on startup and start immediately after enabling: ",(0,o.jsx)(n.code,{children:"sudo systemctl enable --now nginx"})]}),"\n",(0,o.jsxs)(n.li,{children:["Stop nginx: ",(0,o.jsx)(n.code,{children:"sudo systemctl stop nginx"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>d,a:()=>l});var o=t(67294);const i={},s=o.createContext(i);function l(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9485dea6.0af7d56a.js b/assets/js/9485dea6.59d263e8.js similarity index 97% rename from assets/js/9485dea6.0af7d56a.js rename to assets/js/9485dea6.59d263e8.js index ca7120582..08bc9f4c3 100644 --- a/assets/js/9485dea6.0af7d56a.js +++ b/assets/js/9485dea6.59d263e8.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2358],{29421:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>t,metadata:()=>c,toc:()=>o});var l=n(85893),r=n(11151);const t={title:"WiFi",summary:null},s="WiFi",c={id:"user/hardware/compatibility/wifi",title:"WiFi",description:"The following wireless chipsets have been tested and/or suggested to function correctly by our users.",source:"@site/docs/user/hardware/compatibility/wifi.md",sourceDirName:"user/hardware/compatibility",slug:"/user/hardware/compatibility/wifi",permalink:"/docs/user/hardware/compatibility/wifi",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/compatibility/wifi.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"WiFi",summary:null},sidebar:"userSidebar",previous:{title:"Laptops",permalink:"/docs/user/hardware/compatibility/laptops"},next:{title:"Mobile",permalink:"/docs/category/mobile"}},d={},o=[{value:"Atheros",id:"atheros",level:2},{value:"Broadcom",id:"broadcom",level:2},{value:"Netgear",id:"netgear",level:2},{value:"Intel",id:"intel",level:2},{value:"Ralink",id:"ralink",level:2},{value:"Realtek",id:"realtek",level:2}];function a(e){const i={em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,r.a)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(i.header,{children:(0,l.jsx)(i.h1,{id:"wifi",children:"WiFi"})}),"\n",(0,l.jsx)(i.p,{children:"The following wireless chipsets have been tested and/or suggested to function correctly by our users."}),"\n",(0,l.jsxs)(i.p,{children:["This list should not suggest that ",(0,l.jsx)(i.em,{children:"only"}),"- such devices listed below are compatible with Solus, as there may be devices not listed below that are in fact compatible."]}),"\n",(0,l.jsx)(i.h2,{id:"atheros",children:"Atheros"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Atheros AR5B97"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR242x"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR542x"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR928X"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR8161"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR9285"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR9287"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR9462"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR9485"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR9485WB-EG"}),"\n",(0,l.jsx)(i.li,{children:"Atheros QCA9565 / AR9565"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"broadcom",children:"Broadcom"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Broadcom BCM4312"}),"\n",(0,l.jsx)(i.li,{children:"Broadcom BCM4313"}),"\n",(0,l.jsx)(i.li,{children:"Broadcom BCM4322"}),"\n",(0,l.jsx)(i.li,{children:"Broadcom BCM4324"}),"\n",(0,l.jsx)(i.li,{children:"Broadcom BCM4331"}),"\n",(0,l.jsx)(i.li,{children:"Broadcom BCM4365"}),"\n",(0,l.jsx)(i.li,{children:"Broadcom BCM57785"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"netgear",children:"Netgear"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Netgear WPN111"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"intel",children:"Intel"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Intel AC3160"}),"\n",(0,l.jsx)(i.li,{children:"Intel AC7265"}),"\n",(0,l.jsx)(i.li,{children:"Intel Centrino Advanced-N 6200"}),"\n",(0,l.jsx)(i.li,{children:"Intel Centrino Advanced-N 6205"}),"\n",(0,l.jsx)(i.li,{children:"Intel Centrino Advanced-N 6235"}),"\n",(0,l.jsx)(i.li,{children:"Intel Centrino Ultimate-N 6300"}),"\n",(0,l.jsx)(i.li,{children:"Intel Centrino Wireless-N 2230"}),"\n",(0,l.jsx)(i.li,{children:"Intel PRO/Wireless 3945ABG"}),"\n",(0,l.jsx)(i.li,{children:"Intel PRO/Wireless 4965 AG or AGN"}),"\n",(0,l.jsx)(i.li,{children:"Intel Ultimate N WiFi Link 5300"}),"\n",(0,l.jsx)(i.li,{children:"Intel WiFi Link 5100"}),"\n",(0,l.jsx)(i.li,{children:"Intel Wireless 8265 / 8275"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"ralink",children:"Ralink"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Ralink RT5390"}),"\n",(0,l.jsx)(i.li,{children:"Ralink RT3070"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"realtek",children:"Realtek"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Realtek RTL8101E/RTL8102E"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8111/8168B"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8169"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8179"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8187SE"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8188CE"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8188CUS"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8191SEvB"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8192ce"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8723BE"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8723DE"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8821CD"}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,r.a)(),...e.components};return i?(0,l.jsx)(i,{...e,children:(0,l.jsx)(a,{...e})}):a(e)}},11151:(e,i,n)=>{n.d(i,{Z:()=>c,a:()=>s});var l=n(67294);const r={},t=l.createContext(r);function s(e){const i=l.useContext(t);return l.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),l.createElement(t.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2358],{29421:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>t,metadata:()=>c,toc:()=>o});var l=n(85893),r=n(11151);const t={title:"WiFi",summary:null},s="WiFi",c={id:"user/hardware/compatibility/wifi",title:"WiFi",description:"The following wireless chipsets have been tested and/or suggested to function correctly by our users.",source:"@site/docs/user/hardware/compatibility/wifi.md",sourceDirName:"user/hardware/compatibility",slug:"/user/hardware/compatibility/wifi",permalink:"/docs/user/hardware/compatibility/wifi",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/compatibility/wifi.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"WiFi",summary:null},sidebar:"userSidebar",previous:{title:"Laptops",permalink:"/docs/user/hardware/compatibility/laptops"},next:{title:"Mobile",permalink:"/docs/category/mobile"}},d={},o=[{value:"Atheros",id:"atheros",level:2},{value:"Broadcom",id:"broadcom",level:2},{value:"Netgear",id:"netgear",level:2},{value:"Intel",id:"intel",level:2},{value:"Ralink",id:"ralink",level:2},{value:"Realtek",id:"realtek",level:2}];function a(e){const i={em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,r.a)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(i.header,{children:(0,l.jsx)(i.h1,{id:"wifi",children:"WiFi"})}),"\n",(0,l.jsx)(i.p,{children:"The following wireless chipsets have been tested and/or suggested to function correctly by our users."}),"\n",(0,l.jsxs)(i.p,{children:["This list should not suggest that ",(0,l.jsx)(i.em,{children:"only"}),"- such devices listed below are compatible with Solus, as there may be devices not listed below that are in fact compatible."]}),"\n",(0,l.jsx)(i.h2,{id:"atheros",children:"Atheros"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Atheros AR5B97"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR242x"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR542x"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR928X"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR8161"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR9285"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR9287"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR9462"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR9485"}),"\n",(0,l.jsx)(i.li,{children:"Atheros AR9485WB-EG"}),"\n",(0,l.jsx)(i.li,{children:"Atheros QCA9565 / AR9565"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"broadcom",children:"Broadcom"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Broadcom BCM4312"}),"\n",(0,l.jsx)(i.li,{children:"Broadcom BCM4313"}),"\n",(0,l.jsx)(i.li,{children:"Broadcom BCM4322"}),"\n",(0,l.jsx)(i.li,{children:"Broadcom BCM4324"}),"\n",(0,l.jsx)(i.li,{children:"Broadcom BCM4331"}),"\n",(0,l.jsx)(i.li,{children:"Broadcom BCM4365"}),"\n",(0,l.jsx)(i.li,{children:"Broadcom BCM57785"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"netgear",children:"Netgear"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Netgear WPN111"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"intel",children:"Intel"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Intel AC3160"}),"\n",(0,l.jsx)(i.li,{children:"Intel AC7265"}),"\n",(0,l.jsx)(i.li,{children:"Intel Centrino Advanced-N 6200"}),"\n",(0,l.jsx)(i.li,{children:"Intel Centrino Advanced-N 6205"}),"\n",(0,l.jsx)(i.li,{children:"Intel Centrino Advanced-N 6235"}),"\n",(0,l.jsx)(i.li,{children:"Intel Centrino Ultimate-N 6300"}),"\n",(0,l.jsx)(i.li,{children:"Intel Centrino Wireless-N 2230"}),"\n",(0,l.jsx)(i.li,{children:"Intel PRO/Wireless 3945ABG"}),"\n",(0,l.jsx)(i.li,{children:"Intel PRO/Wireless 4965 AG or AGN"}),"\n",(0,l.jsx)(i.li,{children:"Intel Ultimate N WiFi Link 5300"}),"\n",(0,l.jsx)(i.li,{children:"Intel WiFi Link 5100"}),"\n",(0,l.jsx)(i.li,{children:"Intel Wireless 8265 / 8275"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"ralink",children:"Ralink"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Ralink RT5390"}),"\n",(0,l.jsx)(i.li,{children:"Ralink RT3070"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"realtek",children:"Realtek"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Realtek RTL8101E/RTL8102E"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8111/8168B"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8169"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8179"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8187SE"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8188CE"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8188CUS"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8191SEvB"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8192ce"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8723BE"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8723DE"}),"\n",(0,l.jsx)(i.li,{children:"Realtek RTL8821CD"}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,r.a)(),...e.components};return i?(0,l.jsx)(i,{...e,children:(0,l.jsx)(a,{...e})}):a(e)}},11151:(e,i,n)=>{n.d(i,{Z:()=>c,a:()=>s});var l=n(67294);const r={},t=l.createContext(r);function s(e){const i=l.useContext(t);return l.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),l.createElement(t.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/96af6484.0f0acc9e.js b/assets/js/96af6484.f3226ae3.js similarity index 98% rename from assets/js/96af6484.0f0acc9e.js rename to assets/js/96af6484.f3226ae3.js index 013c1cf7f..307bc9c07 100644 --- a/assets/js/96af6484.0f0acc9e.js +++ b/assets/js/96af6484.f3226ae3.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6225],{53058:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var t=n(85893),s=n(11151);const r={title:"Mice and Touchpads",summary:"Guide to using and configuring input devices on Solus"},a="Mice and Touchpads",c={id:"user/hardware/peripherals/mice-and-touchpads",title:"Mice and Touchpads",description:"ASUS, Logitech, Roccat, SteelSeries",source:"@site/docs/user/hardware/peripherals/mice-and-touchpads.md",sourceDirName:"user/hardware/peripherals",slug:"/user/hardware/peripherals/mice-and-touchpads",permalink:"/docs/user/hardware/peripherals/mice-and-touchpads",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/peripherals/mice-and-touchpads.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Mice and Touchpads",summary:"Guide to using and configuring input devices on Solus"},sidebar:"userSidebar",previous:{title:"Peripherals",permalink:"/docs/category/peripherals"},next:{title:"MIDI Keyboards",permalink:"/docs/user/hardware/peripherals/midi-keyboard"}},o={},d=[{value:"ASUS, Logitech, Roccat, SteelSeries",id:"asus-logitech-roccat-steelseries",level:2},{value:"Razer",id:"razer",level:2},{value:"Synaptics",id:"synaptics",level:2},{value:"Setup",id:"setup",level:3},{value:"Revert configuration",id:"revert-configuration",level:3}];function l(e){const i={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"mice-and-touchpads",children:"Mice and Touchpads"})}),"\n",(0,t.jsx)(i.h2,{id:"asus-logitech-roccat-steelseries",children:"ASUS, Logitech, Roccat, SteelSeries"}),"\n",(0,t.jsxs)(i.p,{children:["TODO: Quick tutorial on installing ",(0,t.jsx)(i.code,{children:"piper"})," with a screenshot. And point them at the official documentation."]}),"\n",(0,t.jsx)(i.h2,{id:"razer",children:"Razer"}),"\n",(0,t.jsxs)(i.p,{children:["TODO: Quick tutorial on installing ",(0,t.jsx)(i.code,{children:"polychromatic"})," with a screenshot. And point them at the official documentation."]}),"\n",(0,t.jsx)(i.h2,{id:"synaptics",children:"Synaptics"}),"\n",(0,t.jsx)(i.p,{children:"These instructions describe how to use the the synaptics driver instead of the default libinput driver to manage your touchpad. You might try this if:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"libinput doesn't allow for two-finger scrolling"}),"\n",(0,t.jsx)(i.li,{children:"libinput doesn't supports edge scrolling or vice versa"}),"\n",(0,t.jsx)(i.li,{children:"You want to take advantage of the extended configurability of the synaptics driver"}),"\n"]}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.strong,{children:"NOTE:"})," The synaptics driver will only be used for your touchpad and libinput will be used for all other input devices."]}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.strong,{children:"NOTE:"})," That the synaptics driver is in maintenance mode and libinput is the preferred driver and also sees active development."]}),"\n",(0,t.jsx)(i.h3,{id:"setup",children:"Setup"}),"\n",(0,t.jsx)(i.p,{children:"To get started open up a terminal and install the synaptics driver."}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo eopkg it xorg-driver-input-synaptics\n"})}),"\n",(0,t.jsxs)(i.p,{children:["Then, copy the default synaptics config file to the ",(0,t.jsx)(i.code,{children:"/etc/"})," directory."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo cp /usr/share/X11/xorg.conf.d/50-synaptics.conf /etc/X11/xorg.conf.d/90-synaptics.conf\n"})}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.strong,{children:"NOTE:"})," The /etc/ directory has a higher priority over the default config location and will ensure the synaptics driver gets loaded first, additionally by copying to /etc/ first it will avoid a three-way merge issue if you wish the edit the config file directly."]}),"\n",(0,t.jsx)(i.p,{children:"Reboot your machine then verify the synaptics driver is in use:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"cat /var/log/Xorg.0.log | grep \"Using input driver 'synaptics' for\"\n"})}),"\n",(0,t.jsx)(i.p,{children:"If it returns a result, then success! The synaptics driver is in use instead of libinput for your Touchpad."}),"\n",(0,t.jsx)(i.h3,{id:"revert-configuration",children:"Revert configuration"}),"\n",(0,t.jsx)(i.p,{children:"If you wish to switch back to using libinput:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo rm /etc/X11/xorg.conf.d/90-synaptics.conf\nsudo eopkg rm xorg-driver-input-synaptics\n"})})]})}function h(e={}){const{wrapper:i}={...(0,s.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,i,n)=>{n.d(i,{Z:()=>c,a:()=>a});var t=n(67294);const s={},r=t.createContext(s);function a(e){const i=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),t.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6225],{53058:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>d});var t=n(85893),s=n(11151);const r={title:"Mice and Touchpads",summary:"Guide to using and configuring input devices on Solus"},a="Mice and Touchpads",c={id:"user/hardware/peripherals/mice-and-touchpads",title:"Mice and Touchpads",description:"ASUS, Logitech, Roccat, SteelSeries",source:"@site/docs/user/hardware/peripherals/mice-and-touchpads.md",sourceDirName:"user/hardware/peripherals",slug:"/user/hardware/peripherals/mice-and-touchpads",permalink:"/docs/user/hardware/peripherals/mice-and-touchpads",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/peripherals/mice-and-touchpads.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Mice and Touchpads",summary:"Guide to using and configuring input devices on Solus"},sidebar:"userSidebar",previous:{title:"Peripherals",permalink:"/docs/category/peripherals"},next:{title:"MIDI Keyboards",permalink:"/docs/user/hardware/peripherals/midi-keyboard"}},o={},d=[{value:"ASUS, Logitech, Roccat, SteelSeries",id:"asus-logitech-roccat-steelseries",level:2},{value:"Razer",id:"razer",level:2},{value:"Synaptics",id:"synaptics",level:2},{value:"Setup",id:"setup",level:3},{value:"Revert configuration",id:"revert-configuration",level:3}];function l(e){const i={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"mice-and-touchpads",children:"Mice and Touchpads"})}),"\n",(0,t.jsx)(i.h2,{id:"asus-logitech-roccat-steelseries",children:"ASUS, Logitech, Roccat, SteelSeries"}),"\n",(0,t.jsxs)(i.p,{children:["TODO: Quick tutorial on installing ",(0,t.jsx)(i.code,{children:"piper"})," with a screenshot. And point them at the official documentation."]}),"\n",(0,t.jsx)(i.h2,{id:"razer",children:"Razer"}),"\n",(0,t.jsxs)(i.p,{children:["TODO: Quick tutorial on installing ",(0,t.jsx)(i.code,{children:"polychromatic"})," with a screenshot. And point them at the official documentation."]}),"\n",(0,t.jsx)(i.h2,{id:"synaptics",children:"Synaptics"}),"\n",(0,t.jsx)(i.p,{children:"These instructions describe how to use the the synaptics driver instead of the default libinput driver to manage your touchpad. You might try this if:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsx)(i.li,{children:"libinput doesn't allow for two-finger scrolling"}),"\n",(0,t.jsx)(i.li,{children:"libinput doesn't supports edge scrolling or vice versa"}),"\n",(0,t.jsx)(i.li,{children:"You want to take advantage of the extended configurability of the synaptics driver"}),"\n"]}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.strong,{children:"NOTE:"})," The synaptics driver will only be used for your touchpad and libinput will be used for all other input devices."]}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.strong,{children:"NOTE:"})," That the synaptics driver is in maintenance mode and libinput is the preferred driver and also sees active development."]}),"\n",(0,t.jsx)(i.h3,{id:"setup",children:"Setup"}),"\n",(0,t.jsx)(i.p,{children:"To get started open up a terminal and install the synaptics driver."}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo eopkg it xorg-driver-input-synaptics\n"})}),"\n",(0,t.jsxs)(i.p,{children:["Then, copy the default synaptics config file to the ",(0,t.jsx)(i.code,{children:"/etc/"})," directory."]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo cp /usr/share/X11/xorg.conf.d/50-synaptics.conf /etc/X11/xorg.conf.d/90-synaptics.conf\n"})}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.strong,{children:"NOTE:"})," The /etc/ directory has a higher priority over the default config location and will ensure the synaptics driver gets loaded first, additionally by copying to /etc/ first it will avoid a three-way merge issue if you wish the edit the config file directly."]}),"\n",(0,t.jsx)(i.p,{children:"Reboot your machine then verify the synaptics driver is in use:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"cat /var/log/Xorg.0.log | grep \"Using input driver 'synaptics' for\"\n"})}),"\n",(0,t.jsx)(i.p,{children:"If it returns a result, then success! The synaptics driver is in use instead of libinput for your Touchpad."}),"\n",(0,t.jsx)(i.h3,{id:"revert-configuration",children:"Revert configuration"}),"\n",(0,t.jsx)(i.p,{children:"If you wish to switch back to using libinput:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"sudo rm /etc/X11/xorg.conf.d/90-synaptics.conf\nsudo eopkg rm xorg-driver-input-synaptics\n"})})]})}function h(e={}){const{wrapper:i}={...(0,s.a)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,i,n)=>{n.d(i,{Z:()=>c,a:()=>a});var t=n(67294);const s={},r=t.createContext(s);function a(e){const i=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),t.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/97c623e4.3b3f604c.js b/assets/js/97c623e4.6a7ed37a.js similarity index 98% rename from assets/js/97c623e4.3b3f604c.js rename to assets/js/97c623e4.6a7ed37a.js index 20cc0b3e4..cd909b9c6 100644 --- a/assets/js/97c623e4.3b3f604c.js +++ b/assets/js/97c623e4.6a7ed37a.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6427],{42268:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>c,contentTitle:()=>o,default:()=>l,frontMatter:()=>n,metadata:()=>i,toc:()=>p});var s=t(85893),r=t(11151);const n={title:"Requesting a Package Update",summary:"Boohoo, your favorite package is outdated!"},o="Requesting A Package Update",i={id:"packaging/procedures/request-a-package-update",title:"Requesting a Package Update",description:"Packages updates are typically provided by the community or dedicated package maintainers. If we are not shipping the latest stable release of a package, however, you can let us know.",source:"@site/docs/packaging/procedures/request-a-package-update.md",sourceDirName:"packaging/procedures",slug:"/packaging/procedures/request-a-package-update",permalink:"/docs/packaging/procedures/request-a-package-update",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/request-a-package-update.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Requesting a Package Update",summary:"Boohoo, your favorite package is outdated!"},sidebar:"packagingSidebar",previous:{title:"Release Processes",permalink:"/docs/packaging/procedures/release-processes"},next:{title:"Requesting a Package",permalink:"/docs/packaging/procedures/request-a-package"}},c={},p=[];function d(e){const a={a:"a",code:"code",h1:"h1",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(a.header,{children:(0,s.jsx)(a.h1,{id:"requesting-a-package-update",children:"Requesting A Package Update"})}),"\n",(0,s.jsx)(a.p,{children:"Packages updates are typically provided by the community or dedicated package maintainers. If we are not shipping the latest stable release of a package, however, you can let us know."}),"\n",(0,s.jsxs)(a.p,{children:[(0,s.jsxs)(a.strong,{children:["First, please ",(0,s.jsx)(a.a,{href:"https://github.com/getsolus/packages/issues?q=sort%3Aupdated-desc+is%3Aopen+label%3A%22Package%3A+Update+Request%22",children:"look to see if an update request has already been filed"})," for the software or library you require"]}),"."]}),"\n",(0,s.jsx)(a.p,{children:"If there isn't an existing request, you can use the link below to request a package update. Note that updates solely for a new version number, platform-specific updates (such as to macOS or Windows) which aren't relevant, or solely translation updates, are generally not accepted or not prioritized."}),"\n",(0,s.jsx)(a.p,{children:"You will be asked in the form to provide the following information:"}),"\n",(0,s.jsxs)(a.ul,{children:["\n",(0,s.jsxs)(a.li,{children:["Title: ",(0,s.jsx)(a.code,{children:"Update $packagename to $version"})," (Example: ",(0,s.jsx)(a.code,{children:"Update nano to 2.9.7"}),")"]}),"\n",(0,s.jsx)(a.li,{children:"Description: Explanation as to the value-add of updating this package."}),"\n",(0,s.jsxs)(a.li,{children:["Link to source tarball/zip file. Note: ",(0,s.jsx)(a.code,{children:"master.zip"})," files ",(0,s.jsx)(a.strong,{children:"are not permitted"}),'. We require versioned tarballs, for example: "1.2.3.tar.gz".']}),"\n"]}),"\n",(0,s.jsxs)(a.p,{children:["Please put this into a new ",(0,s.jsx)(a.a,{href:"https://github.com/getsolus/packages/issues/new?assignees=&labels=Package%3A+Update+Request&projects=&template=request-package-update.yml",children:"issue"}),"."]})]})}function l(e={}){const{wrapper:a}={...(0,r.a)(),...e.components};return a?(0,s.jsx)(a,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,a,t)=>{t.d(a,{Z:()=>i,a:()=>o});var s=t(67294);const r={},n=s.createContext(r);function o(e){const a=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function i(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(n.Provider,{value:a},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6427],{42268:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>c,contentTitle:()=>o,default:()=>l,frontMatter:()=>n,metadata:()=>i,toc:()=>p});var s=t(85893),r=t(11151);const n={title:"Requesting a Package Update",summary:"Boohoo, your favorite package is outdated!"},o="Requesting A Package Update",i={id:"packaging/procedures/request-a-package-update",title:"Requesting a Package Update",description:"Packages updates are typically provided by the community or dedicated package maintainers. If we are not shipping the latest stable release of a package, however, you can let us know.",source:"@site/docs/packaging/procedures/request-a-package-update.md",sourceDirName:"packaging/procedures",slug:"/packaging/procedures/request-a-package-update",permalink:"/docs/packaging/procedures/request-a-package-update",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/request-a-package-update.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Requesting a Package Update",summary:"Boohoo, your favorite package is outdated!"},sidebar:"packagingSidebar",previous:{title:"Release Processes",permalink:"/docs/packaging/procedures/release-processes"},next:{title:"Requesting a Package",permalink:"/docs/packaging/procedures/request-a-package"}},c={},p=[];function d(e){const a={a:"a",code:"code",h1:"h1",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(a.header,{children:(0,s.jsx)(a.h1,{id:"requesting-a-package-update",children:"Requesting A Package Update"})}),"\n",(0,s.jsx)(a.p,{children:"Packages updates are typically provided by the community or dedicated package maintainers. If we are not shipping the latest stable release of a package, however, you can let us know."}),"\n",(0,s.jsxs)(a.p,{children:[(0,s.jsxs)(a.strong,{children:["First, please ",(0,s.jsx)(a.a,{href:"https://github.com/getsolus/packages/issues?q=sort%3Aupdated-desc+is%3Aopen+label%3A%22Package%3A+Update+Request%22",children:"look to see if an update request has already been filed"})," for the software or library you require"]}),"."]}),"\n",(0,s.jsx)(a.p,{children:"If there isn't an existing request, you can use the link below to request a package update. Note that updates solely for a new version number, platform-specific updates (such as to macOS or Windows) which aren't relevant, or solely translation updates, are generally not accepted or not prioritized."}),"\n",(0,s.jsx)(a.p,{children:"You will be asked in the form to provide the following information:"}),"\n",(0,s.jsxs)(a.ul,{children:["\n",(0,s.jsxs)(a.li,{children:["Title: ",(0,s.jsx)(a.code,{children:"Update $packagename to $version"})," (Example: ",(0,s.jsx)(a.code,{children:"Update nano to 2.9.7"}),")"]}),"\n",(0,s.jsx)(a.li,{children:"Description: Explanation as to the value-add of updating this package."}),"\n",(0,s.jsxs)(a.li,{children:["Link to source tarball/zip file. Note: ",(0,s.jsx)(a.code,{children:"master.zip"})," files ",(0,s.jsx)(a.strong,{children:"are not permitted"}),'. We require versioned tarballs, for example: "1.2.3.tar.gz".']}),"\n"]}),"\n",(0,s.jsxs)(a.p,{children:["Please put this into a new ",(0,s.jsx)(a.a,{href:"https://github.com/getsolus/packages/issues/new?assignees=&labels=Package%3A+Update+Request&projects=&template=request-package-update.yml",children:"issue"}),"."]})]})}function l(e={}){const{wrapper:a}={...(0,r.a)(),...e.components};return a?(0,s.jsx)(a,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,a,t)=>{t.d(a,{Z:()=>i,a:()=>o});var s=t(67294);const r={},n=s.createContext(r);function o(e){const a=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function i(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(n.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/99bedda9.0b5c3ec1.js b/assets/js/99bedda9.6a2ba6cc.js similarity index 99% rename from assets/js/99bedda9.0b5c3ec1.js rename to assets/js/99bedda9.6a2ba6cc.js index 255ae0ff3..0594e0054 100644 --- a/assets/js/99bedda9.0b5c3ec1.js +++ b/assets/js/99bedda9.6a2ba6cc.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8639],{48345:(e,r,i)=>{i.r(r),i.d(r,{assets:()=>o,contentTitle:()=>d,default:()=>c,frontMatter:()=>t,metadata:()=>l,toc:()=>a});var s=i(85893),n=i(11151);const t={title:"Hardware",summary:"Guide to using additional hardware on Solus"},d="Hardware",l={id:"user/hardware/index",title:"Hardware",description:"Preinstalled drivers",source:"@site/docs/user/hardware/index.md",sourceDirName:"user/hardware",slug:"/user/hardware/",permalink:"/docs/user/hardware/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Hardware",summary:"Guide to using additional hardware on Solus"},sidebar:"userSidebar",previous:{title:"Tips and Tricks",permalink:"/docs/user/editions/xfce/tips-and-tricks"},next:{title:"Compatibility",permalink:"/docs/category/compatibility"}},o={},a=[{value:"Preinstalled drivers",id:"preinstalled-drivers",level:2},{value:"GPUs",id:"gpus",level:3},{value:"Proprietary drivers",id:"proprietary-drivers",level:2},{value:"Supported drivers",id:"supported-drivers",level:3}];function h(e){const r={h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(r.header,{children:(0,s.jsx)(r.h1,{id:"hardware",children:"Hardware"})}),"\n",(0,s.jsx)(r.h2,{id:"preinstalled-drivers",children:"Preinstalled drivers"}),"\n",(0,s.jsx)(r.p,{children:"The vast majority of hardware on Linux is supported by driver modules included with the Linux Kernel. This includes things like:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:"CPUs (AMD, Intel)"}),"\n",(0,s.jsx)(r.li,{children:"Networking"}),"\n",(0,s.jsx)(r.li,{children:"PCI and PCI Express"}),"\n",(0,s.jsx)(r.li,{children:"Storage"}),"\n",(0,s.jsx)(r.li,{children:"USB"}),"\n"]}),"\n",(0,s.jsx)(r.p,{children:"The purpose of this documentation is to help you find drivers for hardware that is not directly supported or requires additional configuration to be used on Solus."}),"\n",(0,s.jsx)(r.h3,{id:"gpus",children:"GPUs"}),"\n",(0,s.jsx)(r.p,{children:"The situations with GPU drivers on Linux is a little complicated. Each driver is actually broken up into multiple pieces:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Direct Rendering Manager (DRM)"}),"\nThis is the part of the driver provided by the Linux kernel and provides just enough functionality to allow other drivers to access the hardware and render to a connected display.\nLinux provides support for AMD, Intel, and NVIDIA GPUs in this basic capacity."]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"OpenGL driver"}),"\nThis part of the driver is needed for OpenGL applications. AMD and Intel are fully supported on Linux through Mesa, and do not need further drivers."]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Vulkan driver"}),"\nThis part of the driver is needed for Vulkan applications. AMD and Intel are fully supported on Linux through Mesa, and do not need further drivers."]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Xorg driver"}),"\nIn order to expose certain features to the Xorg Server, AMD and Intel have additional drivers which may be needed for things like variable refresh rate or multiple display support."]}),"\n"]}),"\n",(0,s.jsx)(r.p,{children:"Unfortunately for NVIDIA users, the situation gets a little complicated. Linux has two sets of drivers for NVIDIA GPUs:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Nouveau"}),"\nThis is the open-source driver for NVIDIA GPUs. It consists of a DRM driver provided by the Linux kernel, OpenGL drivers (nvc0, nv50) from Mesa, and an Xorg driver (xorg-driver-video-nouveau).\nDevice support for these drivers has historically lagged behind the NVIDIA proprietary drivers and likely will not support newer hardware and does not include Vulkan support.\nPerformance of this driver also typically lags behind the proprietary drivers."]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"NVIDIA proprietary drivers"}),"\nThis is the closed-source driver provided directly by NVIDIA. It consists of a DRM driver module for the kernel, OpenGL and Vulkan drivers for rendering, and additional drivers for extended features of the hardware.\nDevice support for these drivers is very good for newer hardware, but older devices will eventually become unsupported and require the Nouveau drivers instead.\nPerformance of this driver is typically the best available and is therefore highly desirable to gamers and content creators."]}),"\n"]}),"\n",(0,s.jsx)(r.h2,{id:"proprietary-drivers",children:"Proprietary drivers"}),"\n",(0,s.jsx)(r.p,{children:"Installing proprietary drivers may improve performance or certain features, however they are usually not necessary for normal daily usage. Solus provides a utility for installing drivers for detected hardware."}),"\n",(0,s.jsx)(r.p,{children:(0,s.jsx)(r.img,{alt:"DoFlicky Screenshot",src:i(42202).Z+"",width:"497",height:"321"})}),"\n",(0,s.jsx)(r.p,{children:"If there are proprietary drivers that can be installed, they will show up in the box below the description. You can click the item you wish to install and click Install. If you are installing NVIDIA drivers, you may find it to be desirable to install the 32-bit driver as well, in the event you wish to use Steam or Wine."}),"\n",(0,s.jsxs)(r.p,{children:[(0,s.jsx)(r.strong,{children:"Note:"})," A reboot will be required to use the newly installed driver."]}),"\n",(0,s.jsx)(r.h3,{id:"supported-drivers",children:"Supported drivers"}),"\n",(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Vendor"}),(0,s.jsx)(r.th,{children:"Drivers"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ASUS"}),(0,s.jsx)(r.td,{children:"piper"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Broadcom"}),(0,s.jsx)(r.td,{children:"broadcom-sta"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Logitech"}),(0,s.jsx)(r.td,{children:"piper"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"NVIDIA"}),(0,s.jsx)(r.td,{children:"470, main series"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Razer"}),(0,s.jsx)(r.td,{children:"openrazer"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Roccat"}),(0,s.jsx)(r.td,{children:"piper"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"SteelSeries"}),(0,s.jsx)(r.td,{children:"piper"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"VMware"}),(0,s.jsx)(r.td,{children:"open-vm-tools"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Xbox"}),(0,s.jsx)(r.td,{children:"xone"})]})]})]})]})}function c(e={}){const{wrapper:r}={...(0,n.a)(),...e.components};return r?(0,s.jsx)(r,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},42202:(e,r,i)=>{i.d(r,{Z:()=>s});const s=i.p+"assets/images/doflicky-574dff562b460c3839fb6d47c7fa2d25.jpg"},11151:(e,r,i)=>{i.d(r,{Z:()=>l,a:()=>d});var s=i(67294);const n={},t=s.createContext(n);function d(e){const r=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function l(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),s.createElement(t.Provider,{value:r},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8639],{48345:(e,r,i)=>{i.r(r),i.d(r,{assets:()=>o,contentTitle:()=>d,default:()=>c,frontMatter:()=>t,metadata:()=>l,toc:()=>a});var s=i(85893),n=i(11151);const t={title:"Hardware",summary:"Guide to using additional hardware on Solus"},d="Hardware",l={id:"user/hardware/index",title:"Hardware",description:"Preinstalled drivers",source:"@site/docs/user/hardware/index.md",sourceDirName:"user/hardware",slug:"/user/hardware/",permalink:"/docs/user/hardware/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Hardware",summary:"Guide to using additional hardware on Solus"},sidebar:"userSidebar",previous:{title:"Tips and Tricks",permalink:"/docs/user/editions/xfce/tips-and-tricks"},next:{title:"Compatibility",permalink:"/docs/category/compatibility"}},o={},a=[{value:"Preinstalled drivers",id:"preinstalled-drivers",level:2},{value:"GPUs",id:"gpus",level:3},{value:"Proprietary drivers",id:"proprietary-drivers",level:2},{value:"Supported drivers",id:"supported-drivers",level:3}];function h(e){const r={h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(r.header,{children:(0,s.jsx)(r.h1,{id:"hardware",children:"Hardware"})}),"\n",(0,s.jsx)(r.h2,{id:"preinstalled-drivers",children:"Preinstalled drivers"}),"\n",(0,s.jsx)(r.p,{children:"The vast majority of hardware on Linux is supported by driver modules included with the Linux Kernel. This includes things like:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:"CPUs (AMD, Intel)"}),"\n",(0,s.jsx)(r.li,{children:"Networking"}),"\n",(0,s.jsx)(r.li,{children:"PCI and PCI Express"}),"\n",(0,s.jsx)(r.li,{children:"Storage"}),"\n",(0,s.jsx)(r.li,{children:"USB"}),"\n"]}),"\n",(0,s.jsx)(r.p,{children:"The purpose of this documentation is to help you find drivers for hardware that is not directly supported or requires additional configuration to be used on Solus."}),"\n",(0,s.jsx)(r.h3,{id:"gpus",children:"GPUs"}),"\n",(0,s.jsx)(r.p,{children:"The situations with GPU drivers on Linux is a little complicated. Each driver is actually broken up into multiple pieces:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Direct Rendering Manager (DRM)"}),"\nThis is the part of the driver provided by the Linux kernel and provides just enough functionality to allow other drivers to access the hardware and render to a connected display.\nLinux provides support for AMD, Intel, and NVIDIA GPUs in this basic capacity."]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"OpenGL driver"}),"\nThis part of the driver is needed for OpenGL applications. AMD and Intel are fully supported on Linux through Mesa, and do not need further drivers."]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Vulkan driver"}),"\nThis part of the driver is needed for Vulkan applications. AMD and Intel are fully supported on Linux through Mesa, and do not need further drivers."]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Xorg driver"}),"\nIn order to expose certain features to the Xorg Server, AMD and Intel have additional drivers which may be needed for things like variable refresh rate or multiple display support."]}),"\n"]}),"\n",(0,s.jsx)(r.p,{children:"Unfortunately for NVIDIA users, the situation gets a little complicated. Linux has two sets of drivers for NVIDIA GPUs:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"Nouveau"}),"\nThis is the open-source driver for NVIDIA GPUs. It consists of a DRM driver provided by the Linux kernel, OpenGL drivers (nvc0, nv50) from Mesa, and an Xorg driver (xorg-driver-video-nouveau).\nDevice support for these drivers has historically lagged behind the NVIDIA proprietary drivers and likely will not support newer hardware and does not include Vulkan support.\nPerformance of this driver also typically lags behind the proprietary drivers."]}),"\n",(0,s.jsxs)(r.li,{children:[(0,s.jsx)(r.strong,{children:"NVIDIA proprietary drivers"}),"\nThis is the closed-source driver provided directly by NVIDIA. It consists of a DRM driver module for the kernel, OpenGL and Vulkan drivers for rendering, and additional drivers for extended features of the hardware.\nDevice support for these drivers is very good for newer hardware, but older devices will eventually become unsupported and require the Nouveau drivers instead.\nPerformance of this driver is typically the best available and is therefore highly desirable to gamers and content creators."]}),"\n"]}),"\n",(0,s.jsx)(r.h2,{id:"proprietary-drivers",children:"Proprietary drivers"}),"\n",(0,s.jsx)(r.p,{children:"Installing proprietary drivers may improve performance or certain features, however they are usually not necessary for normal daily usage. Solus provides a utility for installing drivers for detected hardware."}),"\n",(0,s.jsx)(r.p,{children:(0,s.jsx)(r.img,{alt:"DoFlicky Screenshot",src:i(42202).Z+"",width:"497",height:"321"})}),"\n",(0,s.jsx)(r.p,{children:"If there are proprietary drivers that can be installed, they will show up in the box below the description. You can click the item you wish to install and click Install. If you are installing NVIDIA drivers, you may find it to be desirable to install the 32-bit driver as well, in the event you wish to use Steam or Wine."}),"\n",(0,s.jsxs)(r.p,{children:[(0,s.jsx)(r.strong,{children:"Note:"})," A reboot will be required to use the newly installed driver."]}),"\n",(0,s.jsx)(r.h3,{id:"supported-drivers",children:"Supported drivers"}),"\n",(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Vendor"}),(0,s.jsx)(r.th,{children:"Drivers"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ASUS"}),(0,s.jsx)(r.td,{children:"piper"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Broadcom"}),(0,s.jsx)(r.td,{children:"broadcom-sta"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Logitech"}),(0,s.jsx)(r.td,{children:"piper"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"NVIDIA"}),(0,s.jsx)(r.td,{children:"470, main series"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Razer"}),(0,s.jsx)(r.td,{children:"openrazer"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Roccat"}),(0,s.jsx)(r.td,{children:"piper"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"SteelSeries"}),(0,s.jsx)(r.td,{children:"piper"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"VMware"}),(0,s.jsx)(r.td,{children:"open-vm-tools"})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"Xbox"}),(0,s.jsx)(r.td,{children:"xone"})]})]})]})]})}function c(e={}){const{wrapper:r}={...(0,n.a)(),...e.components};return r?(0,s.jsx)(r,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},42202:(e,r,i)=>{i.d(r,{Z:()=>s});const s=i.p+"assets/images/doflicky-574dff562b460c3839fb6d47c7fa2d25.jpg"},11151:(e,r,i)=>{i.d(r,{Z:()=>l,a:()=>d});var s=i(67294);const n={},t=s.createContext(n);function d(e){const r=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function l(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),s.createElement(t.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a05bfad9.81af100c.js b/assets/js/a05bfad9.2f3ed7e3.js similarity index 98% rename from assets/js/a05bfad9.81af100c.js rename to assets/js/a05bfad9.2f3ed7e3.js index 0a776ad93..3c185e181 100644 --- a/assets/js/a05bfad9.81af100c.js +++ b/assets/js/a05bfad9.2f3ed7e3.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[885],{12620:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var i=s(85893),n=s(11151);const r={title:"Tips and Tricks",summary:"Tips and Tricks for Budgie users"},d="Tips and Tricks",c={id:"user/editions/budgie/tips-and-tricks",title:"Tips and Tricks",description:"Budgie Shortcuts",source:"@site/docs/user/editions/budgie/tips-and-tricks.md",sourceDirName:"user/editions/budgie",slug:"/user/editions/budgie/tips-and-tricks",permalink:"/docs/user/editions/budgie/tips-and-tricks",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/budgie/tips-and-tricks.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Tips and Tricks",summary:"Tips and Tricks for Budgie users"},sidebar:"userSidebar",previous:{title:"Configuration",permalink:"/docs/user/editions/budgie/configuration"},next:{title:"GNOME",permalink:"/docs/user/editions/gnome/"}},o={},l=[{value:"Budgie Shortcuts",id:"budgie-shortcuts",level:2},{value:"Restoring Panel Defaults",id:"restoring-panel-defaults",level:2}];function a(e){const t={blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,i.jsx)(t.h2,{id:"budgie-shortcuts",children:"Budgie Shortcuts"}),"\n",(0,i.jsx)(t.p,{children:"Budgie provides multiple shortcuts to make navigating around Budgie faster and easier."}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Keyboard Shortcut"}),(0,i.jsx)(t.th,{children:"Action"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Alt + F2"}),(0,i.jsx)(t.td,{children:"Open Budgie Run dialog"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Alt + F4"}),(0,i.jsx)(t.td,{children:"Kill the active window on the desktop"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Alt + Tab"}),(0,i.jsx)(t.td,{children:"Open application switcher overlay"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Shift + Alt + Tab"}),(0,i.jsx)(t.td,{children:"Open application switcher, switch to previous applications"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsxs)(t.td,{children:["Super (",(0,i.jsx)(t.em,{children:"also Super + S"}),")"]}),(0,i.jsx)(t.td,{children:"Open Budgie Menu"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Super + A"}),(0,i.jsx)(t.td,{children:"Open Applets section of Raven"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Super + L"}),(0,i.jsx)(t.td,{children:"Lock the screen"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Super + N"}),(0,i.jsx)(t.td,{children:"Open Notifications section of Raven"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsxs)(t.td,{children:["Super + Space (",(0,i.jsx)(t.em,{children:"also Alt + Shift"}),")"]}),(0,i.jsx)(t.td,{children:"Switch keyboard layouts"})]})]})]}),"\n",(0,i.jsx)(t.h2,{id:"restoring-panel-defaults",children:"Restoring Panel Defaults"}),"\n",(0,i.jsx)(t.p,{children:"To restore Budgie's default panel settings, run the command below"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"budgie-panel --reset --replace &\n"})}),"\n",(0,i.jsx)(t.p,{children:"After this you can press CTRL + D to close the terminal without closing the Budgie Panel process."}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"TODO: There's got to be more that we can add here"}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>c,a:()=>d});var i=s(67294);const n={},r=i.createContext(n);function d(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[885],{12620:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var i=s(85893),n=s(11151);const r={title:"Tips and Tricks",summary:"Tips and Tricks for Budgie users"},d="Tips and Tricks",c={id:"user/editions/budgie/tips-and-tricks",title:"Tips and Tricks",description:"Budgie Shortcuts",source:"@site/docs/user/editions/budgie/tips-and-tricks.md",sourceDirName:"user/editions/budgie",slug:"/user/editions/budgie/tips-and-tricks",permalink:"/docs/user/editions/budgie/tips-and-tricks",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/budgie/tips-and-tricks.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Tips and Tricks",summary:"Tips and Tricks for Budgie users"},sidebar:"userSidebar",previous:{title:"Configuration",permalink:"/docs/user/editions/budgie/configuration"},next:{title:"GNOME",permalink:"/docs/user/editions/gnome/"}},o={},l=[{value:"Budgie Shortcuts",id:"budgie-shortcuts",level:2},{value:"Restoring Panel Defaults",id:"restoring-panel-defaults",level:2}];function a(e){const t={blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,i.jsx)(t.h2,{id:"budgie-shortcuts",children:"Budgie Shortcuts"}),"\n",(0,i.jsx)(t.p,{children:"Budgie provides multiple shortcuts to make navigating around Budgie faster and easier."}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Keyboard Shortcut"}),(0,i.jsx)(t.th,{children:"Action"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Alt + F2"}),(0,i.jsx)(t.td,{children:"Open Budgie Run dialog"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Alt + F4"}),(0,i.jsx)(t.td,{children:"Kill the active window on the desktop"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Alt + Tab"}),(0,i.jsx)(t.td,{children:"Open application switcher overlay"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Shift + Alt + Tab"}),(0,i.jsx)(t.td,{children:"Open application switcher, switch to previous applications"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsxs)(t.td,{children:["Super (",(0,i.jsx)(t.em,{children:"also Super + S"}),")"]}),(0,i.jsx)(t.td,{children:"Open Budgie Menu"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Super + A"}),(0,i.jsx)(t.td,{children:"Open Applets section of Raven"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Super + L"}),(0,i.jsx)(t.td,{children:"Lock the screen"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Super + N"}),(0,i.jsx)(t.td,{children:"Open Notifications section of Raven"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsxs)(t.td,{children:["Super + Space (",(0,i.jsx)(t.em,{children:"also Alt + Shift"}),")"]}),(0,i.jsx)(t.td,{children:"Switch keyboard layouts"})]})]})]}),"\n",(0,i.jsx)(t.h2,{id:"restoring-panel-defaults",children:"Restoring Panel Defaults"}),"\n",(0,i.jsx)(t.p,{children:"To restore Budgie's default panel settings, run the command below"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-bash",children:"budgie-panel --reset --replace &\n"})}),"\n",(0,i.jsx)(t.p,{children:"After this you can press CTRL + D to close the terminal without closing the Budgie Panel process."}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"TODO: There's got to be more that we can add here"}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>c,a:()=>d});var i=s(67294);const n={},r=i.createContext(n);function d(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a398ef57.5d991b89.js b/assets/js/a398ef57.9832f269.js similarity index 98% rename from assets/js/a398ef57.5d991b89.js rename to assets/js/a398ef57.9832f269.js index 79ea37cf4..3cce9b7bf 100644 --- a/assets/js/a398ef57.5d991b89.js +++ b/assets/js/a398ef57.9832f269.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2586],{45523:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var i=t(85893),r=t(11151);const s={title:"Apple",summary:"Quick guide to working with Apple devices on Solus"},o="Apple",a={id:"user/hardware/mobile/apple",title:"Apple",description:"Solus provides iOS support via libimobiledevice and libgpod.",source:"@site/docs/user/hardware/mobile/apple.md",sourceDirName:"user/hardware/mobile",slug:"/user/hardware/mobile/apple",permalink:"/docs/user/hardware/mobile/apple",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/mobile/apple.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Apple",summary:"Quick guide to working with Apple devices on Solus"},sidebar:"userSidebar",previous:{title:"Android",permalink:"/docs/user/hardware/mobile/android"},next:{title:"Peripherals",permalink:"/docs/category/peripherals"}},l={},c=[{value:"Installation",id:"installation",level:2},{value:"File management",id:"file-management",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"apple",children:"Apple"})}),"\n",(0,i.jsxs)(n.p,{children:["Solus provides iOS support via ",(0,i.jsx)(n.a,{href:"https://libimobiledevice.org/",children:"libimobiledevice"})," and ",(0,i.jsx)(n.a,{href:"https://github.com/fadingred/libgpod/",children:"libgpod"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Please note that the below mentioned installation instructions do not guarantee functional iOS features such as content synchronization (music) or file copying."}),"\n",(0,i.jsx)(n.p,{children:"This support can be exposed via your file manager (such as Nautilus) upon connecting your iOS device or music players such as Rhythmbox."}),"\n",(0,i.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsxs)(n.p,{children:["To ensure you have the required software for iOS support, install ",(0,i.jsx)(n.code,{children:"libideviceactivation"})," via the Software Center or terminal:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install libideviceactivation\n"})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"NOTE:"})," It is recommended that you reboot your system after this installation."]}),"\n",(0,i.jsx)(n.h2,{id:"file-management",children:"File management"}),"\n",(0,i.jsx)(n.p,{children:"TODO: Tutorial on file access and syncing"})]})}function p(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>o});var i=t(67294);const r={},s=i.createContext(r);function o(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2586],{45523:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var i=t(85893),r=t(11151);const s={title:"Apple",summary:"Quick guide to working with Apple devices on Solus"},o="Apple",a={id:"user/hardware/mobile/apple",title:"Apple",description:"Solus provides iOS support via libimobiledevice and libgpod.",source:"@site/docs/user/hardware/mobile/apple.md",sourceDirName:"user/hardware/mobile",slug:"/user/hardware/mobile/apple",permalink:"/docs/user/hardware/mobile/apple",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/mobile/apple.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Apple",summary:"Quick guide to working with Apple devices on Solus"},sidebar:"userSidebar",previous:{title:"Android",permalink:"/docs/user/hardware/mobile/android"},next:{title:"Peripherals",permalink:"/docs/category/peripherals"}},l={},c=[{value:"Installation",id:"installation",level:2},{value:"File management",id:"file-management",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"apple",children:"Apple"})}),"\n",(0,i.jsxs)(n.p,{children:["Solus provides iOS support via ",(0,i.jsx)(n.a,{href:"https://libimobiledevice.org/",children:"libimobiledevice"})," and ",(0,i.jsx)(n.a,{href:"https://github.com/fadingred/libgpod/",children:"libgpod"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Please note that the below mentioned installation instructions do not guarantee functional iOS features such as content synchronization (music) or file copying."}),"\n",(0,i.jsx)(n.p,{children:"This support can be exposed via your file manager (such as Nautilus) upon connecting your iOS device or music players such as Rhythmbox."}),"\n",(0,i.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsxs)(n.p,{children:["To ensure you have the required software for iOS support, install ",(0,i.jsx)(n.code,{children:"libideviceactivation"})," via the Software Center or terminal:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install libideviceactivation\n"})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"NOTE:"})," It is recommended that you reboot your system after this installation."]}),"\n",(0,i.jsx)(n.h2,{id:"file-management",children:"File management"}),"\n",(0,i.jsx)(n.p,{children:"TODO: Tutorial on file access and syncing"})]})}function p(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>o});var i=t(67294);const r={},s=i.createContext(r);function o(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a52026b8.40d64115.js b/assets/js/a52026b8.40d64115.js deleted file mode 100644 index 60b6798f0..000000000 --- a/assets/js/a52026b8.40d64115.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7862],{19253:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>r,contentTitle:()=>i,default:()=>g,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var l=t(85893),s=t(11151);const n={title:"Welcome to the Solus Devlog",description:"Welcome to the Solus Development Log.",slug:"welcome-solus-devlog-v1",authors:"joey",tags:["hello","devlog","firstpost","solus"],hide_table_of_contents:!1},i=void 0,a={permalink:"/blog/welcome-solus-devlog-v1",source:"@site/devlog/2024-01-13-welcome-devlog.md",title:"Welcome to the Solus Devlog",description:"Welcome to the Solus Development Log.",date:"2024-01-13T00:00:00.000Z",tags:[{inline:!0,label:"hello",permalink:"/blog/tags/hello"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"firstpost",permalink:"/blog/tags/firstpost"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:.9,hasTruncateMarker:!0,authors:[{name:"Joey Riches",title:"Solus Staff",page:{permalink:"/blog/authors/joey"},socials:{github:"https://github.com/joebonrichie"},imageURL:"https://avatars.githubusercontent.com/u/5338090?s=400&u=f77ed45c7e83814ce3e8bd199fc293bd5b53682b&v=4",key:"joey"}],frontMatter:{title:"Welcome to the Solus Devlog",description:"Welcome to the Solus Development Log.",slug:"welcome-solus-devlog-v1",authors:"joey",tags:["hello","devlog","firstpost","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"eopkg is dead, long live eopkg",permalink:"/blog/eopkg-is-dead-long-live-eopkg"}},r={authorsImageUrls:[void 0]},c=[];function u(e){const o={p:"p",...(0,s.a)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(o.p,{children:"Welcome to the Solus Development Log."}),"\n",(0,l.jsx)(o.p,{children:"The Solus Development Log will be used by Solus Staff and outside contributors to highlight wins and changes in Solus. Keep an eye on this space."})]})}function g(e={}){const{wrapper:o}={...(0,s.a)(),...e.components};return o?(0,l.jsx)(o,{...e,children:(0,l.jsx)(u,{...e})}):u(e)}},11151:(e,o,t)=>{t.d(o,{Z:()=>a,a:()=>i});var l=t(67294);const s={},n=l.createContext(s);function i(e){const o=l.useContext(n);return l.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),l.createElement(n.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a52026b8.d25a67cc.js b/assets/js/a52026b8.d25a67cc.js new file mode 100644 index 000000000..2211612bd --- /dev/null +++ b/assets/js/a52026b8.d25a67cc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7862],{19253:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>r,contentTitle:()=>i,default:()=>g,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var l=t(85893),s=t(11151);const n={title:"Welcome to the Solus Devlog",description:"Welcome to the Solus Development Log.",slug:"welcome-solus-devlog-v1",authors:"joey",tags:["hello","devlog","firstpost","solus"],hide_table_of_contents:!1},i=void 0,a={permalink:"/blog/welcome-solus-devlog-v1",source:"@site/devlog/2024-01-13-welcome-devlog.md",title:"Welcome to the Solus Devlog",description:"Welcome to the Solus Development Log.",date:"2024-01-13T00:00:00.000Z",tags:[{inline:!0,label:"hello",permalink:"/blog/tags/hello"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"firstpost",permalink:"/blog/tags/firstpost"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:.9,hasTruncateMarker:!0,authors:[{name:"Joey Riches",title:"Solus Staff",page:{permalink:"/blog/authors/joey"},socials:{github:"https://github.com/joebonrichie"},imageURL:"https://avatars.githubusercontent.com/u/5338090",key:"joey"}],frontMatter:{title:"Welcome to the Solus Devlog",description:"Welcome to the Solus Development Log.",slug:"welcome-solus-devlog-v1",authors:"joey",tags:["hello","devlog","firstpost","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"eopkg is dead, long live eopkg",permalink:"/blog/eopkg-is-dead-long-live-eopkg"}},r={authorsImageUrls:[void 0]},c=[];function u(e){const o={p:"p",...(0,s.a)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(o.p,{children:"Welcome to the Solus Development Log."}),"\n",(0,l.jsx)(o.p,{children:"The Solus Development Log will be used by Solus Staff and outside contributors to highlight wins and changes in Solus. Keep an eye on this space."})]})}function g(e={}){const{wrapper:o}={...(0,s.a)(),...e.components};return o?(0,l.jsx)(o,{...e,children:(0,l.jsx)(u,{...e})}):u(e)}},11151:(e,o,t)=>{t.d(o,{Z:()=>a,a:()=>i});var l=t(67294);const s={},n=l.createContext(s);function i(e){const o=l.useContext(n);return l.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),l.createElement(n.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a6c0fb2f.5ab50382.js b/assets/js/a6c0fb2f.5ab50382.js new file mode 100644 index 000000000..2042c3e85 --- /dev/null +++ b/assets/js/a6c0fb2f.5ab50382.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6335],{54501:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>l,toc:()=>h});var a=n(85893),o=n(11151);const s={title:"Clean, clean, clean!",slug:"clean-clean-clean",authors:"alfi",tags:["housekeeping","cleanup","devlog","solus"],hide_table_of_contents:!1},i=void 0,l={permalink:"/blog/clean-clean-clean",source:"@site/devlog/2024-11-21-clean-cleanl-clean.md",title:"Clean, clean, clean!",description:"Hello everyone! Alfi here, member of Solus Cleanup Crew. It's been more than a year since I started contributing to Solus and I want to talk about it. About what I did, what we did, what we accomplished so far, and what we want to do next.",date:"2024-11-21T00:00:00.000Z",tags:[{inline:!0,label:"housekeeping",permalink:"/blog/tags/housekeeping"},{inline:!0,label:"cleanup",permalink:"/blog/tags/cleanup"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:5.585,hasTruncateMarker:!0,authors:[{name:"Muhammad Alfi Syahrin",title:"Solus Staff",page:{permalink:"/blog/authors/alfi"},socials:{github:"https://github.com/malfisya"},imageURL:"https://avatars.githubusercontent.com/u/101771435",key:"alfi"}],frontMatter:{title:"Clean, clean, clean!",slug:"clean-clean-clean",authors:"alfi",tags:["housekeeping","cleanup","devlog","solus"],hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"Intro to Optimizing Packages on Solus",permalink:"/blog/solus-optimizing-packages"}},r={authorsImageUrls:[void 0]},h=[{value:"A bit of background",id:"a-bit-of-background",level:2},{value:"What is it?",id:"what-is-it",level:2},{value:"Why bother?",id:"why-bother",level:2},{value:"What we accomplished",id:"what-we-accomplished",level:2},{value:"What next?",id:"what-next",level:2},{value:"Want to help?",id:"want-to-help",level:2},{value:"Closing thoughts",id:"closing-thoughts",level:2}];function c(e){const t={a:"a",code:"code",em:"em",h2:"h2",li:"li",ol:"ol",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.p,{children:"Hello everyone! Alfi here, member of Solus Cleanup Crew. It's been more than a year since I started contributing to Solus and I want to talk about it. About what I did, what we did, what we accomplished so far, and what we want to do next."}),"\n",(0,a.jsx)(t.h2,{id:"a-bit-of-background",children:"A bit of background"}),"\n",(0,a.jsxs)(t.p,{children:["I started contributing in October 2023, when Solus participated in ",(0,a.jsx)(t.a,{href:"https://getsol.us/2023/10/01/solus-and-hacktoberfest-2023/",children:"Hacktoberfest"}),". Hacktoberfest is a month-long event that encourage people to contribute to open source project in exchange for some digital merchandise. Finally, an excuse to contribute to something I use every day. Although, as an accountant, all of this is new experience to me. It was confusing at first, but I persisted. Finally, I got the hang of it and I managed to submit around 100 pull request during the month of the event. I was very excited and motivated. During the month, a few people joined the event and contributed to Solus, but then November came and most of the contribution slowed down. I was the only one left that continued doing the beginner tasks, mostly adding homepage to packages."]}),"\n",(0,a.jsxs)(t.p,{children:["At the start of January 2024, Jakob Gezelius (",(0,a.jsx)(t.a,{href:"https://github.com/androidnisse",children:"androidnisse"}),') comes in and starts contributing to homepage task too. Worried that we would stepped on each other\'s feet, we started a private chat to organize the tasks between ourselves. Until May, the two of us had been chipping away at the homepage task which at this point left 650 packages without a homepage. Then we had more contributors joining. I decided to make a group chat to accommodate all the people joining. It was called "Solus Homepage Team" at the time. More contributors and staff members joined the room, then it was renamed as "Solus Cleanup Crew" and moved under the official Solus matrix space.']}),"\n",(0,a.jsx)(t.h2,{id:"what-is-it",children:"What is it?"}),"\n",(0,a.jsx)(t.p,{children:"Solus cleanup crew is a group of community contributors as as well staff members with the goal of bringing the Solus package repository up to current standard. It is a subset of the packaging room on our matrix channel. We organize the work on all the cleanup related tasks."}),"\n",(0,a.jsx)(t.h2,{id:"why-bother",children:"Why bother?"}),"\n",(0,a.jsx)(t.p,{children:"Solus has been updating their tooling and infrastructure since its resurrection. While most of the tooling changes can be accomplished by staff members alone, there are things that they cannot do. While many consider Solus repository as small, it still contains more than 6000 packages. Some packages have never even gotten an update since Solus was first created! We want to get rid of all its cruft before we can migrate to a better tooling. That's where the community contributor can come in and help."}),"\n",(0,a.jsx)(t.p,{children:"For me personally, it is a chance to learn something new and fill my time with more purpose. Sometimes, I feel like a slob scrolling through things, opening the same three apps over and over or sleeping midday. Technically speaking, doing packaging is still scrolling through things, still opening the same three apps over and over, and I still get my midday nap, but now it is with purpose. I love that what I do can be enjoyed by other people. It is mostly invisible and not even noticed by people, but the chance of it helping people gives me so much joy. Why bother? Because I love it."}),"\n",(0,a.jsx)(t.h2,{id:"what-we-accomplished",children:"What we accomplished"}),"\n",(0,a.jsx)(t.p,{children:"We create a few repository wide task that can done with little reading of our packaging guide. The keen-eyed of you may have already seen these tasks. It is always attached at the end of every Sync Updates since July. These are the tasks we did:"}),"\n",(0,a.jsxs)(t.table,{children:[(0,a.jsx)(t.thead,{children:(0,a.jsxs)(t.tr,{children:[(0,a.jsx)(t.th,{children:"No."}),(0,a.jsx)(t.th,{children:"Task"}),(0,a.jsx)(t.th,{children:"Date Started"}),(0,a.jsx)(t.th,{children:"Start count"}),(0,a.jsx)(t.th,{children:"Current count"})]})}),(0,a.jsxs)(t.tbody,{children:[(0,a.jsxs)(t.tr,{children:[(0,a.jsx)(t.td,{children:"1."}),(0,a.jsx)(t.td,{children:(0,a.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/411",children:"Adding homepage key to package.yml"})}),(0,a.jsx)(t.td,{children:"30-09-2023"}),(0,a.jsx)(t.td,{children:"2300"}),(0,a.jsx)(t.td,{children:"8"})]}),(0,a.jsxs)(t.tr,{children:[(0,a.jsx)(t.td,{children:"2."}),(0,a.jsx)(t.td,{children:(0,a.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/449",children:"Adding AppStream metainfo to all font packages"})}),(0,a.jsx)(t.td,{children:"06-10-2023"}),(0,a.jsx)(t.td,{children:"38"}),(0,a.jsx)(t.td,{children:"Done \ud83c\udf89"})]}),(0,a.jsxs)(t.tr,{children:[(0,a.jsx)(t.td,{children:"3."}),(0,a.jsx)(t.td,{children:(0,a.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/1389",children:"Adding AppStream metainfo to all graphical applications"})}),(0,a.jsx)(t.td,{children:"22-01-2024"}),(0,a.jsx)(t.td,{children:"316"}),(0,a.jsx)(t.td,{children:"198"})]}),(0,a.jsxs)(t.tr,{children:[(0,a.jsx)(t.td,{children:"4."}),(0,a.jsx)(t.td,{children:(0,a.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/3111",children:"Applying new cargo macros"})}),(0,a.jsx)(t.td,{children:"27-06-2024"}),(0,a.jsx)(t.td,{children:"37"}),(0,a.jsx)(t.td,{children:"Done \ud83c\udf89"})]}),(0,a.jsxs)(t.tr,{children:[(0,a.jsx)(t.td,{children:"5."}),(0,a.jsx)(t.td,{children:(0,a.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/4116",children:"Changing all packages with homepages pointing to wiki.gnome.org"})}),(0,a.jsx)(t.td,{children:"20-10-2024"}),(0,a.jsx)(t.td,{children:"87"}),(0,a.jsx)(t.td,{children:"62"})]}),(0,a.jsxs)(t.tr,{children:[(0,a.jsx)(t.td,{children:"6."}),(0,a.jsx)(t.td,{children:(0,a.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues/4121",children:"Adding monitoring.yml"})}),(0,a.jsx)(t.td,{children:"21-10-2024"}),(0,a.jsx)(t.td,{children:"3070"}),(0,a.jsx)(t.td,{children:"2937"})]}),(0,a.jsxs)(t.tr,{children:[(0,a.jsx)(t.td,{children:"7."}),(0,a.jsx)(t.td,{children:(0,a.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues?q=is%3Aopen+is%3Aissue+label%3A%22Packaging+Problem%22",children:"Tagging packages that do not build"})}),(0,a.jsx)(t.td,{children:"Ongoing"}),(0,a.jsx)(t.td,{children:"N/A"}),(0,a.jsx)(t.td,{children:"13"})]}),(0,a.jsxs)(t.tr,{children:[(0,a.jsx)(t.td,{children:"8."}),(0,a.jsx)(t.td,{children:(0,a.jsx)(t.a,{href:"https://github.com/getsolus/packages/issues?q=is%3Aopen+is%3Aissue+label%3A%22Package%3A+Removal+Request%22",children:"Tagging packages that should be deprecated"})}),(0,a.jsx)(t.td,{children:"Ongoing"}),(0,a.jsx)(t.td,{children:"N/A"}),(0,a.jsx)(t.td,{children:"25"})]})]})]}),"\n",(0,a.jsx)(t.p,{children:"As you can see from the table above, we just completed two tasks and we are close to completing homepage task. Packages that do not build also are also getting solved one by one. Right now, there are 12 people in Solus Cleanup Crew Matrix room, 6 of them are new contributors. We also create a new AppStream metainfo documentation, clean up our issue templates, implement a better tagging system for organizing issues and much more. Solus Cleanup Crew is also becoming a place where we can onboard new contributors and recruit new staff. I thought we accomplished a lot and I am happy with it."}),"\n",(0,a.jsx)(t.h2,{id:"what-next",children:"What next?"}),"\n",(0,a.jsxs)(t.p,{children:["We want to focus on adding appstream metainfo for remaining 200 packages, in line with the goal of 4.7 ISO. It will not be easy nor quick, but we will try our best. We want Solus users to have the best experience possible when we finally say goodbye to ",(0,a.jsx)(t.code,{children:"solus-sc"})," and switch to modern software center (Gnome Software and KDE Discover). We want you to be able to install all graphical application from software center and have all the relevant information (Legible screenshot, Hi-Res Icon, good description, etc)."]}),"\n",(0,a.jsxs)(t.p,{children:["We also want to add more ",(0,a.jsx)(t.a,{href:"https://help.getsol.us/docs/packaging/monitoring.yml",children:"monitoring.yml"})," files to packages, so we can utilize our proof-of-concept ",(0,a.jsx)(t.a,{href:"https://shared.getsol.us/justin/updates/",children:'"Package Update Monitor"'})," created by ",(0,a.jsx)(t.a,{href:"https://github.com/Justinzobel",children:"Justin Zobel"}),". I, myself and ",(0,a.jsx)(t.a,{href:"https://github.com/joebonrichie",children:"Joey Riches"}),' will explore the possibility of curating our own "Editor\'s Choice" and "Featured Apps" in Gnome Software, made possible by ',(0,a.jsx)(t.a,{href:"https://gitlab.gnome.org/GNOME/gnome-app-list",children:(0,a.jsx)(t.code,{children:"gnome-app-list"})}),". I think the road ahead is very exciting for us and hopefully for you too!"]}),"\n",(0,a.jsx)(t.h2,{id:"want-to-help",children:"Want to help?"}),"\n",(0,a.jsxs)(t.p,{children:["We are always eager for people to join and spend their time contributing to Solus. There are many ways you can ",(0,a.jsx)(t.a,{href:"https://help.getsol.us/docs/user/contributing/getting-involved",children:"contribute"}),", but for me it is packaging. For me, packaging can be relaxing, sometimes frustrating, but always gives me joy at the end. If you are interested to dip your toe on packaging and want to help us, here are the simple steps:"]}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsx)(t.li,{children:"Join the Solus Packaging Room on Matrix"}),"\n",(0,a.jsxs)(t.li,{children:["Read and practice our ",(0,a.jsx)(t.a,{href:"https://help.getsol.us/docs/packaging/",children:"packaging documentation"})]}),"\n",(0,a.jsx)(t.li,{children:"Submit your first Pull Request. We recommend doing the wiki gnome task or monitoring task"}),"\n",(0,a.jsx)(t.li,{children:"Follow along the review process until your PR gets merged"}),"\n",(0,a.jsx)(t.li,{children:"Continue on contributing and you might get invited to Solus Cleanup Crew"}),"\n"]}),"\n",(0,a.jsx)(t.h2,{id:"closing-thoughts",children:"Closing thoughts"}),"\n",(0,a.jsxs)(t.p,{children:["I want to thank all the contributors that made all of this possible. It was such a wonderful effort from everyone and we will strive to keep that up. Let me know if you are interested in a follow-up blog about the detail of doing packaging for Solus. ",(0,a.jsx)(t.em,{children:"Terima kasih dan sampai jumpa"}),"!"]})]})}function d(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>i});var a=n(67294);const o={},s=a.createContext(o);function i(e){const t=a.useContext(s);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),a.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a9e19215.cb4c5849.js b/assets/js/a9e19215.3b9c4111.js similarity index 98% rename from assets/js/a9e19215.cb4c5849.js rename to assets/js/a9e19215.3b9c4111.js index 046505a3b..0c458c9ea 100644 --- a/assets/js/a9e19215.cb4c5849.js +++ b/assets/js/a9e19215.3b9c4111.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[333],{71371:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var r=n(85893),o=n(11151);const s={title:"XRDP",summary:"User guide for XRDP on Solus"},i="XRDP",a={id:"user/software/networking/xrdp",title:"XRDP",description:"xrdp provides a graphical login to remote machines using Microsoft Remote Desktop Protocol (RDP). xrdp accepts connections from a variety of RDP clients: FreeRDP, rdesktop, NeutrinoRDP and Microsoft Remote Desktop Client (for Windows, Mac OS, iOS and Android).",source:"@site/docs/user/software/networking/xrdp.md",sourceDirName:"user/software/networking",slug:"/user/software/networking/xrdp",permalink:"/docs/user/software/networking/xrdp",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/networking/xrdp.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"XRDP",summary:"User guide for XRDP on Solus"},sidebar:"userSidebar",previous:{title:"Wireshark",permalink:"/docs/user/software/networking/wireshark"},next:{title:"Sound",permalink:"/docs/user/software/sound/"}},d={},l=[{value:"Installation",id:"installation",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Start / Stop xrdp",id:"start--stop-xrdp",level:2}];function c(e){const t={code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"xrdp",children:"XRDP"})}),"\n",(0,r.jsx)(t.p,{children:"xrdp provides a graphical login to remote machines using Microsoft Remote Desktop Protocol (RDP). xrdp accepts connections from a variety of RDP clients: FreeRDP, rdesktop, NeutrinoRDP and Microsoft Remote Desktop Client (for Windows, Mac OS, iOS and Android)."}),"\n",(0,r.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(t.p,{children:"Solus has an xrdp integration package for each Desktop Environment that will install the correct configuration for that DE. Install the respective package for your DE."}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"xrdp-budgie-integration"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"xrdp-gnome-integration"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"xrdp-mate-integration"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"xrdp-plasma-integration"})}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["This package will also install the ",(0,r.jsx)(t.code,{children:"xrdp"})," and ",(0,r.jsx)(t.code,{children:"xorgxrdp"})," packages."]}),"\n",(0,r.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(t.p,{children:"The following file needs to be created, if it doesn't already exist, with the following contents."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"cat /etc/X11/Xwrapper.config\n\nallowed_users=anybody\n"})}),"\n",(0,r.jsx)(t.h2,{id:"start--stop-xrdp",children:"Start / Stop xrdp"}),"\n",(0,r.jsx)(t.p,{children:"Please note that xrdp does NOT run on system boot by default. It needs to be manually started/configured to start automatically:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"# Start xrdp manually\nsudo systemctl start xrdp\n\n# Configure xrdp to start automatically on each boot and immediately start the service\nsudo systemctl enable --now xrdp\n\n# Check whether xrdp is running\nsudo systemctl status xrdp\n\n# Restart xrdp manually\nsudo systemctl restart xrdp\n\n# Stop xrdp manually\nsudo systemctl stop xrdp\n\n# Configure xrdp to not start automatically on each boot and immediately stop the service\nsudo systemctl disable --now xrdp\n"})})]})}function p(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>i});var r=n(67294);const o={},s=r.createContext(o);function i(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[333],{71371:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var r=n(85893),o=n(11151);const s={title:"XRDP",summary:"User guide for XRDP on Solus"},i="XRDP",a={id:"user/software/networking/xrdp",title:"XRDP",description:"xrdp provides a graphical login to remote machines using Microsoft Remote Desktop Protocol (RDP). xrdp accepts connections from a variety of RDP clients: FreeRDP, rdesktop, NeutrinoRDP and Microsoft Remote Desktop Client (for Windows, Mac OS, iOS and Android).",source:"@site/docs/user/software/networking/xrdp.md",sourceDirName:"user/software/networking",slug:"/user/software/networking/xrdp",permalink:"/docs/user/software/networking/xrdp",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/networking/xrdp.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"XRDP",summary:"User guide for XRDP on Solus"},sidebar:"userSidebar",previous:{title:"Wireshark",permalink:"/docs/user/software/networking/wireshark"},next:{title:"Sound",permalink:"/docs/user/software/sound/"}},d={},l=[{value:"Installation",id:"installation",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Start / Stop xrdp",id:"start--stop-xrdp",level:2}];function c(e){const t={code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"xrdp",children:"XRDP"})}),"\n",(0,r.jsx)(t.p,{children:"xrdp provides a graphical login to remote machines using Microsoft Remote Desktop Protocol (RDP). xrdp accepts connections from a variety of RDP clients: FreeRDP, rdesktop, NeutrinoRDP and Microsoft Remote Desktop Client (for Windows, Mac OS, iOS and Android)."}),"\n",(0,r.jsx)(t.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(t.p,{children:"Solus has an xrdp integration package for each Desktop Environment that will install the correct configuration for that DE. Install the respective package for your DE."}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"xrdp-budgie-integration"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"xrdp-gnome-integration"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"xrdp-mate-integration"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"xrdp-plasma-integration"})}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["This package will also install the ",(0,r.jsx)(t.code,{children:"xrdp"})," and ",(0,r.jsx)(t.code,{children:"xorgxrdp"})," packages."]}),"\n",(0,r.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(t.p,{children:"The following file needs to be created, if it doesn't already exist, with the following contents."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"cat /etc/X11/Xwrapper.config\n\nallowed_users=anybody\n"})}),"\n",(0,r.jsx)(t.h2,{id:"start--stop-xrdp",children:"Start / Stop xrdp"}),"\n",(0,r.jsx)(t.p,{children:"Please note that xrdp does NOT run on system boot by default. It needs to be manually started/configured to start automatically:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"# Start xrdp manually\nsudo systemctl start xrdp\n\n# Configure xrdp to start automatically on each boot and immediately start the service\nsudo systemctl enable --now xrdp\n\n# Check whether xrdp is running\nsudo systemctl status xrdp\n\n# Restart xrdp manually\nsudo systemctl restart xrdp\n\n# Stop xrdp manually\nsudo systemctl stop xrdp\n\n# Configure xrdp to not start automatically on each boot and immediately stop the service\nsudo systemctl disable --now xrdp\n"})})]})}function p(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>i});var r=n(67294);const o={},s=r.createContext(o);function i(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ab89b7a6.5e1cab36.js b/assets/js/ab89b7a6.d3839f29.js similarity index 97% rename from assets/js/ab89b7a6.5e1cab36.js rename to assets/js/ab89b7a6.d3839f29.js index 8a97cafd5..be71461a9 100644 --- a/assets/js/ab89b7a6.5e1cab36.js +++ b/assets/js/ab89b7a6.d3839f29.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[5575],{83016:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var s=n(85893),i=n(11151);const o={title:"XFCE",summary:"A quick introduction to the XFCE Edition of Solus"},r="XFCE Desktop",c={id:"user/editions/xfce/index",title:"XFCE",description:"XFCE is provided by the XFCE Edition of Solus. It is described as:",source:"@site/docs/user/editions/xfce/index.md",sourceDirName:"user/editions/xfce",slug:"/user/editions/xfce/",permalink:"/docs/user/editions/xfce/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/xfce/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"XFCE",summary:"A quick introduction to the XFCE Edition of Solus"},sidebar:"userSidebar",previous:{title:"Tips and Tricks",permalink:"/docs/user/editions/plasma/tips-and-tricks"},next:{title:"Configuration",permalink:"/docs/user/editions/xfce/configuration"}},d={},l=[];function a(e){const t={a:"a",blockquote:"blockquote",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"xfce-desktop",children:"XFCE Desktop"})}),"\n",(0,s.jsx)(t.p,{children:"XFCE is provided by the XFCE Edition of Solus. It is described as:"}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsx)(t.p,{children:"Xfce is a lightweight desktop environment for UNIX-like operating systems. It aims to be fast and low on system resources, while still being visually appealing and user friendly."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Here are some links related to this project that you may find helpful:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://xfce.org",children:"Homepage"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://blog.xfce.org",children:"Blog"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://gitlab.xfce.org",children:"Support"})}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.a,{href:"configuration",children:"Go to XFCE Configuration"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.a,{href:"tips-and-tricks",children:"Go to XFCE Tips and Tricks"})})]})}function u(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>r});var s=n(67294);const i={},o=s.createContext(i);function r(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[5575],{83016:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var s=n(85893),i=n(11151);const o={title:"XFCE",summary:"A quick introduction to the XFCE Edition of Solus"},r="XFCE Desktop",c={id:"user/editions/xfce/index",title:"XFCE",description:"XFCE is provided by the XFCE Edition of Solus. It is described as:",source:"@site/docs/user/editions/xfce/index.md",sourceDirName:"user/editions/xfce",slug:"/user/editions/xfce/",permalink:"/docs/user/editions/xfce/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/xfce/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"XFCE",summary:"A quick introduction to the XFCE Edition of Solus"},sidebar:"userSidebar",previous:{title:"Tips and Tricks",permalink:"/docs/user/editions/plasma/tips-and-tricks"},next:{title:"Configuration",permalink:"/docs/user/editions/xfce/configuration"}},d={},l=[];function a(e){const t={a:"a",blockquote:"blockquote",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"xfce-desktop",children:"XFCE Desktop"})}),"\n",(0,s.jsx)(t.p,{children:"XFCE is provided by the XFCE Edition of Solus. It is described as:"}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsx)(t.p,{children:"Xfce is a lightweight desktop environment for UNIX-like operating systems. It aims to be fast and low on system resources, while still being visually appealing and user friendly."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Here are some links related to this project that you may find helpful:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://xfce.org",children:"Homepage"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://blog.xfce.org",children:"Blog"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://gitlab.xfce.org",children:"Support"})}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.a,{href:"configuration",children:"Go to XFCE Configuration"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.a,{href:"tips-and-tricks",children:"Go to XFCE Tips and Tricks"})})]})}function u(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>c,a:()=>r});var s=n(67294);const i={},o=s.createContext(i);function r(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ad205e99.18961e3e.js b/assets/js/ad205e99.f433409d.js similarity index 99% rename from assets/js/ad205e99.18961e3e.js rename to assets/js/ad205e99.f433409d.js index e747ecc59..8c98fcf74 100644 --- a/assets/js/ad205e99.18961e3e.js +++ b/assets/js/ad205e99.f433409d.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1617],{38491:(e,a,s)=>{s.r(a),s.d(a,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>c,toc:()=>d});var n=s(85893),i=s(11151);const t={title:"Rebuilding a stack",summary:"Rebuilding a stack of package dependencies"},r="Rebuilding a stack",c={id:"packaging/stack-rebuilds",title:"Rebuilding a stack",description:"In packaging, a stack is a package and the packages that depend on it. Most commonly, this refers to libraries, such as the Poppler stack, but other software can be referred to a stack as well. One example is the GNOME stack, which includes the libraries and applications that are the core of the GNOME desktop environment. Packages that depend on another package are called that package's reverse dependencies. When updating a library, one has to be mindful of its reverse dependencies, and if they will need to be rebuilt after updating the library.",source:"@site/docs/packaging/stack-rebuilds.md",sourceDirName:"packaging",slug:"/packaging/stack-rebuilds",permalink:"/docs/packaging/stack-rebuilds",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/stack-rebuilds.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Rebuilding a stack",summary:"Rebuilding a stack of package dependencies"},sidebar:"packagingSidebar",previous:{title:"Requesting a Package",permalink:"/docs/packaging/procedures/request-a-package"},next:{title:"Translation instructions",permalink:"/docs/packaging/translation-instructions"}},l={},d=[{value:"Updating the library",id:"updating-the-library",level:2},{value:"What are symbols?",id:"what-are-symbols",level:2},{value:"Checking if rebuilds are necessary",id:"checking-if-rebuilds-are-necessary",level:2},{value:"Finding reverse dependencies",id:"finding-reverse-dependencies",level:2},{value:"Rebuild the stack",id:"rebuild-the-stack",level:2}];function o(e){const a={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.header,{children:(0,n.jsx)(a.h1,{id:"rebuilding-a-stack",children:"Rebuilding a stack"})}),"\n",(0,n.jsxs)(a.p,{children:["In packaging, a stack is a package and the packages that depend on it. Most commonly, this refers to libraries, such as the Poppler stack, but other software can be referred to a stack as well. One example is the GNOME stack, which includes the libraries and applications that are the core of the GNOME desktop environment. Packages that depend on another package are called that package's ",(0,n.jsx)(a.em,{children:"reverse dependencies"}),". When updating a library, one has to be mindful of its reverse dependencies, and if they will need to be rebuilt after updating the library."]}),"\n",(0,n.jsx)(a.admonition,{type:"note",children:(0,n.jsxs)(a.p,{children:["If you haven't already, you will need to ",(0,n.jsx)(a.a,{href:"/docs/packaging/advanced-config/local-repository",children:"set up a local repository"})," to do stack rebuilds."]})}),"\n",(0,n.jsx)(a.h2,{id:"updating-the-library",children:"Updating the library"}),"\n",(0,n.jsxs)(a.p,{children:["Go through the steps in ",(0,n.jsx)(a.a,{href:"/docs/packaging/updating-an-existing-package",children:"Updating an Existing Package"})," as normal, but instead of running ",(0,n.jsx)(a.code,{children:"go-task build"}),", run ",(0,n.jsx)(a.code,{children:"go-task build-localcp"}),". This will automatically copy the produced package files to your local repository for use in future builds."]}),"\n",(0,n.jsx)(a.h2,{id:"what-are-symbols",children:"What are symbols?"}),"\n",(0,n.jsxs)(a.p,{children:["Updating a library often means also building its reverse dependencies against the new version due to dynamic linking. Libraries are distributed as shared object, or ",(0,n.jsx)(a.code,{children:".so"}),", files, which contain the code symbols that other software can use. These files are usually versioned, such as ",(0,n.jsx)(a.code,{children:"libpoppler.so.140"}),'. This version is called the "so version". When a piece of software is built, it is ',(0,n.jsx)(a.em,{children:"linked"})," to the versioned libraries and code symbols that it uses."]}),"\n",(0,n.jsxs)(a.p,{children:["When the developers of a library release a new update, they may decide to bump the ",(0,n.jsx)(a.code,{children:".so"})," version, and code symbols are added and/or removed from the library. If this happens, but its reverse dependencies are not rebuilt after updating, they will try to use the old shared object file and symbols. Because they no longer exist, however, the program will crash when it tries to open them. Rebuilding the stack ensures that every piece of software is pointing to the correct version of its dependencies."]}),"\n",(0,n.jsx)(a.h2,{id:"checking-if-rebuilds-are-necessary",children:"Checking if rebuilds are necessary"}),"\n",(0,n.jsxs)(a.p,{children:["That's where the ",(0,n.jsx)(a.code,{children:"abi_*"})," files in the package repository come in. ",(0,n.jsx)(a.code,{children:"abi_libs"})," and ",(0,n.jsx)(a.code,{children:"abi_symbols"})," list the libraries and code symbols provided by a package, while ",(0,n.jsx)(a.code,{children:"abi_used_libs"})," and ",(0,n.jsx)(a.code,{children:"abi_used_symbols"})," list what libraries and symbols the package links to. After updating a package that has ",(0,n.jsx)(a.code,{children:"abi_libs"})," and ",(0,n.jsx)(a.code,{children:"abi_symbols"})," files, run ",(0,n.jsx)(a.code,{children:"git diff"})," on them and check for two things:"]}),"\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsxs)(a.li,{children:["Changes in the ",(0,n.jsx)(a.code,{children:".so"})," version"]}),"\n",(0,n.jsxs)(a.li,{children:["Removed lines in ",(0,n.jsx)(a.code,{children:"abi_symbols"})]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:"If either of these conditions are true, then all reverse dependencies of that package need to be rebuilt."}),"\n",(0,n.jsx)(a.admonition,{type:"note",children:(0,n.jsx)(a.p,{children:"Sometimes, packages in a stack are rebuilt even though the above conditions are not met. These are called Safety Rebuilds."})}),"\n",(0,n.jsx)(a.h2,{id:"finding-reverse-dependencies",children:"Finding reverse dependencies"}),"\n",(0,n.jsxs)(a.p,{children:["In most cases, all of the required rebuilds can be found by running ",(0,n.jsx)(a.code,{children:"eopkg info "})," and looking at the Reverse Dependencies line, thanks to our tooling's automatic dependency detection. This doesn't always work, though, such as with ",(0,n.jsx)(a.code,{children:"abseil-cpp"}),". In that case, you can use a tool like RipGrep to find all of the packages that link against the library you're updating, for example:"]}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{className:"language-bash",children:'# Run in the root of the Solus package repository on your system\nrg "absl" packages/*/*/abi_used_libs\n'})}),"\n",(0,n.jsx)(a.h2,{id:"rebuild-the-stack",children:"Rebuild the stack"}),"\n",(0,n.jsx)(a.p,{children:"For each package in the stack, follow this procedure:"}),"\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Bump the package"}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{className:"language-bash",children:"go-task bump\n"})}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Make sure there are no unwanted changes"}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{className:"language-bash",children:"git diff .\n"})}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Build the package using packages in your local repository"}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{className:"language-bash",children:"go-task build-local\n"})}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsxs)(a.p,{children:[(0,n.jsx)(a.a,{href:"/docs/packaging/updating-an-existing-package#commit-your-changes",children:"Commit your changes"}),". Use this format for your commit message:"]}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{className:"language-git",children:"package: Rebuild for other-package\n"})}),"\n",(0,n.jsx)(a.p,{children:"Do this in the same git branch as the library update."}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(a.p,{children:["Once all packages in the stack have been rebuilt, ",(0,n.jsx)(a.a,{href:"/docs/packaging/submitting-a-pull-request",children:"submit a pull request for review"}),". If changes are requested, see ",(0,n.jsx)(a.a,{href:"/docs/packaging/submitting-a-pull-request#amending-a-pull-request-with-multiple-commits",children:"this section"})," about amending a pull request with multiple commits."]})]})}function h(e={}){const{wrapper:a}={...(0,i.a)(),...e.components};return a?(0,n.jsx)(a,{...e,children:(0,n.jsx)(o,{...e})}):o(e)}},11151:(e,a,s)=>{s.d(a,{Z:()=>c,a:()=>r});var n=s(67294);const i={},t=n.createContext(i);function r(e){const a=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function c(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(t.Provider,{value:a},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1617],{38491:(e,a,s)=>{s.r(a),s.d(a,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>c,toc:()=>d});var n=s(85893),i=s(11151);const t={title:"Rebuilding a stack",summary:"Rebuilding a stack of package dependencies"},r="Rebuilding a stack",c={id:"packaging/stack-rebuilds",title:"Rebuilding a stack",description:"In packaging, a stack is a package and the packages that depend on it. Most commonly, this refers to libraries, such as the Poppler stack, but other software can be referred to a stack as well. One example is the GNOME stack, which includes the libraries and applications that are the core of the GNOME desktop environment. Packages that depend on another package are called that package's reverse dependencies. When updating a library, one has to be mindful of its reverse dependencies, and if they will need to be rebuilt after updating the library.",source:"@site/docs/packaging/stack-rebuilds.md",sourceDirName:"packaging",slug:"/packaging/stack-rebuilds",permalink:"/docs/packaging/stack-rebuilds",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/stack-rebuilds.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Rebuilding a stack",summary:"Rebuilding a stack of package dependencies"},sidebar:"packagingSidebar",previous:{title:"Requesting a Package",permalink:"/docs/packaging/procedures/request-a-package"},next:{title:"Translation instructions",permalink:"/docs/packaging/translation-instructions"}},l={},d=[{value:"Updating the library",id:"updating-the-library",level:2},{value:"What are symbols?",id:"what-are-symbols",level:2},{value:"Checking if rebuilds are necessary",id:"checking-if-rebuilds-are-necessary",level:2},{value:"Finding reverse dependencies",id:"finding-reverse-dependencies",level:2},{value:"Rebuild the stack",id:"rebuild-the-stack",level:2}];function o(e){const a={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.header,{children:(0,n.jsx)(a.h1,{id:"rebuilding-a-stack",children:"Rebuilding a stack"})}),"\n",(0,n.jsxs)(a.p,{children:["In packaging, a stack is a package and the packages that depend on it. Most commonly, this refers to libraries, such as the Poppler stack, but other software can be referred to a stack as well. One example is the GNOME stack, which includes the libraries and applications that are the core of the GNOME desktop environment. Packages that depend on another package are called that package's ",(0,n.jsx)(a.em,{children:"reverse dependencies"}),". When updating a library, one has to be mindful of its reverse dependencies, and if they will need to be rebuilt after updating the library."]}),"\n",(0,n.jsx)(a.admonition,{type:"note",children:(0,n.jsxs)(a.p,{children:["If you haven't already, you will need to ",(0,n.jsx)(a.a,{href:"/docs/packaging/advanced-config/local-repository",children:"set up a local repository"})," to do stack rebuilds."]})}),"\n",(0,n.jsx)(a.h2,{id:"updating-the-library",children:"Updating the library"}),"\n",(0,n.jsxs)(a.p,{children:["Go through the steps in ",(0,n.jsx)(a.a,{href:"/docs/packaging/updating-an-existing-package",children:"Updating an Existing Package"})," as normal, but instead of running ",(0,n.jsx)(a.code,{children:"go-task build"}),", run ",(0,n.jsx)(a.code,{children:"go-task build-localcp"}),". This will automatically copy the produced package files to your local repository for use in future builds."]}),"\n",(0,n.jsx)(a.h2,{id:"what-are-symbols",children:"What are symbols?"}),"\n",(0,n.jsxs)(a.p,{children:["Updating a library often means also building its reverse dependencies against the new version due to dynamic linking. Libraries are distributed as shared object, or ",(0,n.jsx)(a.code,{children:".so"}),", files, which contain the code symbols that other software can use. These files are usually versioned, such as ",(0,n.jsx)(a.code,{children:"libpoppler.so.140"}),'. This version is called the "so version". When a piece of software is built, it is ',(0,n.jsx)(a.em,{children:"linked"})," to the versioned libraries and code symbols that it uses."]}),"\n",(0,n.jsxs)(a.p,{children:["When the developers of a library release a new update, they may decide to bump the ",(0,n.jsx)(a.code,{children:".so"})," version, and code symbols are added and/or removed from the library. If this happens, but its reverse dependencies are not rebuilt after updating, they will try to use the old shared object file and symbols. Because they no longer exist, however, the program will crash when it tries to open them. Rebuilding the stack ensures that every piece of software is pointing to the correct version of its dependencies."]}),"\n",(0,n.jsx)(a.h2,{id:"checking-if-rebuilds-are-necessary",children:"Checking if rebuilds are necessary"}),"\n",(0,n.jsxs)(a.p,{children:["That's where the ",(0,n.jsx)(a.code,{children:"abi_*"})," files in the package repository come in. ",(0,n.jsx)(a.code,{children:"abi_libs"})," and ",(0,n.jsx)(a.code,{children:"abi_symbols"})," list the libraries and code symbols provided by a package, while ",(0,n.jsx)(a.code,{children:"abi_used_libs"})," and ",(0,n.jsx)(a.code,{children:"abi_used_symbols"})," list what libraries and symbols the package links to. After updating a package that has ",(0,n.jsx)(a.code,{children:"abi_libs"})," and ",(0,n.jsx)(a.code,{children:"abi_symbols"})," files, run ",(0,n.jsx)(a.code,{children:"git diff"})," on them and check for two things:"]}),"\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsxs)(a.li,{children:["Changes in the ",(0,n.jsx)(a.code,{children:".so"})," version"]}),"\n",(0,n.jsxs)(a.li,{children:["Removed lines in ",(0,n.jsx)(a.code,{children:"abi_symbols"})]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:"If either of these conditions are true, then all reverse dependencies of that package need to be rebuilt."}),"\n",(0,n.jsx)(a.admonition,{type:"note",children:(0,n.jsx)(a.p,{children:"Sometimes, packages in a stack are rebuilt even though the above conditions are not met. These are called Safety Rebuilds."})}),"\n",(0,n.jsx)(a.h2,{id:"finding-reverse-dependencies",children:"Finding reverse dependencies"}),"\n",(0,n.jsxs)(a.p,{children:["In most cases, all of the required rebuilds can be found by running ",(0,n.jsx)(a.code,{children:"eopkg info "})," and looking at the Reverse Dependencies line, thanks to our tooling's automatic dependency detection. This doesn't always work, though, such as with ",(0,n.jsx)(a.code,{children:"abseil-cpp"}),". In that case, you can use a tool like RipGrep to find all of the packages that link against the library you're updating, for example:"]}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{className:"language-bash",children:'# Run in the root of the Solus package repository on your system\nrg "absl" packages/*/*/abi_used_libs\n'})}),"\n",(0,n.jsx)(a.h2,{id:"rebuild-the-stack",children:"Rebuild the stack"}),"\n",(0,n.jsx)(a.p,{children:"For each package in the stack, follow this procedure:"}),"\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Bump the package"}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{className:"language-bash",children:"go-task bump\n"})}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Make sure there are no unwanted changes"}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{className:"language-bash",children:"git diff .\n"})}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Build the package using packages in your local repository"}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{className:"language-bash",children:"go-task build-local\n"})}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsxs)(a.p,{children:[(0,n.jsx)(a.a,{href:"/docs/packaging/updating-an-existing-package#commit-your-changes",children:"Commit your changes"}),". Use this format for your commit message:"]}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{className:"language-git",children:"package: Rebuild for other-package\n"})}),"\n",(0,n.jsx)(a.p,{children:"Do this in the same git branch as the library update."}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(a.p,{children:["Once all packages in the stack have been rebuilt, ",(0,n.jsx)(a.a,{href:"/docs/packaging/submitting-a-pull-request",children:"submit a pull request for review"}),". If changes are requested, see ",(0,n.jsx)(a.a,{href:"/docs/packaging/submitting-a-pull-request#amending-a-pull-request-with-multiple-commits",children:"this section"})," about amending a pull request with multiple commits."]})]})}function h(e={}){const{wrapper:a}={...(0,i.a)(),...e.components};return a?(0,n.jsx)(a,{...e,children:(0,n.jsx)(o,{...e})}):o(e)}},11151:(e,a,s)=>{s.d(a,{Z:()=>c,a:()=>r});var n=s(67294);const i={},t=n.createContext(i);function r(e){const a=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function c(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(t.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b4302412.74391d0c.js b/assets/js/b4302412.5cf034b0.js similarity index 94% rename from assets/js/b4302412.74391d0c.js rename to assets/js/b4302412.5cf034b0.js index ee7a27ad8..c470e9073 100644 --- a/assets/js/b4302412.74391d0c.js +++ b/assets/js/b4302412.5cf034b0.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2081],{55892:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>a});var n=s(85893),r=s(11151);const i={title:"Tips and Tricks",summary:"Useful tips and tricks for GNOME users"},o="Tips and Tricks",c={id:"user/editions/gnome/tips-and-tricks",title:"Tips and Tricks",description:"GNOME Keyboard Shortcuts",source:"@site/docs/user/editions/gnome/tips-and-tricks.md",sourceDirName:"user/editions/gnome",slug:"/user/editions/gnome/tips-and-tricks",permalink:"/docs/user/editions/gnome/tips-and-tricks",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/gnome/tips-and-tricks.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Tips and Tricks",summary:"Useful tips and tricks for GNOME users"},sidebar:"userSidebar",previous:{title:"Configuration",permalink:"/docs/user/editions/gnome/configuration"},next:{title:"MATE",permalink:"/docs/user/editions/mate/"}},d={},a=[{value:"GNOME Keyboard Shortcuts",id:"gnome-keyboard-shortcuts",level:2},{value:"GNOME Hot Corners",id:"gnome-hot-corners",level:2}];function u(e){const t={h1:"h1",h2:"h2",header:"header",p:"p",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,n.jsx)(t.h2,{id:"gnome-keyboard-shortcuts",children:"GNOME Keyboard Shortcuts"}),"\n",(0,n.jsx)(t.p,{children:"TODO: Provide a quick guide to these shortcuts like we did for Budgie"}),"\n",(0,n.jsx)(t.h2,{id:"gnome-hot-corners",children:"GNOME Hot Corners"}),"\n",(0,n.jsx)(t.p,{children:"TODO: Since Hot Corners aren't easily discoverable, maybe a quick intro to using them"}),"\n",(0,n.jsx)(t.p,{children:"TODO: I'm sure there are other things that GNOME users can point out"})]})}function l(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>c,a:()=>o});var n=s(67294);const r={},i=n.createContext(r);function o(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2081],{55892:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>c,toc:()=>a});var n=s(85893),r=s(11151);const i={title:"Tips and Tricks",summary:"Useful tips and tricks for GNOME users"},o="Tips and Tricks",c={id:"user/editions/gnome/tips-and-tricks",title:"Tips and Tricks",description:"GNOME Keyboard Shortcuts",source:"@site/docs/user/editions/gnome/tips-and-tricks.md",sourceDirName:"user/editions/gnome",slug:"/user/editions/gnome/tips-and-tricks",permalink:"/docs/user/editions/gnome/tips-and-tricks",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/gnome/tips-and-tricks.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Tips and Tricks",summary:"Useful tips and tricks for GNOME users"},sidebar:"userSidebar",previous:{title:"Configuration",permalink:"/docs/user/editions/gnome/configuration"},next:{title:"MATE",permalink:"/docs/user/editions/mate/"}},d={},a=[{value:"GNOME Keyboard Shortcuts",id:"gnome-keyboard-shortcuts",level:2},{value:"GNOME Hot Corners",id:"gnome-hot-corners",level:2}];function u(e){const t={h1:"h1",h2:"h2",header:"header",p:"p",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,n.jsx)(t.h2,{id:"gnome-keyboard-shortcuts",children:"GNOME Keyboard Shortcuts"}),"\n",(0,n.jsx)(t.p,{children:"TODO: Provide a quick guide to these shortcuts like we did for Budgie"}),"\n",(0,n.jsx)(t.h2,{id:"gnome-hot-corners",children:"GNOME Hot Corners"}),"\n",(0,n.jsx)(t.p,{children:"TODO: Since Hot Corners aren't easily discoverable, maybe a quick intro to using them"}),"\n",(0,n.jsx)(t.p,{children:"TODO: I'm sure there are other things that GNOME users can point out"})]})}function l(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>c,a:()=>o});var n=s(67294);const r={},i=n.createContext(r);function o(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/baa66232.edfec4ef.js b/assets/js/baa66232.1385fffd.js similarity index 98% rename from assets/js/baa66232.edfec4ef.js rename to assets/js/baa66232.1385fffd.js index e8e269117..29a043952 100644 --- a/assets/js/baa66232.edfec4ef.js +++ b/assets/js/baa66232.1385fffd.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[984],{17789:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>t,default:()=>u,frontMatter:()=>s,metadata:()=>i,toc:()=>c});var o=r(85893),a=r(11151);const s={title:"DroidCam",summary:"Quick Start guide to DroidCam on Solus"},t="DroidCam",i={id:"user/software/camera/droidcam",title:"DroidCam",description:"DroidCam turns your phone or tablet into a webcam for your computer. You can use it with video conferencing programs like Zoom, MS Teams, and Skype.",source:"@site/docs/user/software/camera/droidcam.md",sourceDirName:"user/software/camera",slug:"/user/software/camera/droidcam",permalink:"/docs/user/software/camera/droidcam",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/camera/droidcam.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"DroidCam",summary:"Quick Start guide to DroidCam on Solus"},sidebar:"userSidebar",previous:{title:"Camera",permalink:"/docs/category/camera"},next:{title:"Command Line",permalink:"/docs/user/software/command-line/"}},l={},c=[{value:"Before installation",id:"before-installation",level:2},{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"droidcam",children:"DroidCam"})}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://www.dev47apps.com/",children:"DroidCam"})," turns your phone or tablet into a webcam for your computer. You can use it with video conferencing programs like Zoom, MS Teams, and Skype."]}),"\n",(0,o.jsx)(n.h2,{id:"before-installation",children:"Before installation"}),"\n",(0,o.jsxs)(n.p,{children:["DroidCam relies on the v4l2loopback kernel module. So you need to install ",(0,o.jsx)(n.code,{children:"v4l2loopback"})," or ",(0,o.jsx)(n.code,{children:"v4l2loopback-current"})," depending of which kernel is installed on your computer. To find out which kernel is installed, run:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"uname -r\n"})}),"\n",(0,o.jsxs)(n.p,{children:["This should return a version which ends in ",(0,o.jsx)(n.code,{children:".current"})," or ",(0,o.jsx)(n.code,{children:".lts"}),"."]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:['If you are running the "current" kernel, install ',(0,o.jsx)(n.code,{children:"v4l2loopback-current"}),":"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install v4l2loopback-current\n"})}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:['If you are running the "lts" kernel, install ',(0,o.jsx)(n.code,{children:"v4l2loopback"}),":"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install v4l2loopback\n"})}),"\n",(0,o.jsx)(n.p,{children:"After the kernel module is installed, continue to installation steps."}),"\n",(0,o.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,o.jsx)(n.p,{children:"DroidCam can be installed from Software Center or via terminal :"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it droidcam\n"})}),"\n",(0,o.jsx)(n.p,{children:"Once DroidCam is installed, reboot your system. Now DroidCam is ready to use."}),"\n",(0,o.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,o.jsxs)(n.p,{children:["To start pairing your phone or tablet with your computer, you can follow steps provided by this ",(0,o.jsx)(n.a,{href:"https://www.dev47apps.com/droidcam/connect/",children:"guide"})," from the DroidCam developer."]})]})}function u(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},11151:(e,n,r)=>{r.d(n,{Z:()=>i,a:()=>t});var o=r(67294);const a={},s=o.createContext(a);function t(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:t(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[984],{17789:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>t,default:()=>u,frontMatter:()=>s,metadata:()=>i,toc:()=>c});var o=r(85893),a=r(11151);const s={title:"DroidCam",summary:"Quick Start guide to DroidCam on Solus"},t="DroidCam",i={id:"user/software/camera/droidcam",title:"DroidCam",description:"DroidCam turns your phone or tablet into a webcam for your computer. You can use it with video conferencing programs like Zoom, MS Teams, and Skype.",source:"@site/docs/user/software/camera/droidcam.md",sourceDirName:"user/software/camera",slug:"/user/software/camera/droidcam",permalink:"/docs/user/software/camera/droidcam",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/camera/droidcam.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"DroidCam",summary:"Quick Start guide to DroidCam on Solus"},sidebar:"userSidebar",previous:{title:"Camera",permalink:"/docs/category/camera"},next:{title:"Command Line",permalink:"/docs/user/software/command-line/"}},l={},c=[{value:"Before installation",id:"before-installation",level:2},{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"droidcam",children:"DroidCam"})}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://www.dev47apps.com/",children:"DroidCam"})," turns your phone or tablet into a webcam for your computer. You can use it with video conferencing programs like Zoom, MS Teams, and Skype."]}),"\n",(0,o.jsx)(n.h2,{id:"before-installation",children:"Before installation"}),"\n",(0,o.jsxs)(n.p,{children:["DroidCam relies on the v4l2loopback kernel module. So you need to install ",(0,o.jsx)(n.code,{children:"v4l2loopback"})," or ",(0,o.jsx)(n.code,{children:"v4l2loopback-current"})," depending of which kernel is installed on your computer. To find out which kernel is installed, run:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"uname -r\n"})}),"\n",(0,o.jsxs)(n.p,{children:["This should return a version which ends in ",(0,o.jsx)(n.code,{children:".current"})," or ",(0,o.jsx)(n.code,{children:".lts"}),"."]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:['If you are running the "current" kernel, install ',(0,o.jsx)(n.code,{children:"v4l2loopback-current"}),":"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install v4l2loopback-current\n"})}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:['If you are running the "lts" kernel, install ',(0,o.jsx)(n.code,{children:"v4l2loopback"}),":"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install v4l2loopback\n"})}),"\n",(0,o.jsx)(n.p,{children:"After the kernel module is installed, continue to installation steps."}),"\n",(0,o.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,o.jsx)(n.p,{children:"DroidCam can be installed from Software Center or via terminal :"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it droidcam\n"})}),"\n",(0,o.jsx)(n.p,{children:"Once DroidCam is installed, reboot your system. Now DroidCam is ready to use."}),"\n",(0,o.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,o.jsxs)(n.p,{children:["To start pairing your phone or tablet with your computer, you can follow steps provided by this ",(0,o.jsx)(n.a,{href:"https://www.dev47apps.com/droidcam/connect/",children:"guide"})," from the DroidCam developer."]})]})}function u(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},11151:(e,n,r)=>{r.d(n,{Z:()=>i,a:()=>t});var o=r(67294);const a={},s=o.createContext(a);function t(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:t(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/baf1b6e8.007ddec7.js b/assets/js/baf1b6e8.7ca3494f.js similarity index 97% rename from assets/js/baf1b6e8.007ddec7.js rename to assets/js/baf1b6e8.7ca3494f.js index 4253fe2a4..2ab39be1c 100644 --- a/assets/js/baf1b6e8.007ddec7.js +++ b/assets/js/baf1b6e8.7ca3494f.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9677],{14864:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>l});var s=t(85893),a=t(11151);const i={title:"Java",summary:"Learn how to install, run, and manage Java on Solus."},r="Java",o={id:"user/software/development/java",title:"Java",description:"Solus includes multiple LTS versions of Java in the repositories. You can install more than one version in your system at once.",source:"@site/docs/user/software/development/java.md",sourceDirName:"user/software/development",slug:"/user/software/development/java",permalink:"/docs/user/software/development/java",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/java.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Java",summary:"Learn how to install, run, and manage Java on Solus."},sidebar:"userSidebar",previous:{title:"Containers",permalink:"/docs/user/software/development/containers"},next:{title:"PostgreSQL",permalink:"/docs/user/software/development/postgresql"}},d={},l=[{value:"Running Java applications",id:"running-java-applications",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"java",children:"Java"})}),"\n",(0,s.jsx)(n.p,{children:"Solus includes multiple LTS versions of Java in the repositories. You can install more than one version in your system at once."}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["If you need to install different versions of Java, use alternative installation methods such as ",(0,s.jsx)(n.a,{href:"https://sdkman.io/",children:(0,s.jsx)(n.em,{children:"SDKMAN!"})}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["All Java packages in the Solus repositories include the ",(0,s.jsx)(n.em,{children:"Java Runtime Environment"})," (JRE) and the ",(0,s.jsx)(n.em,{children:"Java Development Kit"})," (JDK)."]}),"\n",(0,s.jsx)(n.p,{children:"The following table lists the versions of Java available in the Solus repositories."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Version"}),(0,s.jsx)(n.th,{children:"Package name"}),(0,s.jsx)(n.th,{children:"Installation directory"}),(0,s.jsx)(n.th,{children:"Included components"}),(0,s.jsx)(n.th,{children:"Notes"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Java 11"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"openjdk-11"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"/usr/lib64/openjdk-11"})}),(0,s.jsx)(n.td,{children:"JRE, JDK, OpenJFX"}),(0,s.jsx)(n.td,{})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Java 17"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"openjdk-17"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"/usr/lib64/openjdk-17"})}),(0,s.jsx)(n.td,{children:"JRE, JDK"}),(0,s.jsx)(n.td,{})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Java 21"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"openjdk-21"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"/usr/lib64/openjdk-21"})}),(0,s.jsx)(n.td,{children:"JRE, JDK"}),(0,s.jsx)(n.td,{})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"running-java-applications",children:"Running Java applications"}),"\n",(0,s.jsx)(n.admonition,{title:"Important",type:"caution",children:(0,s.jsxs)(n.p,{children:["Solus does not add Java to the ",(0,s.jsx)(n.code,{children:"PATH"})," environment variable by default."]})}),"\n",(0,s.jsx)(n.p,{children:"There are multiple ways to execute Java applications in Solus:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Create a .desktop file, then add ",(0,s.jsx)(n.code,{children:"env JAVA_HOME=/path/to/jdk/bin"})," to Exec."]}),"\n",(0,s.jsxs)(n.li,{children:["Create a script that sets ",(0,s.jsx)(n.code,{children:"JAVA_HOME"})," before running the application."]}),"\n",(0,s.jsxs)(n.li,{children:["Symlink the ",(0,s.jsx)(n.code,{children:"java"})," executable from ",(0,s.jsx)(n.code,{children:"/path/to/jdk/bin"})," to ",(0,s.jsx)(n.code,{children:"/usr/bin"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Add ",(0,s.jsx)(n.code,{children:"/path/to/jdk/bin"})," to your PATH environment variable."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>r});var s=t(67294);const a={},i=s.createContext(a);function r(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9677],{14864:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>l});var s=t(85893),a=t(11151);const i={title:"Java",summary:"Learn how to install, run, and manage Java on Solus."},r="Java",o={id:"user/software/development/java",title:"Java",description:"Solus includes multiple LTS versions of Java in the repositories. You can install more than one version in your system at once.",source:"@site/docs/user/software/development/java.md",sourceDirName:"user/software/development",slug:"/user/software/development/java",permalink:"/docs/user/software/development/java",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/java.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Java",summary:"Learn how to install, run, and manage Java on Solus."},sidebar:"userSidebar",previous:{title:"Containers",permalink:"/docs/user/software/development/containers"},next:{title:"PostgreSQL",permalink:"/docs/user/software/development/postgresql"}},d={},l=[{value:"Running Java applications",id:"running-java-applications",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"java",children:"Java"})}),"\n",(0,s.jsx)(n.p,{children:"Solus includes multiple LTS versions of Java in the repositories. You can install more than one version in your system at once."}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["If you need to install different versions of Java, use alternative installation methods such as ",(0,s.jsx)(n.a,{href:"https://sdkman.io/",children:(0,s.jsx)(n.em,{children:"SDKMAN!"})}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["All Java packages in the Solus repositories include the ",(0,s.jsx)(n.em,{children:"Java Runtime Environment"})," (JRE) and the ",(0,s.jsx)(n.em,{children:"Java Development Kit"})," (JDK)."]}),"\n",(0,s.jsx)(n.p,{children:"The following table lists the versions of Java available in the Solus repositories."}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Version"}),(0,s.jsx)(n.th,{children:"Package name"}),(0,s.jsx)(n.th,{children:"Installation directory"}),(0,s.jsx)(n.th,{children:"Included components"}),(0,s.jsx)(n.th,{children:"Notes"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Java 11"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"openjdk-11"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"/usr/lib64/openjdk-11"})}),(0,s.jsx)(n.td,{children:"JRE, JDK, OpenJFX"}),(0,s.jsx)(n.td,{})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Java 17"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"openjdk-17"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"/usr/lib64/openjdk-17"})}),(0,s.jsx)(n.td,{children:"JRE, JDK"}),(0,s.jsx)(n.td,{})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Java 21"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"openjdk-21"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"/usr/lib64/openjdk-21"})}),(0,s.jsx)(n.td,{children:"JRE, JDK"}),(0,s.jsx)(n.td,{})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"running-java-applications",children:"Running Java applications"}),"\n",(0,s.jsx)(n.admonition,{title:"Important",type:"caution",children:(0,s.jsxs)(n.p,{children:["Solus does not add Java to the ",(0,s.jsx)(n.code,{children:"PATH"})," environment variable by default."]})}),"\n",(0,s.jsx)(n.p,{children:"There are multiple ways to execute Java applications in Solus:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Create a .desktop file, then add ",(0,s.jsx)(n.code,{children:"env JAVA_HOME=/path/to/jdk/bin"})," to Exec."]}),"\n",(0,s.jsxs)(n.li,{children:["Create a script that sets ",(0,s.jsx)(n.code,{children:"JAVA_HOME"})," before running the application."]}),"\n",(0,s.jsxs)(n.li,{children:["Symlink the ",(0,s.jsx)(n.code,{children:"java"})," executable from ",(0,s.jsx)(n.code,{children:"/path/to/jdk/bin"})," to ",(0,s.jsx)(n.code,{children:"/usr/bin"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Add ",(0,s.jsx)(n.code,{children:"/path/to/jdk/bin"})," to your PATH environment variable."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>r});var s=t(67294);const a={},i=s.createContext(a);function r(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/be4ac66b.06e6569a.js b/assets/js/be4ac66b.ecca28df.js similarity index 99% rename from assets/js/be4ac66b.06e6569a.js rename to assets/js/be4ac66b.ecca28df.js index b31ec9976..e38643437 100644 --- a/assets/js/be4ac66b.06e6569a.js +++ b/assets/js/be4ac66b.ecca28df.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4869],{87190:(n,i,e)=>{e.r(i),e.d(i,{assets:()=>h,contentTitle:()=>d,default:()=>t,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var l=e(85893),s=e(11151);const r={title:"Laptops",summary:"List of known-working laptop hardware from various vendors"},d="Laptops",o={id:"user/hardware/compatibility/laptops",title:"Laptops",description:"The following laptops have been tested and/or suggested to function correctly by our users.",source:"@site/docs/user/hardware/compatibility/laptops.md",sourceDirName:"user/hardware/compatibility",slug:"/user/hardware/compatibility/laptops",permalink:"/docs/user/hardware/compatibility/laptops",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/compatibility/laptops.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Laptops",summary:"List of known-working laptop hardware from various vendors"},sidebar:"userSidebar",previous:{title:"Compatibility",permalink:"/docs/category/compatibility"},next:{title:"WiFi",permalink:"/docs/user/hardware/compatibility/wifi"}},h={},c=[{value:"Acer",id:"acer",level:2},{value:"Alienware",id:"alienware",level:2},{value:"Apple",id:"apple",level:2},{value:"ASUS",id:"asus",level:2},{value:"Dell",id:"dell",level:2},{value:"eMachines",id:"emachines",level:2},{value:"Fujitsu",id:"fujitsu",level:2},{value:"GIGABYTE",id:"gigabyte",level:2},{value:"Google",id:"google",level:2},{value:"HP",id:"hp",level:2},{value:"Lenovo",id:"lenovo",level:2},{value:"MSI",id:"msi",level:2},{value:"Samsung",id:"samsung",level:2},{value:"Schenker",id:"schenker",level:2},{value:"Sony",id:"sony",level:2},{value:"System76",id:"system76",level:2},{value:"Toshiba",id:"toshiba",level:2}];function a(n){const i={em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,s.a)(),...n.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(i.header,{children:(0,l.jsx)(i.h1,{id:"laptops",children:"Laptops"})}),"\n",(0,l.jsx)(i.p,{children:"The following laptops have been tested and/or suggested to function correctly by our users."}),"\n",(0,l.jsxs)(i.p,{children:["This list should not suggest that ",(0,l.jsx)(i.em,{children:"only"})," such devices listed below are compatible with Solus, as there may be devices not listed below that are in fact compatible."]}),"\n",(0,l.jsx)(i.h2,{id:"acer",children:"Acer"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Acer Aspire 1825PTZ"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire 4830T"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire 5750G"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire 7551"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire E5-473-370Z"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire E5-573G"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire E5-575G"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire ES 15 (ES1-572-5025)"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire ES 17 (ES1-731G-P1MC)"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire V3-112P"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire V3-571G"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire V5-121"}),"\n",(0,l.jsx)(i.li,{children:"Acer C710 Chromebook"}),"\n",(0,l.jsx)(i.li,{children:"Acer C720-2848 Chromebook"}),"\n",(0,l.jsx)(i.li,{children:"Acer TravelMate X349-G2-M"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"alienware",children:"Alienware"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Alienware 14"}),"\n",(0,l.jsx)(i.li,{children:"Alienware 17 R3"}),"\n",(0,l.jsx)(i.li,{children:"Alienware 17 R4"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"apple",children:"Apple"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Apple Macbook (late 2008)"}),"\n",(0,l.jsx)(i.li,{children:"Apple MacBookPro8,3"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"asus",children:"ASUS"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Asus EEE-PC 1001PX"}),"\n",(0,l.jsx)(i.li,{children:"Asus EEE-PC 1011PX"}),"\n",(0,l.jsx)(i.li,{children:"Asus K401UQK"}),"\n",(0,l.jsx)(i.li,{children:"Asus K53U"}),"\n",(0,l.jsx)(i.li,{children:"Asus K55VM"}),"\n",(0,l.jsx)(i.li,{children:"Asus K401UQK"}),"\n",(0,l.jsx)(i.li,{children:"Asus M50VM"}),"\n",(0,l.jsx)(i.li,{children:"Asus N501JW"}),"\n",(0,l.jsx)(i.li,{children:"Asus Pro50SR"}),"\n",(0,l.jsx)(i.li,{children:"Asus ROG G750JZA"}),"\n",(0,l.jsxs)(i.li,{children:["Asus VivoBook 15 K505ZA","\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Must use BIOS revision 306 for functional touchpad."}),"\n"]}),"\n"]}),"\n",(0,l.jsxs)(i.li,{children:["Asus VivoBook 15 X505ZA","\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Must use BIOS revision 306 for functional touchpad."}),"\n"]}),"\n"]}),"\n",(0,l.jsxs)(i.li,{children:["Asus VivoBook 15 X505ZA-BQ171T","\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Must use BIOS revision 306 for functional touchpad."}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(i.li,{children:"Asus VivoBook Pro N61JA"}),"\n",(0,l.jsx)(i.li,{children:"Asus VivoBook Pro N61Jv"}),"\n",(0,l.jsx)(i.li,{children:"Asus X200MA"}),"\n",(0,l.jsx)(i.li,{children:"Asus X201EV"}),"\n",(0,l.jsx)(i.li,{children:"Asus X540L"}),"\n",(0,l.jsx)(i.li,{children:"Asus X55"}),"\n",(0,l.jsx)(i.li,{children:"Asus X550LD"}),"\n",(0,l.jsx)(i.li,{children:"Asus X551CAP"}),"\n",(0,l.jsx)(i.li,{children:"Asus ZenBook UX31A"}),"\n",(0,l.jsx)(i.li,{children:"Asus ZenBook UX305FA"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"dell",children:"Dell"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 14 3442"}),"\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 14 3452"}),"\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 15 7579"}),"\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 15R N5010"}),"\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 15R N5110"}),"\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 1110"}),"\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 5050"}),"\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 7548"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude D830"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E4310"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E5440"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E5510"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E6230"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E6320"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E6410"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E6420"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E6430"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E6530"}),"\n",(0,l.jsx)(i.li,{children:"Dell Precision 7520"}),"\n",(0,l.jsx)(i.li,{children:"Dell Precision M6500"}),"\n",(0,l.jsx)(i.li,{children:"Dell Vostro 1700"}),"\n",(0,l.jsx)(i.li,{children:"Dell XPS 15 9560"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"emachines",children:"eMachines"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"eMachines E728"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"fujitsu",children:"Fujitsu"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Fujitsu Lifebook A531"}),"\n",(0,l.jsx)(i.li,{children:"Fujitsu Lifebook T900"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"gigabyte",children:"GIGABYTE"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"GIGABYTE Aero 14K"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"google",children:"Google"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Google Chromebook CR48"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"hp",children:"HP"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"HP 240 G3"}),"\n",(0,l.jsx)(i.li,{children:"HP Compaq 6730B"}),"\n",(0,l.jsx)(i.li,{children:"HP Compaq NC6400"}),"\n",(0,l.jsx)(i.li,{children:"HP Compaq Presario CQ61"}),"\n",(0,l.jsx)(i.li,{children:"HP EliteBook 8440P"}),"\n",(0,l.jsx)(i.li,{children:"HP EliteBook 8460p"}),"\n",(0,l.jsx)(i.li,{children:"HP EliteBook 8740w"}),"\n",(0,l.jsx)(i.li,{children:"HP EliteBook 8760w"}),"\n",(0,l.jsx)(i.li,{children:"HP Envy TS M6"}),"\n",(0,l.jsx)(i.li,{children:"HP Pavilion 15-E042SO"}),"\n",(0,l.jsx)(i.li,{children:"HP Pavilion DV6"}),"\n",(0,l.jsx)(i.li,{children:"HP Pavilion DV6Z-6c00"}),"\n",(0,l.jsx)(i.li,{children:"HP Pavilion DV6Z-6100"}),"\n",(0,l.jsx)(i.li,{children:"HP Pavilion DV7"}),"\n",(0,l.jsx)(i.li,{children:"HP Pavilion DV2700"}),"\n",(0,l.jsx)(i.li,{children:"HP Pavilion x360 Convertible"}),"\n",(0,l.jsx)(i.li,{children:"HP Presario V6000"}),"\n",(0,l.jsx)(i.li,{children:"HP Probook 6360b"}),"\n",(0,l.jsx)(i.li,{children:"HP ProBook 6450b"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"lenovo",children:"Lenovo"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Lenovo 3000 V200"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo B41-80"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo B50-50"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo G50-80"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo G510"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo IdeaPad S145-15API"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo IdeaPad S400U"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo IdeaPad U310 Touch"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo IdeaPad Z370"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo IdeaPad Z585"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad 13"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad A485 (with latest BIOS update)"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad E450"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad E550"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad Edge E545"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo Thinkpad L412"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad L440"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad L512"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad R60e"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad S5-S540"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad SL510"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo Thinkpad T400 (2767V2W)"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T410i"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T420"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T430"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T440"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T440s"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T470"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T470s"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T490s"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T560"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T570"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad W520 4270CTO"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X1 Carbon 3rd Edition"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X1 Carbon 4th Edition"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X61"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X200T"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X201"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X220"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X230"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X280"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo Yoga 2 11"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo Z50-70"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"msi",children:"MSI"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"MSI GE70"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"samsung",children:"Samsung"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Samsung NP270E5E-X02PL"}),"\n",(0,l.jsx)(i.li,{children:"Samsung NP300E4C-AD5BR"}),"\n",(0,l.jsx)(i.li,{children:"Samsung NP355E5C"}),"\n",(0,l.jsx)(i.li,{children:"Samsung NP365E5C-S04US"}),"\n",(0,l.jsx)(i.li,{children:"Samsung NP900X3G"}),"\n",(0,l.jsx)(i.li,{children:"Samsung NP900X4C-AU05"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"schenker",children:"Schenker"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Schenker XMG A506-VE"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"sony",children:"Sony"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Sony VAIO Pro 13"}),"\n",(0,l.jsx)(i.li,{children:"Sony VAIO S Series 13"}),"\n",(0,l.jsx)(i.li,{children:"Sony VAIO VPCEC3M1E"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"system76",children:"System76"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"System76 Gazelle Professional"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"toshiba",children:"Toshiba"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Toshiba Portege R930"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Qosmio X305"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Qosmio X875"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite A660"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite C50D-A-125"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite C55D"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite C640"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite C665D"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite L300D"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite L455D"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite L850-B218"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite L855D"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Tecra A11"}),"\n"]})]})}function t(n={}){const{wrapper:i}={...(0,s.a)(),...n.components};return i?(0,l.jsx)(i,{...n,children:(0,l.jsx)(a,{...n})}):a(n)}},11151:(n,i,e)=>{e.d(i,{Z:()=>o,a:()=>d});var l=e(67294);const s={},r=l.createContext(s);function d(n){const i=l.useContext(r);return l.useMemo((function(){return"function"==typeof n?n(i):{...i,...n}}),[i,n])}function o(n){let i;return i=n.disableParentContext?"function"==typeof n.components?n.components(s):n.components||s:d(n.components),l.createElement(r.Provider,{value:i},n.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4869],{87190:(n,i,e)=>{e.r(i),e.d(i,{assets:()=>h,contentTitle:()=>d,default:()=>t,frontMatter:()=>r,metadata:()=>o,toc:()=>c});var l=e(85893),s=e(11151);const r={title:"Laptops",summary:"List of known-working laptop hardware from various vendors"},d="Laptops",o={id:"user/hardware/compatibility/laptops",title:"Laptops",description:"The following laptops have been tested and/or suggested to function correctly by our users.",source:"@site/docs/user/hardware/compatibility/laptops.md",sourceDirName:"user/hardware/compatibility",slug:"/user/hardware/compatibility/laptops",permalink:"/docs/user/hardware/compatibility/laptops",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/compatibility/laptops.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Laptops",summary:"List of known-working laptop hardware from various vendors"},sidebar:"userSidebar",previous:{title:"Compatibility",permalink:"/docs/category/compatibility"},next:{title:"WiFi",permalink:"/docs/user/hardware/compatibility/wifi"}},h={},c=[{value:"Acer",id:"acer",level:2},{value:"Alienware",id:"alienware",level:2},{value:"Apple",id:"apple",level:2},{value:"ASUS",id:"asus",level:2},{value:"Dell",id:"dell",level:2},{value:"eMachines",id:"emachines",level:2},{value:"Fujitsu",id:"fujitsu",level:2},{value:"GIGABYTE",id:"gigabyte",level:2},{value:"Google",id:"google",level:2},{value:"HP",id:"hp",level:2},{value:"Lenovo",id:"lenovo",level:2},{value:"MSI",id:"msi",level:2},{value:"Samsung",id:"samsung",level:2},{value:"Schenker",id:"schenker",level:2},{value:"Sony",id:"sony",level:2},{value:"System76",id:"system76",level:2},{value:"Toshiba",id:"toshiba",level:2}];function a(n){const i={em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,s.a)(),...n.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(i.header,{children:(0,l.jsx)(i.h1,{id:"laptops",children:"Laptops"})}),"\n",(0,l.jsx)(i.p,{children:"The following laptops have been tested and/or suggested to function correctly by our users."}),"\n",(0,l.jsxs)(i.p,{children:["This list should not suggest that ",(0,l.jsx)(i.em,{children:"only"})," such devices listed below are compatible with Solus, as there may be devices not listed below that are in fact compatible."]}),"\n",(0,l.jsx)(i.h2,{id:"acer",children:"Acer"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Acer Aspire 1825PTZ"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire 4830T"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire 5750G"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire 7551"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire E5-473-370Z"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire E5-573G"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire E5-575G"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire ES 15 (ES1-572-5025)"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire ES 17 (ES1-731G-P1MC)"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire V3-112P"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire V3-571G"}),"\n",(0,l.jsx)(i.li,{children:"Acer Aspire V5-121"}),"\n",(0,l.jsx)(i.li,{children:"Acer C710 Chromebook"}),"\n",(0,l.jsx)(i.li,{children:"Acer C720-2848 Chromebook"}),"\n",(0,l.jsx)(i.li,{children:"Acer TravelMate X349-G2-M"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"alienware",children:"Alienware"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Alienware 14"}),"\n",(0,l.jsx)(i.li,{children:"Alienware 17 R3"}),"\n",(0,l.jsx)(i.li,{children:"Alienware 17 R4"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"apple",children:"Apple"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Apple Macbook (late 2008)"}),"\n",(0,l.jsx)(i.li,{children:"Apple MacBookPro8,3"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"asus",children:"ASUS"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Asus EEE-PC 1001PX"}),"\n",(0,l.jsx)(i.li,{children:"Asus EEE-PC 1011PX"}),"\n",(0,l.jsx)(i.li,{children:"Asus K401UQK"}),"\n",(0,l.jsx)(i.li,{children:"Asus K53U"}),"\n",(0,l.jsx)(i.li,{children:"Asus K55VM"}),"\n",(0,l.jsx)(i.li,{children:"Asus K401UQK"}),"\n",(0,l.jsx)(i.li,{children:"Asus M50VM"}),"\n",(0,l.jsx)(i.li,{children:"Asus N501JW"}),"\n",(0,l.jsx)(i.li,{children:"Asus Pro50SR"}),"\n",(0,l.jsx)(i.li,{children:"Asus ROG G750JZA"}),"\n",(0,l.jsxs)(i.li,{children:["Asus VivoBook 15 K505ZA","\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Must use BIOS revision 306 for functional touchpad."}),"\n"]}),"\n"]}),"\n",(0,l.jsxs)(i.li,{children:["Asus VivoBook 15 X505ZA","\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Must use BIOS revision 306 for functional touchpad."}),"\n"]}),"\n"]}),"\n",(0,l.jsxs)(i.li,{children:["Asus VivoBook 15 X505ZA-BQ171T","\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Must use BIOS revision 306 for functional touchpad."}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(i.li,{children:"Asus VivoBook Pro N61JA"}),"\n",(0,l.jsx)(i.li,{children:"Asus VivoBook Pro N61Jv"}),"\n",(0,l.jsx)(i.li,{children:"Asus X200MA"}),"\n",(0,l.jsx)(i.li,{children:"Asus X201EV"}),"\n",(0,l.jsx)(i.li,{children:"Asus X540L"}),"\n",(0,l.jsx)(i.li,{children:"Asus X55"}),"\n",(0,l.jsx)(i.li,{children:"Asus X550LD"}),"\n",(0,l.jsx)(i.li,{children:"Asus X551CAP"}),"\n",(0,l.jsx)(i.li,{children:"Asus ZenBook UX31A"}),"\n",(0,l.jsx)(i.li,{children:"Asus ZenBook UX305FA"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"dell",children:"Dell"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 14 3442"}),"\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 14 3452"}),"\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 15 7579"}),"\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 15R N5010"}),"\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 15R N5110"}),"\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 1110"}),"\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 5050"}),"\n",(0,l.jsx)(i.li,{children:"Dell Inspiron 7548"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude D830"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E4310"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E5440"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E5510"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E6230"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E6320"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E6410"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E6420"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E6430"}),"\n",(0,l.jsx)(i.li,{children:"Dell Latitude E6530"}),"\n",(0,l.jsx)(i.li,{children:"Dell Precision 7520"}),"\n",(0,l.jsx)(i.li,{children:"Dell Precision M6500"}),"\n",(0,l.jsx)(i.li,{children:"Dell Vostro 1700"}),"\n",(0,l.jsx)(i.li,{children:"Dell XPS 15 9560"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"emachines",children:"eMachines"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"eMachines E728"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"fujitsu",children:"Fujitsu"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Fujitsu Lifebook A531"}),"\n",(0,l.jsx)(i.li,{children:"Fujitsu Lifebook T900"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"gigabyte",children:"GIGABYTE"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"GIGABYTE Aero 14K"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"google",children:"Google"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Google Chromebook CR48"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"hp",children:"HP"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"HP 240 G3"}),"\n",(0,l.jsx)(i.li,{children:"HP Compaq 6730B"}),"\n",(0,l.jsx)(i.li,{children:"HP Compaq NC6400"}),"\n",(0,l.jsx)(i.li,{children:"HP Compaq Presario CQ61"}),"\n",(0,l.jsx)(i.li,{children:"HP EliteBook 8440P"}),"\n",(0,l.jsx)(i.li,{children:"HP EliteBook 8460p"}),"\n",(0,l.jsx)(i.li,{children:"HP EliteBook 8740w"}),"\n",(0,l.jsx)(i.li,{children:"HP EliteBook 8760w"}),"\n",(0,l.jsx)(i.li,{children:"HP Envy TS M6"}),"\n",(0,l.jsx)(i.li,{children:"HP Pavilion 15-E042SO"}),"\n",(0,l.jsx)(i.li,{children:"HP Pavilion DV6"}),"\n",(0,l.jsx)(i.li,{children:"HP Pavilion DV6Z-6c00"}),"\n",(0,l.jsx)(i.li,{children:"HP Pavilion DV6Z-6100"}),"\n",(0,l.jsx)(i.li,{children:"HP Pavilion DV7"}),"\n",(0,l.jsx)(i.li,{children:"HP Pavilion DV2700"}),"\n",(0,l.jsx)(i.li,{children:"HP Pavilion x360 Convertible"}),"\n",(0,l.jsx)(i.li,{children:"HP Presario V6000"}),"\n",(0,l.jsx)(i.li,{children:"HP Probook 6360b"}),"\n",(0,l.jsx)(i.li,{children:"HP ProBook 6450b"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"lenovo",children:"Lenovo"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Lenovo 3000 V200"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo B41-80"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo B50-50"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo G50-80"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo G510"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo IdeaPad S145-15API"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo IdeaPad S400U"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo IdeaPad U310 Touch"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo IdeaPad Z370"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo IdeaPad Z585"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad 13"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad A485 (with latest BIOS update)"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad E450"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad E550"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad Edge E545"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo Thinkpad L412"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad L440"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad L512"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad R60e"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad S5-S540"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad SL510"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo Thinkpad T400 (2767V2W)"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T410i"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T420"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T430"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T440"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T440s"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T470"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T470s"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T490s"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T560"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad T570"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad W520 4270CTO"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X1 Carbon 3rd Edition"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X1 Carbon 4th Edition"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X61"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X200T"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X201"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X220"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X230"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo ThinkPad X280"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo Yoga 2 11"}),"\n",(0,l.jsx)(i.li,{children:"Lenovo Z50-70"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"msi",children:"MSI"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"MSI GE70"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"samsung",children:"Samsung"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Samsung NP270E5E-X02PL"}),"\n",(0,l.jsx)(i.li,{children:"Samsung NP300E4C-AD5BR"}),"\n",(0,l.jsx)(i.li,{children:"Samsung NP355E5C"}),"\n",(0,l.jsx)(i.li,{children:"Samsung NP365E5C-S04US"}),"\n",(0,l.jsx)(i.li,{children:"Samsung NP900X3G"}),"\n",(0,l.jsx)(i.li,{children:"Samsung NP900X4C-AU05"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"schenker",children:"Schenker"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Schenker XMG A506-VE"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"sony",children:"Sony"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Sony VAIO Pro 13"}),"\n",(0,l.jsx)(i.li,{children:"Sony VAIO S Series 13"}),"\n",(0,l.jsx)(i.li,{children:"Sony VAIO VPCEC3M1E"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"system76",children:"System76"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"System76 Gazelle Professional"}),"\n"]}),"\n",(0,l.jsx)(i.h2,{id:"toshiba",children:"Toshiba"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"Toshiba Portege R930"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Qosmio X305"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Qosmio X875"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite A660"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite C50D-A-125"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite C55D"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite C640"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite C665D"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite L300D"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite L455D"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite L850-B218"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Satellite L855D"}),"\n",(0,l.jsx)(i.li,{children:"Toshiba Tecra A11"}),"\n"]})]})}function t(n={}){const{wrapper:i}={...(0,s.a)(),...n.components};return i?(0,l.jsx)(i,{...n,children:(0,l.jsx)(a,{...n})}):a(n)}},11151:(n,i,e)=>{e.d(i,{Z:()=>o,a:()=>d});var l=e(67294);const s={},r=l.createContext(s);function d(n){const i=l.useContext(r);return l.useMemo((function(){return"function"==typeof n?n(i):{...i,...n}}),[i,n])}function o(n){let i;return i=n.disableParentContext?"function"==typeof n.components?n.components(s):n.components||s:d(n.components),l.createElement(r.Provider,{value:i},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/be79d003.90908041.js b/assets/js/be79d003.3fa5336d.js similarity index 98% rename from assets/js/be79d003.90908041.js rename to assets/js/be79d003.3fa5336d.js index f8ae9738b..509756bc6 100644 --- a/assets/js/be79d003.90908041.js +++ b/assets/js/be79d003.3fa5336d.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6012],{62262:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>d,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>i,toc:()=>c});var t=n(85893),a=n(11151);const r={title:"Update Your Development Environment",summary:"Update your development environment before working on a package",sidebar_position:2},s="Update Your Development Environment",i={id:"packaging/update-dev-environment",title:"Update Your Development Environment",description:"Always make sure your development environment and system are up to date before beginning work on a package",source:"@site/docs/packaging/update-dev-environment.md",sourceDirName:"packaging",slug:"/packaging/update-dev-environment",permalink:"/docs/packaging/update-dev-environment",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/update-dev-environment.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,sidebarPosition:2,frontMatter:{title:"Update Your Development Environment",summary:"Update your development environment before working on a package",sidebar_position:2},sidebar:"packagingSidebar",previous:{title:"Prepare for Packaging",permalink:"/docs/packaging/prepare-for-packaging"},next:{title:"Creating a New Package",permalink:"/docs/packaging/creating-a-new-package"}},d={},c=[{value:"Update your fork of the getsolus/packages repository",id:"update-your-fork-of-the-getsoluspackages-repository",level:2},{value:"Update your local clone of your fork",id:"update-your-local-clone-of-your-fork",level:2},{value:"Update solbuild and the system",id:"update-solbuild-and-the-system",level:2}];function l(e){const o={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.header,{children:(0,t.jsx)(o.h1,{id:"update-your-development-environment",children:"Update Your Development Environment"})}),"\n",(0,t.jsx)(o.p,{children:"Always make sure your development environment and system are up to date before beginning work on a package"}),"\n",(0,t.jsxs)(o.ol,{children:["\n",(0,t.jsxs)(o.li,{children:["Update your fork of the ",(0,t.jsx)(o.a,{href:"https://github.com/getsolus/packages",children:"getsolus/packages"})," repository."]}),"\n",(0,t.jsx)(o.li,{children:"Update your local clone of your fork."}),"\n",(0,t.jsxs)(o.li,{children:["Update the solbuild base image ",(0,t.jsx)(o.code,{children:"sudo solbuild update"})]}),"\n",(0,t.jsx)(o.li,{children:"Update the system."}),"\n"]}),"\n",(0,t.jsx)(o.h2,{id:"update-your-fork-of-the-getsoluspackages-repository",children:"Update your fork of the getsolus/packages repository"}),"\n",(0,t.jsxs)(o.p,{children:["If you already have a fork of ",(0,t.jsx)(o.a,{href:"https://github.com/getsolus/packages",children:"getsolus/packages"})," in GitHub, log into GitHub. Make sure you're looking at the ",(0,t.jsx)(o.code,{children:"main"}),' branch. Check to see that your fork is up to date with the main repository it was forked from. If your fork indicates it is behind, use the "Sync fork" button to bring it up to date.']}),"\n",(0,t.jsx)(o.h2,{id:"update-your-local-clone-of-your-fork",children:"Update your local clone of your fork"}),"\n",(0,t.jsx)(o.p,{children:"If you already have a local clone, you need to bring it up to date. To do so run:"}),"\n",(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-bash",children:"cd ~/solus-packages\ngit switch main\ngit pull\n"})}),"\n",(0,t.jsxs)(o.h2,{id:"update-solbuild-and-the-system",children:["Update ",(0,t.jsx)(o.code,{children:"solbuild"})," and the system"]}),"\n",(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-bash",children:"sudo solbuild update\nsudo eopkg up\n"})}),"\n",(0,t.jsxs)(o.p,{children:["Next, you can either ",(0,t.jsx)(o.a,{href:"/docs/packaging/creating-a-new-package",children:"Submit a New Package"})," or ",(0,t.jsx)(o.a,{href:"/docs/packaging/updating-an-existing-package",children:"Update an Existing Package"})]})]})}function p(e={}){const{wrapper:o}={...(0,a.a)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,o,n)=>{n.d(o,{Z:()=>i,a:()=>s});var t=n(67294);const a={},r=t.createContext(a);function s(e){const o=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function i(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),t.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6012],{62262:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>d,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>i,toc:()=>c});var t=n(85893),a=n(11151);const r={title:"Update Your Development Environment",summary:"Update your development environment before working on a package",sidebar_position:2},s="Update Your Development Environment",i={id:"packaging/update-dev-environment",title:"Update Your Development Environment",description:"Always make sure your development environment and system are up to date before beginning work on a package",source:"@site/docs/packaging/update-dev-environment.md",sourceDirName:"packaging",slug:"/packaging/update-dev-environment",permalink:"/docs/packaging/update-dev-environment",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/update-dev-environment.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,sidebarPosition:2,frontMatter:{title:"Update Your Development Environment",summary:"Update your development environment before working on a package",sidebar_position:2},sidebar:"packagingSidebar",previous:{title:"Prepare for Packaging",permalink:"/docs/packaging/prepare-for-packaging"},next:{title:"Creating a New Package",permalink:"/docs/packaging/creating-a-new-package"}},d={},c=[{value:"Update your fork of the getsolus/packages repository",id:"update-your-fork-of-the-getsoluspackages-repository",level:2},{value:"Update your local clone of your fork",id:"update-your-local-clone-of-your-fork",level:2},{value:"Update solbuild and the system",id:"update-solbuild-and-the-system",level:2}];function l(e){const o={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.header,{children:(0,t.jsx)(o.h1,{id:"update-your-development-environment",children:"Update Your Development Environment"})}),"\n",(0,t.jsx)(o.p,{children:"Always make sure your development environment and system are up to date before beginning work on a package"}),"\n",(0,t.jsxs)(o.ol,{children:["\n",(0,t.jsxs)(o.li,{children:["Update your fork of the ",(0,t.jsx)(o.a,{href:"https://github.com/getsolus/packages",children:"getsolus/packages"})," repository."]}),"\n",(0,t.jsx)(o.li,{children:"Update your local clone of your fork."}),"\n",(0,t.jsxs)(o.li,{children:["Update the solbuild base image ",(0,t.jsx)(o.code,{children:"sudo solbuild update"})]}),"\n",(0,t.jsx)(o.li,{children:"Update the system."}),"\n"]}),"\n",(0,t.jsx)(o.h2,{id:"update-your-fork-of-the-getsoluspackages-repository",children:"Update your fork of the getsolus/packages repository"}),"\n",(0,t.jsxs)(o.p,{children:["If you already have a fork of ",(0,t.jsx)(o.a,{href:"https://github.com/getsolus/packages",children:"getsolus/packages"})," in GitHub, log into GitHub. Make sure you're looking at the ",(0,t.jsx)(o.code,{children:"main"}),' branch. Check to see that your fork is up to date with the main repository it was forked from. If your fork indicates it is behind, use the "Sync fork" button to bring it up to date.']}),"\n",(0,t.jsx)(o.h2,{id:"update-your-local-clone-of-your-fork",children:"Update your local clone of your fork"}),"\n",(0,t.jsx)(o.p,{children:"If you already have a local clone, you need to bring it up to date. To do so run:"}),"\n",(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-bash",children:"cd ~/solus-packages\ngit switch main\ngit pull\n"})}),"\n",(0,t.jsxs)(o.h2,{id:"update-solbuild-and-the-system",children:["Update ",(0,t.jsx)(o.code,{children:"solbuild"})," and the system"]}),"\n",(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-bash",children:"sudo solbuild update\nsudo eopkg up\n"})}),"\n",(0,t.jsxs)(o.p,{children:["Next, you can either ",(0,t.jsx)(o.a,{href:"/docs/packaging/creating-a-new-package",children:"Submit a New Package"})," or ",(0,t.jsx)(o.a,{href:"/docs/packaging/updating-an-existing-package",children:"Update an Existing Package"})]})]})}function p(e={}){const{wrapper:o}={...(0,a.a)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},11151:(e,o,n)=>{n.d(o,{Z:()=>i,a:()=>s});var t=n(67294);const a={},r=t.createContext(a);function s(e){const o=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function i(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),t.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c15d9823.50145b1a.js b/assets/js/c15d9823.bd5c9de5.js similarity index 76% rename from assets/js/c15d9823.50145b1a.js rename to assets/js/c15d9823.bd5c9de5.js index 54ff70754..f42a170d9 100644 --- a/assets/js/c15d9823.50145b1a.js +++ b/assets/js/c15d9823.bd5c9de5.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6642],{92506:e=>{e.exports=JSON.parse('{"metadata":{"permalink":"/blog","page":1,"postsPerPage":4,"totalPages":1,"totalCount":4,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6642],{92506:e=>{e.exports=JSON.parse('{"metadata":{"permalink":"/blog","page":1,"postsPerPage":5,"totalPages":1,"totalCount":5,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]); \ No newline at end of file diff --git a/assets/js/c55c138b.d801b250.js b/assets/js/c55c138b.d4901da8.js similarity index 99% rename from assets/js/c55c138b.d801b250.js rename to assets/js/c55c138b.d4901da8.js index 66bed4e87..5b129e5b8 100644 --- a/assets/js/c55c138b.d801b250.js +++ b/assets/js/c55c138b.d4901da8.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7465],{76323:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>r,contentTitle:()=>c,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>t});var s=n(85893),a=n(11151);const o={title:"Packaging Changes",summary:"Changes to packaging environment and instructions",sidebar_position:7},c="Packaging Changes",l={id:"packaging/packaging-changes",title:"Packaging Changes",description:"This page is meant to serve as a changelog of sorts for the Solus packaging environment and the packaging instructions. Refer to specific help pages for more details.",source:"@site/docs/packaging/packaging-changes.md",sourceDirName:"packaging",slug:"/packaging/packaging-changes",permalink:"/docs/packaging/packaging-changes",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/packaging-changes.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,sidebarPosition:7,frontMatter:{title:"Packaging Changes",summary:"Changes to packaging environment and instructions",sidebar_position:7},sidebar:"packagingSidebar",previous:{title:"Submitting a Pull Request for Review",permalink:"/docs/packaging/submitting-a-pull-request"},next:{title:"Advanced Configuration",permalink:"/docs/category/advanced-configuration"}},r={},t=[{value:"2024",id:"2024",level:2},{value:"May",id:"may",level:3},{value:"Remove 'Test Plan' and 'Checklist' from commit messages",id:"remove-test-plan-and-checklist-from-commit-messages",level:4},{value:"Add Rust macros to package.yml",id:"add-rust-macros-to-packageyml",level:4},{value:"Add guidance for SourceForge sources in package.yml",id:"add-guidance-for-sourceforge-sources-in-packageyml",level:4},{value:"February",id:"february",level:3},{value:"Begin adding monitoring.yml to packages",id:"begin-adding-monitoringyml-to-packages",level:4},{value:"2023",id:"2023",level:2},{value:"October",id:"october",level:3},{value:"Adding checkdeps in package.yml",id:"adding-checkdeps-in-packageyml",level:4},{value:"Git hooks",id:"git-hooks",level:4},{value:"Requiring homepage in package.yml",id:"requiring-homepage-in-packageyml",level:4},{value:"Recommending amending commits in Pull Requests",id:"recommending-amending-commits-in-pull-requests",level:4},{value:"September",id:"september",level:3},{value:"Switch to asterisk bolding for PR template",id:"switch-to-asterisk-bolding-for-pr-template",level:4},{value:"Switching From make to go-task",id:"switching-from-make-to-go-task",level:4},{value:"GitHub Monorepo Migration",id:"github-monorepo-migration",level:4},{value:"August",id:"august",level:3},{value:"Initial GitHub Migration from old Phabricator Dev Tracker",id:"initial-github-migration-from-old-phabricator-dev-tracker",level:4},{value:"April",id:"april",level:3},{value:"2022 and Earlier",id:"2022-and-earlier",level:2}];function d(e){const i={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"packaging-changes",children:"Packaging Changes"})}),"\n",(0,s.jsx)(i.p,{children:"This page is meant to serve as a changelog of sorts for the Solus packaging environment and the packaging instructions. Refer to specific help pages for more details."}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"This list is not exhaustive"}),"\n",(0,s.jsxs)(i.li,{children:["This list is in ",(0,s.jsx)(i.em,{children:"reverse chronological order"})," (newest first)"]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"2024",children:"2024"}),"\n",(0,s.jsx)(i.h3,{id:"may",children:"May"}),"\n",(0,s.jsx)(i.h4,{id:"remove-test-plan-and-checklist-from-commit-messages",children:"Remove 'Test Plan' and 'Checklist' from commit messages"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"These are no longer needed in commit messages."}),"\n",(0,s.jsx)(i.li,{children:"They must still be included in the pull request description."}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"add-rust-macros-to-packageyml",children:"Add Rust macros to package.yml"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["We now have macros for building Rust packages. Example: ",(0,s.jsx)(i.code,{children:"%cargo_build"}),". Rust packages should be switched to use the new macros as they are updated."]}),"\n",(0,s.jsxs)(i.li,{children:['See the "Rust (cargo) actionable macros" section on the ',(0,s.jsx)(i.a,{href:"/docs/packaging/package.yml#rust-cargo-actionable-macros",children:"package.yml page"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"add-guidance-for-sourceforge-sources-in-packageyml",children:"Add guidance for SourceForge sources in package.yml"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["We now require SourceForge sources used in ",(0,s.jsx)(i.code,{children:"package.yml"})," files to follow a specific format."]}),"\n",(0,s.jsxs)(i.li,{children:["See the ",(0,s.jsx)(i.a,{href:"/docs/packaging/package.yml#source-key",children:"package.yml page"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"february",children:"February"}),"\n",(0,s.jsxs)(i.h4,{id:"begin-adding-monitoringyml-to-packages",children:["Begin adding ",(0,s.jsx)(i.code,{children:"monitoring.yml"})," to packages"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["A new per-package file was introduced: ",(0,s.jsx)(i.code,{children:"monitoring.yml"}),". Used to monitor packages for releases and security advisories; see ",(0,s.jsx)(i.a,{href:"/docs/packaging/monitoring.yml",children:"monitoring.yml"}),"."]}),"\n",(0,s.jsx)(i.li,{children:"This is not enforced by automatic checks yet, but we may ask that it be added."}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"2023",children:"2023"}),"\n",(0,s.jsx)(i.h3,{id:"october",children:"October"}),"\n",(0,s.jsxs)(i.h4,{id:"adding-checkdeps-in-packageyml",children:["Adding ",(0,s.jsx)(i.code,{children:"checkdeps"})," in ",(0,s.jsx)(i.code,{children:"package.yml"})]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["A new type of packaging dependency was added: ",(0,s.jsx)(i.code,{children:"checkdeps"}),". They behave the same as ",(0,s.jsx)(i.code,{children:"builddeps"}),", except they are not considered when determining build order for automatic builds. See the ",(0,s.jsx)(i.a,{href:"/docs/packaging/package.yml",children:"package.yml page"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"git-hooks",children:"Git hooks"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Run ",(0,s.jsx)(i.code,{children:"go-task init"})," to initialize Git hooks for the packages repository. See ",(0,s.jsx)(i.a,{href:"/docs/packaging/prepare-for-packaging#initialize-git-hooks",children:"Prepare for packaging"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:["Use ",(0,s.jsx)(i.code,{children:"git commit"})," for committing packaging changes and fill in the template shown.\nIt is no longer required to manually copy-paste the template or use ",(0,s.jsx)(i.code,{children:"git commit --cleanup=scissors"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(i.h4,{id:"requiring-homepage-in-packageyml",children:["Requiring ",(0,s.jsx)(i.code,{children:"homepage"})," in ",(0,s.jsx)(i.code,{children:"package.yml"})]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"homepage"})," key in ",(0,s.jsx)(i.code,{children:"package.yml"})," has become mandatory. Use the address to the upstream source repository (eg: the GitHub page) if a package does not have a homepage."]}),"\n",(0,s.jsx)(i.li,{children:"This is enforced by checks on all pull requests."}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"recommending-amending-commits-in-pull-requests",children:"Recommending amending commits in Pull Requests"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Amending commits and force pushing the changes works better with our build tooling.","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"It was thought that abandoning this practice would be okay, but it turns out not to be the case."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"september",children:"September"}),"\n",(0,s.jsx)(i.h4,{id:"switch-to-asterisk-bolding-for-pr-template",children:"Switch to asterisk bolding for PR template"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["The initial PR template for the ",(0,s.jsx)(i.code,{children:"packages"})," repository used markdown header styling (",(0,s.jsx)(i.code,{children:"## Heading text"}),"), but ",(0,s.jsx)(i.code,{children:"solus-sc"})," does not render that styling, so the template was changed to asterisk bolding (",(0,s.jsx)(i.code,{children:"**Heading text**"}),")"]}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://github.com/getsolus/packages/pull/366",children:"https://github.com/getsolus/packages/pull/366"})}),"\n"]}),"\n",(0,s.jsxs)(i.h4,{id:"switching-from-make-to-go-task",children:["Switching From ",(0,s.jsx)(i.code,{children:"make"})," to ",(0,s.jsx)(i.code,{children:"go-task"})]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["All packaging actions are now handled by ",(0,s.jsx)(i.code,{children:"go-task"})," rather than ",(0,s.jsx)(i.code,{children:"make"}),".","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Building a package can be done using ",(0,s.jsx)(i.code,{children:"go-task"})," rather than ",(0,s.jsx)(i.code,{children:"make"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:["Commands are the same: ",(0,s.jsx)(i.code,{children:"make local"}),", for example, is replaced by ",(0,s.jsx)(i.code,{children:"go-task local"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:["You can see all available commands by either browsing to ",(0,s.jsx)(i.code,{children:"Taskfile.yml"})," in the ",(0,s.jsxs)(i.a,{href:"https://github.com/getsolus/packages/blob/main/Taskfile.yml",children:[(0,s.jsx)(i.code,{children:"packages"})," repository"]})," OR running ",(0,s.jsx)(i.code,{children:"go-task -l"})," somewhere in your updated clone of the packages git monorepo."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["Packagers should install ",(0,s.jsx)(i.code,{children:"go-task"})," on their machines if they have not already."]}),"\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"Makefile"})," included with every package is no longer required. Please delete it from a package when updating, and do not include it when making the initial commit of a new package."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"github-monorepo-migration",children:"GitHub Monorepo Migration"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Packages were moved from the initial multirepo setup to the ",(0,s.jsx)(i.code,{children:"packages"})," monorepo: ",(0,s.jsx)(i.a,{href:"https://github.com/getsolus/packages",children:"github.com/getsolus/packages"})," Now packagers only need to clone/fork one repository for all packages."]}),"\n",(0,s.jsx)(i.li,{children:"The recommended migration strategy is to fork this repository and start with a clean clone. Any local changes to packages should be moved over manually."}),"\n",(0,s.jsxs)(i.li,{children:["Packagers should now title commits like ",(0,s.jsx)(i.code,{children:"packagename: Action"}),"; for example: ",(0,s.jsx)(i.code,{children:"nano: Update to 9.0"}),". Generic titles like ",(0,s.jsx)(i.code,{children:"Update to 9.0"})," should not be used, except for rebuilds."]}),"\n",(0,s.jsx)(i.li,{children:"Packagers should use the pull request template for package updates, filling out the Summary and Test Plan sections as usual."}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"august",children:"August"}),"\n",(0,s.jsx)(i.h4,{id:"initial-github-migration-from-old-phabricator-dev-tracker",children:"Initial GitHub Migration from old Phabricator Dev Tracker"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.em,{children:"This change was superseded by the later monorepo migration."})}),"\n",(0,s.jsxs)(i.li,{children:["The new multirepo setup for packages was under ",(0,s.jsx)(i.code,{children:"github.com/solus-packages"})," organization, packages were updated with PRs to individual repositories."]}),"\n",(0,s.jsxs)(i.li,{children:["Issues were migrated to ",(0,s.jsx)(i.code,{children:"github.com/getsolus/packages"})," from Phabricator. ",(0,s.jsx)(i.em,{children:"Closed issues were not migrated."})]}),"\n",(0,s.jsxs)(i.li,{children:["A read-only instance of the old Dev Tracker is available at ",(0,s.jsx)(i.a,{href:"https://phab.getsol.us",children:"phab.getsol.us"}),". ",(0,s.jsx)(i.em,{children:"This will eventually be shut down."})]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"april",children:"April"}),"\n",(0,s.jsxs)(i.p,{children:["The repository index was moved to ",(0,s.jsx)(i.code,{children:"cdn.getsol.us"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"2022-and-earlier",children:"2022 and Earlier"}),"\n",(0,s.jsx)(i.p,{children:"Not included in this list."})]})}function h(e={}){const{wrapper:i}={...(0,a.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,i,n)=>{n.d(i,{Z:()=>l,a:()=>c});var s=n(67294);const a={},o=s.createContext(a);function c(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:c(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7465],{76323:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>r,contentTitle:()=>c,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>t});var s=n(85893),a=n(11151);const o={title:"Packaging Changes",summary:"Changes to packaging environment and instructions",sidebar_position:7},c="Packaging Changes",l={id:"packaging/packaging-changes",title:"Packaging Changes",description:"This page is meant to serve as a changelog of sorts for the Solus packaging environment and the packaging instructions. Refer to specific help pages for more details.",source:"@site/docs/packaging/packaging-changes.md",sourceDirName:"packaging",slug:"/packaging/packaging-changes",permalink:"/docs/packaging/packaging-changes",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/packaging-changes.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,sidebarPosition:7,frontMatter:{title:"Packaging Changes",summary:"Changes to packaging environment and instructions",sidebar_position:7},sidebar:"packagingSidebar",previous:{title:"Submitting a Pull Request for Review",permalink:"/docs/packaging/submitting-a-pull-request"},next:{title:"Advanced Configuration",permalink:"/docs/category/advanced-configuration"}},r={},t=[{value:"2024",id:"2024",level:2},{value:"May",id:"may",level:3},{value:"Remove 'Test Plan' and 'Checklist' from commit messages",id:"remove-test-plan-and-checklist-from-commit-messages",level:4},{value:"Add Rust macros to package.yml",id:"add-rust-macros-to-packageyml",level:4},{value:"Add guidance for SourceForge sources in package.yml",id:"add-guidance-for-sourceforge-sources-in-packageyml",level:4},{value:"February",id:"february",level:3},{value:"Begin adding monitoring.yml to packages",id:"begin-adding-monitoringyml-to-packages",level:4},{value:"2023",id:"2023",level:2},{value:"October",id:"october",level:3},{value:"Adding checkdeps in package.yml",id:"adding-checkdeps-in-packageyml",level:4},{value:"Git hooks",id:"git-hooks",level:4},{value:"Requiring homepage in package.yml",id:"requiring-homepage-in-packageyml",level:4},{value:"Recommending amending commits in Pull Requests",id:"recommending-amending-commits-in-pull-requests",level:4},{value:"September",id:"september",level:3},{value:"Switch to asterisk bolding for PR template",id:"switch-to-asterisk-bolding-for-pr-template",level:4},{value:"Switching From make to go-task",id:"switching-from-make-to-go-task",level:4},{value:"GitHub Monorepo Migration",id:"github-monorepo-migration",level:4},{value:"August",id:"august",level:3},{value:"Initial GitHub Migration from old Phabricator Dev Tracker",id:"initial-github-migration-from-old-phabricator-dev-tracker",level:4},{value:"April",id:"april",level:3},{value:"2022 and Earlier",id:"2022-and-earlier",level:2}];function d(e){const i={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",ul:"ul",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"packaging-changes",children:"Packaging Changes"})}),"\n",(0,s.jsx)(i.p,{children:"This page is meant to serve as a changelog of sorts for the Solus packaging environment and the packaging instructions. Refer to specific help pages for more details."}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"This list is not exhaustive"}),"\n",(0,s.jsxs)(i.li,{children:["This list is in ",(0,s.jsx)(i.em,{children:"reverse chronological order"})," (newest first)"]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"2024",children:"2024"}),"\n",(0,s.jsx)(i.h3,{id:"may",children:"May"}),"\n",(0,s.jsx)(i.h4,{id:"remove-test-plan-and-checklist-from-commit-messages",children:"Remove 'Test Plan' and 'Checklist' from commit messages"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"These are no longer needed in commit messages."}),"\n",(0,s.jsx)(i.li,{children:"They must still be included in the pull request description."}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"add-rust-macros-to-packageyml",children:"Add Rust macros to package.yml"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["We now have macros for building Rust packages. Example: ",(0,s.jsx)(i.code,{children:"%cargo_build"}),". Rust packages should be switched to use the new macros as they are updated."]}),"\n",(0,s.jsxs)(i.li,{children:['See the "Rust (cargo) actionable macros" section on the ',(0,s.jsx)(i.a,{href:"/docs/packaging/package.yml#rust-cargo-actionable-macros",children:"package.yml page"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"add-guidance-for-sourceforge-sources-in-packageyml",children:"Add guidance for SourceForge sources in package.yml"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["We now require SourceForge sources used in ",(0,s.jsx)(i.code,{children:"package.yml"})," files to follow a specific format."]}),"\n",(0,s.jsxs)(i.li,{children:["See the ",(0,s.jsx)(i.a,{href:"/docs/packaging/package.yml#source-key",children:"package.yml page"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"february",children:"February"}),"\n",(0,s.jsxs)(i.h4,{id:"begin-adding-monitoringyml-to-packages",children:["Begin adding ",(0,s.jsx)(i.code,{children:"monitoring.yml"})," to packages"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["A new per-package file was introduced: ",(0,s.jsx)(i.code,{children:"monitoring.yml"}),". Used to monitor packages for releases and security advisories; see ",(0,s.jsx)(i.a,{href:"/docs/packaging/monitoring.yml",children:"monitoring.yml"}),"."]}),"\n",(0,s.jsx)(i.li,{children:"This is not enforced by automatic checks yet, but we may ask that it be added."}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"2023",children:"2023"}),"\n",(0,s.jsx)(i.h3,{id:"october",children:"October"}),"\n",(0,s.jsxs)(i.h4,{id:"adding-checkdeps-in-packageyml",children:["Adding ",(0,s.jsx)(i.code,{children:"checkdeps"})," in ",(0,s.jsx)(i.code,{children:"package.yml"})]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["A new type of packaging dependency was added: ",(0,s.jsx)(i.code,{children:"checkdeps"}),". They behave the same as ",(0,s.jsx)(i.code,{children:"builddeps"}),", except they are not considered when determining build order for automatic builds. See the ",(0,s.jsx)(i.a,{href:"/docs/packaging/package.yml",children:"package.yml page"}),"."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"git-hooks",children:"Git hooks"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Run ",(0,s.jsx)(i.code,{children:"go-task init"})," to initialize Git hooks for the packages repository. See ",(0,s.jsx)(i.a,{href:"/docs/packaging/prepare-for-packaging#initialize-git-hooks",children:"Prepare for packaging"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:["Use ",(0,s.jsx)(i.code,{children:"git commit"})," for committing packaging changes and fill in the template shown.\nIt is no longer required to manually copy-paste the template or use ",(0,s.jsx)(i.code,{children:"git commit --cleanup=scissors"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(i.h4,{id:"requiring-homepage-in-packageyml",children:["Requiring ",(0,s.jsx)(i.code,{children:"homepage"})," in ",(0,s.jsx)(i.code,{children:"package.yml"})]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"homepage"})," key in ",(0,s.jsx)(i.code,{children:"package.yml"})," has become mandatory. Use the address to the upstream source repository (eg: the GitHub page) if a package does not have a homepage."]}),"\n",(0,s.jsx)(i.li,{children:"This is enforced by checks on all pull requests."}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"recommending-amending-commits-in-pull-requests",children:"Recommending amending commits in Pull Requests"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Amending commits and force pushing the changes works better with our build tooling.","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"It was thought that abandoning this practice would be okay, but it turns out not to be the case."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"september",children:"September"}),"\n",(0,s.jsx)(i.h4,{id:"switch-to-asterisk-bolding-for-pr-template",children:"Switch to asterisk bolding for PR template"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["The initial PR template for the ",(0,s.jsx)(i.code,{children:"packages"})," repository used markdown header styling (",(0,s.jsx)(i.code,{children:"## Heading text"}),"), but ",(0,s.jsx)(i.code,{children:"solus-sc"})," does not render that styling, so the template was changed to asterisk bolding (",(0,s.jsx)(i.code,{children:"**Heading text**"}),")"]}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"https://github.com/getsolus/packages/pull/366",children:"https://github.com/getsolus/packages/pull/366"})}),"\n"]}),"\n",(0,s.jsxs)(i.h4,{id:"switching-from-make-to-go-task",children:["Switching From ",(0,s.jsx)(i.code,{children:"make"})," to ",(0,s.jsx)(i.code,{children:"go-task"})]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["All packaging actions are now handled by ",(0,s.jsx)(i.code,{children:"go-task"})," rather than ",(0,s.jsx)(i.code,{children:"make"}),".","\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Building a package can be done using ",(0,s.jsx)(i.code,{children:"go-task"})," rather than ",(0,s.jsx)(i.code,{children:"make"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:["Commands are the same: ",(0,s.jsx)(i.code,{children:"make local"}),", for example, is replaced by ",(0,s.jsx)(i.code,{children:"go-task local"}),"."]}),"\n",(0,s.jsxs)(i.li,{children:["You can see all available commands by either browsing to ",(0,s.jsx)(i.code,{children:"Taskfile.yml"})," in the ",(0,s.jsxs)(i.a,{href:"https://github.com/getsolus/packages/blob/main/Taskfile.yml",children:[(0,s.jsx)(i.code,{children:"packages"})," repository"]})," OR running ",(0,s.jsx)(i.code,{children:"go-task -l"})," somewhere in your updated clone of the packages git monorepo."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(i.li,{children:["Packagers should install ",(0,s.jsx)(i.code,{children:"go-task"})," on their machines if they have not already."]}),"\n",(0,s.jsxs)(i.li,{children:["The ",(0,s.jsx)(i.code,{children:"Makefile"})," included with every package is no longer required. Please delete it from a package when updating, and do not include it when making the initial commit of a new package."]}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"github-monorepo-migration",children:"GitHub Monorepo Migration"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:["Packages were moved from the initial multirepo setup to the ",(0,s.jsx)(i.code,{children:"packages"})," monorepo: ",(0,s.jsx)(i.a,{href:"https://github.com/getsolus/packages",children:"github.com/getsolus/packages"})," Now packagers only need to clone/fork one repository for all packages."]}),"\n",(0,s.jsx)(i.li,{children:"The recommended migration strategy is to fork this repository and start with a clean clone. Any local changes to packages should be moved over manually."}),"\n",(0,s.jsxs)(i.li,{children:["Packagers should now title commits like ",(0,s.jsx)(i.code,{children:"packagename: Action"}),"; for example: ",(0,s.jsx)(i.code,{children:"nano: Update to 9.0"}),". Generic titles like ",(0,s.jsx)(i.code,{children:"Update to 9.0"})," should not be used, except for rebuilds."]}),"\n",(0,s.jsx)(i.li,{children:"Packagers should use the pull request template for package updates, filling out the Summary and Test Plan sections as usual."}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"august",children:"August"}),"\n",(0,s.jsx)(i.h4,{id:"initial-github-migration-from-old-phabricator-dev-tracker",children:"Initial GitHub Migration from old Phabricator Dev Tracker"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.em,{children:"This change was superseded by the later monorepo migration."})}),"\n",(0,s.jsxs)(i.li,{children:["The new multirepo setup for packages was under ",(0,s.jsx)(i.code,{children:"github.com/solus-packages"})," organization, packages were updated with PRs to individual repositories."]}),"\n",(0,s.jsxs)(i.li,{children:["Issues were migrated to ",(0,s.jsx)(i.code,{children:"github.com/getsolus/packages"})," from Phabricator. ",(0,s.jsx)(i.em,{children:"Closed issues were not migrated."})]}),"\n",(0,s.jsxs)(i.li,{children:["A read-only instance of the old Dev Tracker is available at ",(0,s.jsx)(i.a,{href:"https://phab.getsol.us",children:"phab.getsol.us"}),". ",(0,s.jsx)(i.em,{children:"This will eventually be shut down."})]}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"april",children:"April"}),"\n",(0,s.jsxs)(i.p,{children:["The repository index was moved to ",(0,s.jsx)(i.code,{children:"cdn.getsol.us"}),"."]}),"\n",(0,s.jsx)(i.h2,{id:"2022-and-earlier",children:"2022 and Earlier"}),"\n",(0,s.jsx)(i.p,{children:"Not included in this list."})]})}function h(e={}){const{wrapper:i}={...(0,a.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,i,n)=>{n.d(i,{Z:()=>l,a:()=>c});var s=n(67294);const a={},o=s.createContext(a);function c(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:c(e.components),s.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c5de29d4.476afa6b.js b/assets/js/c5de29d4.62c2e63d.js similarity index 99% rename from assets/js/c5de29d4.476afa6b.js rename to assets/js/c5de29d4.62c2e63d.js index fc8fc9aa5..d9be220c3 100644 --- a/assets/js/c5de29d4.476afa6b.js +++ b/assets/js/c5de29d4.62c2e63d.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3851],{44158:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>l,toc:()=>o});var i=a(85893),s=a(11151);const t={title:"Creating a New Package",summary:"Creating a Package For Inclusion in the Repositories",sidebar_position:3},r="Creating a New Package",l={id:"packaging/creating-a-new-package",title:"Creating a New Package",description:"This page will take you through the steps required to build a new package for the Solus package repositories. For this example, we will use the command line utility tree, which is already packaged for Solus, but we will pretend like it's not.",source:"@site/docs/packaging/creating-a-new-package.md",sourceDirName:"packaging",slug:"/packaging/creating-a-new-package",permalink:"/docs/packaging/creating-a-new-package",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/creating-a-new-package.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,sidebarPosition:3,frontMatter:{title:"Creating a New Package",summary:"Creating a Package For Inclusion in the Repositories",sidebar_position:3},sidebar:"packagingSidebar",previous:{title:"Update Your Development Environment",permalink:"/docs/packaging/update-dev-environment"},next:{title:"Updating an Existing Package",permalink:"/docs/packaging/updating-an-existing-package"}},c={},o=[{value:"Update an existing clone",id:"update-an-existing-clone",level:3},{value:"Create a new branch",id:"create-a-new-branch",level:2},{value:"Create the MAINTAINERS.md file",id:"create-the-maintainersmd-file",level:2},{value:"Create the package.yml file",id:"create-the-packageyml-file",level:2},{value:"Build the package",id:"build-the-package",level:2},{value:"Commit your changes",id:"commit-your-changes",level:2},{value:"Commit message format for new packages",id:"commit-message-format-for-new-packages",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"creating-a-new-package",children:"Creating a New Package"})}),"\n",(0,i.jsxs)(n.p,{children:["This page will take you through the steps required to build a new package for the Solus package repositories. For this example, we will use the command line utility ",(0,i.jsx)(n.a,{href:"https://gitlab.com/OldManProgrammer/unix-tree",children:"tree"}),", which is already packaged for Solus, but we will pretend like it's not."]}),"\n",(0,i.jsxs)(n.admonition,{type:"note",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsxs)(n.strong,{children:["Please ",(0,i.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues?q=label%3A%22Package+Request%22",children:"look to see if an issue has been filed"})," and ",(0,i.jsx)(n.em,{children:"accepted"})," for the software or library you intend to package"]}),". If there is an existing request, please add a link to it in your pull request. Ex:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"This PR resolves software request https://github.com/getsolus/packages/issues/123\n"})})]}),"\n",(0,i.jsx)(n.h3,{id:"update-an-existing-clone",children:"Update an existing clone"}),"\n",(0,i.jsxs)(n.p,{children:["If you do not have a local clone set up yet, see ",(0,i.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#fork-the-getsoluspackages-repository",children:"Prepare for Packaging"})]}),"\n",(0,i.jsx)(n.p,{children:"Bring your local clone up to date. Run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd ~/solus-packages\ngit switch main\ngit pull\n"})}),"\n",(0,i.jsx)(n.h2,{id:"create-a-new-branch",children:"Create a new branch"}),"\n",(0,i.jsx)(n.p,{children:"It's always a good idea to switch to a new git branch before beginning packaging work. This helps to separate your work from any new changes made to the package repository, which will allow you to more easily rebase any changes if needed. To do so run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git switch -c your-branch\n"})}),"\n",(0,i.jsxs)(n.h2,{id:"create-the-maintainersmd-file",children:["Create the ",(0,i.jsx)(n.code,{children:"MAINTAINERS.md"})," file"]}),"\n",(0,i.jsxs)(n.p,{children:["You must add a file called ",(0,i.jsx)(n.code,{children:"MAINTAINERS.md"})," using the template in ",(0,i.jsx)(n.a,{href:"/docs/packaging/procedures/maintainership",children:"Maintainership"}),". Solus uses this to track the primary maintainer(s) for each package."]}),"\n",(0,i.jsxs)(n.h2,{id:"create-the-packageyml-file",children:["Create the ",(0,i.jsx)(n.code,{children:"package.yml"})," file"]}),"\n",(0,i.jsx)(n.p,{children:"You will need a link to the most recent source tarball for this from the software's website."}),"\n",(0,i.jsxs)(n.p,{children:["To create a skeleton ",(0,i.jsx)(n.code,{children:"package.yml"})," file, use the ",(0,i.jsx)(n.code,{children:"go-task new"})," command."]}),"\n",(0,i.jsx)(n.p,{children:"This command takes two arguments, in the following order:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Package name"}),"\n",(0,i.jsx)(n.li,{children:"Source URL"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task new -- tree https://gitlab.com/OldManProgrammer/unix-tree/-/archive/2.1.1/unix-tree-2.1.1.tar.gz\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"go-task new"})," command will automatically place the new ",(0,i.jsx)(n.code,{children:"package.yml"})," in the proper directory according the package name, ",(0,i.jsxs)(n.em,{children:["and will overwrite any existing ",(0,i.jsx)(n.code,{children:"package.yml"})," file at that location"]}),"."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["You can, of course, create your ",(0,i.jsx)(n.code,{children:"package.yml"})," file entirely from scratch, but ",(0,i.jsx)(n.code,{children:"go-task new"})," will give you a better starting point. We recommend using the ",(0,i.jsx)(n.code,{children:"go-task new"})," command."]})}),"\n",(0,i.jsxs)(n.p,{children:["Now you should have a ",(0,i.jsx)(n.code,{children:"package.yml"})," file that looks something like this:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"name : unix-tree\nversion : 2.1.1\nrelease : 1\nsource :\n - https://gitlab.com/OldManProgrammer/unix-tree/-/archive/2.1.1/unix-tree-2.1.1.tar.gz : bcd2a0327ad40592a9c43e09a4d2ef834e6f17aa9a59012a5fb1007950b5eced\nhomepage : PLEASE FILL ME IN\nlicense : GPL-2.0-or-later # CHECK ME\ncomponent : PLEASE FILL ME IN\nsummary : PLEASE FILL ME IN\ndescription: |\n PLEASE FILL ME IN\nbuilddeps :\nsetup : |\n %configure\nbuild : |\n %make\ninstall : |\n %make_install\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"go-task new"})," command has filled many fields for us, but not all of them will be right, and some of them need to be filled in. Refer to the ",(0,i.jsx)(n.a,{href:"/docs/packaging/package.yml",children:"package.yml page"})," to see how each field should be used."]}),"\n",(0,i.jsx)(n.p,{children:"For this example, we need to fix the following:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["The name needs to be ",(0,i.jsx)(n.code,{children:"tree"}),", so update it."]}),"\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.code,{children:"license"}),' is correct, so we remove the comment. License values need to match an "Identifier" in the ',(0,i.jsx)(n.a,{href:"https://spdx.org/licenses/",children:"SPDX License List"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Fill in ",(0,i.jsx)(n.code,{children:"homepage"}),", ",(0,i.jsx)(n.code,{children:"component"}),", ",(0,i.jsx)(n.code,{children:"summary"}),", and ",(0,i.jsx)(n.code,{children:"description"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Remove ",(0,i.jsx)(n.code,{children:"builddeps"}),". This package has no build dependencies beyond the ones already available for every package (the ",(0,i.jsx)(n.code,{children:"system.devel"})," packages)."]}),"\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.code,{children:"setup"})," step is not required, remove it."]}),"\n",(0,i.jsxs)(n.li,{children:["In the ",(0,i.jsx)(n.code,{children:"install"})," key, we can't use the ",(0,i.jsx)(n.code,{children:"%make_install"})," macro for this package. The files are installed in their correct locations individually."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"After updating the file, it will now look like:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"name : tree\nversion : 2.1.1\nrelease : 1\nsource :\n - https://gitlab.com/OldManProgrammer/unix-tree/-/archive/2.1.1/unix-tree-2.1.1.tar.gz : bcd2a0327ad40592a9c43e09a4d2ef834e6f17aa9a59012a5fb1007950b5eced\nhomepage : https://gitlab.com/OldManProgrammer/unix-tree\nlicense : GPL-2.0-or-later\ncomponent : system.utils\nsummary : list contents of directories in a tree-like format.\ndescription: |\n Tree is a recursive directory listing command that produces a depth indented listing of files, which is colorized ala dircolors if the LS_COLORS environment variable is set and output is to tty\nbuild : |\n %make\ninstall : |\n install -Dm00664 $workdir/doc/tree.1 $installdir/usr/share/man/man1/tree.1\n install -Dm00755 $workdir/tree $installdir/usr/bin/tree\n"})}),"\n",(0,i.jsxs)(n.p,{children:["To read more about finding and including dependencies and other parts of ",(0,i.jsx)(n.code,{children:"package.yml"})," please see ",(0,i.jsx)(n.a,{href:"/docs/packaging/packaging-practices",children:"Packaging Practices"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Understanding how to translate source code into a good ",(0,i.jsx)(n.code,{children:"package.yml"})," file is the heart of packaging. If you are stumped, or have questions, ",(0,i.jsxs)(n.strong,{children:["ask for help in our Solus Packaging room on ",(0,i.jsx)(n.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"}),"."]})]}),"\n",(0,i.jsx)(n.h2,{id:"build-the-package",children:"Build the package"}),"\n",(0,i.jsxs)(n.p,{children:["Build the package using ",(0,i.jsx)(n.code,{children:"go-task"}),". The default task will build the package against the Unstable repository, so you don't have to specify a task here."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task\n"})}),"\n",(0,i.jsx)(n.p,{children:"Once the build completes, your directory should now include the following files:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"\u251c\u2500\u2500 abi_used_libs\n\u251c\u2500\u2500 abi_used_symbols\n\u251c\u2500\u2500 package.yml\n\u251c\u2500\u2500 pspec_x86_64.xml\n\u2514\u2500\u2500 tree-2.1.1-1-1-x86_64.eopkg\n"})}),"\n",(0,i.jsxs)(n.p,{children:["All these files ",(0,i.jsx)(n.em,{children:"except"})," the ",(0,i.jsx)(n.code,{children:".eopkg"})," file(s) should be included in your pull request. You will remove the ",(0,i.jsx)(n.code,{children:".eopkg"})," files after testing the package."]}),"\n",(0,i.jsxs)(n.p,{children:["Once your package has built successfully, you will need to ",(0,i.jsx)(n.a,{href:"testing-a-package",children:"test it"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"commit-your-changes",children:"Commit your changes"}),"\n",(0,i.jsxs)(n.p,{children:["Check the ",(0,i.jsx)(n.a,{href:"git-basics#check-the-changes-in-your-files",children:"changes in your files"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"/docs/packaging/git-basics",children:"Add / remove files as necessary to the commit"}),". Then, ",(0,i.jsx)(n.strong,{children:"check your branch"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Double-check that everything looks correct and all of the files have been staged before committing."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git status\n"})}),"\n",(0,i.jsx)(n.p,{children:"If all looks well, commit your changes."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git commit\n"})}),"\n",(0,i.jsx)(n.h3,{id:"commit-message-format-for-new-packages",children:"Commit message format for new packages"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"git commit"})," on ",(0,i.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#initialize-git-hooks",children:"an initialized repository"})," will automatically open your editor with the correct template.\nNote that lines starting with a ",(0,i.jsx)(n.code,{children:"#"})," will be ignored by Git and do not need to be removed."]}),"\n",(0,i.jsx)(n.p,{children:"There should be a summary line (with the package name), a blank line, and then the rest of the commit message."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"There should at the minimum be a Summary."}),"\n",(0,i.jsx)(n.li,{children:"Bullet point lists should start with a dash."}),"\n",(0,i.jsxs)(n.li,{children:["Link the package request using a ",(0,i.jsx)(n.code,{children:"Resolves"})," line."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Here is an example in our standard format:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"tree: Add at v2.1.1\n\n**Summary**\n\nAdd the tree package, which recursively lists directories in a tree like manner.\n\nResolves getsolus/packages#issuenumber\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Where ",(0,i.jsx)(n.code,{children:"issuenumber"})," is the issue number of the package request."]}),"\n",(0,i.jsxs)(n.p,{children:["For more information on suitable commit messages, please check the ",(0,i.jsx)(n.a,{href:"https://github.com/solus-project/tooling-central/blob/master/README.rst#using-git",children:"tooling central documentation"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["If you need a change to depend on another change, mention it in the commit message too (use the full URL): ",(0,i.jsx)(n.code,{children:"Depends on https://github.com/getsolus/packages/issues/234"})]}),"\n",(0,i.jsxs)(n.p,{children:["Next, you'll ",(0,i.jsx)(n.a,{href:"/docs/packaging/submitting-a-pull-request",children:"submit a pull request for review"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,n,a)=>{a.d(n,{Z:()=>l,a:()=>r});var i=a(67294);const s={},t=i.createContext(s);function r(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3851],{44158:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>l,toc:()=>o});var i=a(85893),s=a(11151);const t={title:"Creating a New Package",summary:"Creating a Package For Inclusion in the Repositories",sidebar_position:3},r="Creating a New Package",l={id:"packaging/creating-a-new-package",title:"Creating a New Package",description:"This page will take you through the steps required to build a new package for the Solus package repositories. For this example, we will use the command line utility tree, which is already packaged for Solus, but we will pretend like it's not.",source:"@site/docs/packaging/creating-a-new-package.md",sourceDirName:"packaging",slug:"/packaging/creating-a-new-package",permalink:"/docs/packaging/creating-a-new-package",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/creating-a-new-package.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,sidebarPosition:3,frontMatter:{title:"Creating a New Package",summary:"Creating a Package For Inclusion in the Repositories",sidebar_position:3},sidebar:"packagingSidebar",previous:{title:"Update Your Development Environment",permalink:"/docs/packaging/update-dev-environment"},next:{title:"Updating an Existing Package",permalink:"/docs/packaging/updating-an-existing-package"}},c={},o=[{value:"Update an existing clone",id:"update-an-existing-clone",level:3},{value:"Create a new branch",id:"create-a-new-branch",level:2},{value:"Create the MAINTAINERS.md file",id:"create-the-maintainersmd-file",level:2},{value:"Create the package.yml file",id:"create-the-packageyml-file",level:2},{value:"Build the package",id:"build-the-package",level:2},{value:"Commit your changes",id:"commit-your-changes",level:2},{value:"Commit message format for new packages",id:"commit-message-format-for-new-packages",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"creating-a-new-package",children:"Creating a New Package"})}),"\n",(0,i.jsxs)(n.p,{children:["This page will take you through the steps required to build a new package for the Solus package repositories. For this example, we will use the command line utility ",(0,i.jsx)(n.a,{href:"https://gitlab.com/OldManProgrammer/unix-tree",children:"tree"}),", which is already packaged for Solus, but we will pretend like it's not."]}),"\n",(0,i.jsxs)(n.admonition,{type:"note",children:[(0,i.jsxs)(n.p,{children:[(0,i.jsxs)(n.strong,{children:["Please ",(0,i.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues?q=label%3A%22Package+Request%22",children:"look to see if an issue has been filed"})," and ",(0,i.jsx)(n.em,{children:"accepted"})," for the software or library you intend to package"]}),". If there is an existing request, please add a link to it in your pull request. Ex:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"This PR resolves software request https://github.com/getsolus/packages/issues/123\n"})})]}),"\n",(0,i.jsx)(n.h3,{id:"update-an-existing-clone",children:"Update an existing clone"}),"\n",(0,i.jsxs)(n.p,{children:["If you do not have a local clone set up yet, see ",(0,i.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#fork-the-getsoluspackages-repository",children:"Prepare for Packaging"})]}),"\n",(0,i.jsx)(n.p,{children:"Bring your local clone up to date. Run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd ~/solus-packages\ngit switch main\ngit pull\n"})}),"\n",(0,i.jsx)(n.h2,{id:"create-a-new-branch",children:"Create a new branch"}),"\n",(0,i.jsx)(n.p,{children:"It's always a good idea to switch to a new git branch before beginning packaging work. This helps to separate your work from any new changes made to the package repository, which will allow you to more easily rebase any changes if needed. To do so run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git switch -c your-branch\n"})}),"\n",(0,i.jsxs)(n.h2,{id:"create-the-maintainersmd-file",children:["Create the ",(0,i.jsx)(n.code,{children:"MAINTAINERS.md"})," file"]}),"\n",(0,i.jsxs)(n.p,{children:["You must add a file called ",(0,i.jsx)(n.code,{children:"MAINTAINERS.md"})," using the template in ",(0,i.jsx)(n.a,{href:"/docs/packaging/procedures/maintainership",children:"Maintainership"}),". Solus uses this to track the primary maintainer(s) for each package."]}),"\n",(0,i.jsxs)(n.h2,{id:"create-the-packageyml-file",children:["Create the ",(0,i.jsx)(n.code,{children:"package.yml"})," file"]}),"\n",(0,i.jsx)(n.p,{children:"You will need a link to the most recent source tarball for this from the software's website."}),"\n",(0,i.jsxs)(n.p,{children:["To create a skeleton ",(0,i.jsx)(n.code,{children:"package.yml"})," file, use the ",(0,i.jsx)(n.code,{children:"go-task new"})," command."]}),"\n",(0,i.jsx)(n.p,{children:"This command takes two arguments, in the following order:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Package name"}),"\n",(0,i.jsx)(n.li,{children:"Source URL"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task new -- tree https://gitlab.com/OldManProgrammer/unix-tree/-/archive/2.1.1/unix-tree-2.1.1.tar.gz\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"go-task new"})," command will automatically place the new ",(0,i.jsx)(n.code,{children:"package.yml"})," in the proper directory according the package name, ",(0,i.jsxs)(n.em,{children:["and will overwrite any existing ",(0,i.jsx)(n.code,{children:"package.yml"})," file at that location"]}),"."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["You can, of course, create your ",(0,i.jsx)(n.code,{children:"package.yml"})," file entirely from scratch, but ",(0,i.jsx)(n.code,{children:"go-task new"})," will give you a better starting point. We recommend using the ",(0,i.jsx)(n.code,{children:"go-task new"})," command."]})}),"\n",(0,i.jsxs)(n.p,{children:["Now you should have a ",(0,i.jsx)(n.code,{children:"package.yml"})," file that looks something like this:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"name : unix-tree\nversion : 2.1.1\nrelease : 1\nsource :\n - https://gitlab.com/OldManProgrammer/unix-tree/-/archive/2.1.1/unix-tree-2.1.1.tar.gz : bcd2a0327ad40592a9c43e09a4d2ef834e6f17aa9a59012a5fb1007950b5eced\nhomepage : PLEASE FILL ME IN\nlicense : GPL-2.0-or-later # CHECK ME\ncomponent : PLEASE FILL ME IN\nsummary : PLEASE FILL ME IN\ndescription: |\n PLEASE FILL ME IN\nbuilddeps :\nsetup : |\n %configure\nbuild : |\n %make\ninstall : |\n %make_install\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"go-task new"})," command has filled many fields for us, but not all of them will be right, and some of them need to be filled in. Refer to the ",(0,i.jsx)(n.a,{href:"/docs/packaging/package.yml",children:"package.yml page"})," to see how each field should be used."]}),"\n",(0,i.jsx)(n.p,{children:"For this example, we need to fix the following:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["The name needs to be ",(0,i.jsx)(n.code,{children:"tree"}),", so update it."]}),"\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.code,{children:"license"}),' is correct, so we remove the comment. License values need to match an "Identifier" in the ',(0,i.jsx)(n.a,{href:"https://spdx.org/licenses/",children:"SPDX License List"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Fill in ",(0,i.jsx)(n.code,{children:"homepage"}),", ",(0,i.jsx)(n.code,{children:"component"}),", ",(0,i.jsx)(n.code,{children:"summary"}),", and ",(0,i.jsx)(n.code,{children:"description"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Remove ",(0,i.jsx)(n.code,{children:"builddeps"}),". This package has no build dependencies beyond the ones already available for every package (the ",(0,i.jsx)(n.code,{children:"system.devel"})," packages)."]}),"\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.code,{children:"setup"})," step is not required, remove it."]}),"\n",(0,i.jsxs)(n.li,{children:["In the ",(0,i.jsx)(n.code,{children:"install"})," key, we can't use the ",(0,i.jsx)(n.code,{children:"%make_install"})," macro for this package. The files are installed in their correct locations individually."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"After updating the file, it will now look like:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"name : tree\nversion : 2.1.1\nrelease : 1\nsource :\n - https://gitlab.com/OldManProgrammer/unix-tree/-/archive/2.1.1/unix-tree-2.1.1.tar.gz : bcd2a0327ad40592a9c43e09a4d2ef834e6f17aa9a59012a5fb1007950b5eced\nhomepage : https://gitlab.com/OldManProgrammer/unix-tree\nlicense : GPL-2.0-or-later\ncomponent : system.utils\nsummary : list contents of directories in a tree-like format.\ndescription: |\n Tree is a recursive directory listing command that produces a depth indented listing of files, which is colorized ala dircolors if the LS_COLORS environment variable is set and output is to tty\nbuild : |\n %make\ninstall : |\n install -Dm00664 $workdir/doc/tree.1 $installdir/usr/share/man/man1/tree.1\n install -Dm00755 $workdir/tree $installdir/usr/bin/tree\n"})}),"\n",(0,i.jsxs)(n.p,{children:["To read more about finding and including dependencies and other parts of ",(0,i.jsx)(n.code,{children:"package.yml"})," please see ",(0,i.jsx)(n.a,{href:"/docs/packaging/packaging-practices",children:"Packaging Practices"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Understanding how to translate source code into a good ",(0,i.jsx)(n.code,{children:"package.yml"})," file is the heart of packaging. If you are stumped, or have questions, ",(0,i.jsxs)(n.strong,{children:["ask for help in our Solus Packaging room on ",(0,i.jsx)(n.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix"}),"."]})]}),"\n",(0,i.jsx)(n.h2,{id:"build-the-package",children:"Build the package"}),"\n",(0,i.jsxs)(n.p,{children:["Build the package using ",(0,i.jsx)(n.code,{children:"go-task"}),". The default task will build the package against the Unstable repository, so you don't have to specify a task here."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"go-task\n"})}),"\n",(0,i.jsx)(n.p,{children:"Once the build completes, your directory should now include the following files:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-text",children:"\u251c\u2500\u2500 abi_used_libs\n\u251c\u2500\u2500 abi_used_symbols\n\u251c\u2500\u2500 package.yml\n\u251c\u2500\u2500 pspec_x86_64.xml\n\u2514\u2500\u2500 tree-2.1.1-1-1-x86_64.eopkg\n"})}),"\n",(0,i.jsxs)(n.p,{children:["All these files ",(0,i.jsx)(n.em,{children:"except"})," the ",(0,i.jsx)(n.code,{children:".eopkg"})," file(s) should be included in your pull request. You will remove the ",(0,i.jsx)(n.code,{children:".eopkg"})," files after testing the package."]}),"\n",(0,i.jsxs)(n.p,{children:["Once your package has built successfully, you will need to ",(0,i.jsx)(n.a,{href:"testing-a-package",children:"test it"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"commit-your-changes",children:"Commit your changes"}),"\n",(0,i.jsxs)(n.p,{children:["Check the ",(0,i.jsx)(n.a,{href:"git-basics#check-the-changes-in-your-files",children:"changes in your files"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"/docs/packaging/git-basics",children:"Add / remove files as necessary to the commit"}),". Then, ",(0,i.jsx)(n.strong,{children:"check your branch"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Double-check that everything looks correct and all of the files have been staged before committing."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git status\n"})}),"\n",(0,i.jsx)(n.p,{children:"If all looks well, commit your changes."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"git commit\n"})}),"\n",(0,i.jsx)(n.h3,{id:"commit-message-format-for-new-packages",children:"Commit message format for new packages"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"git commit"})," on ",(0,i.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#initialize-git-hooks",children:"an initialized repository"})," will automatically open your editor with the correct template.\nNote that lines starting with a ",(0,i.jsx)(n.code,{children:"#"})," will be ignored by Git and do not need to be removed."]}),"\n",(0,i.jsx)(n.p,{children:"There should be a summary line (with the package name), a blank line, and then the rest of the commit message."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"There should at the minimum be a Summary."}),"\n",(0,i.jsx)(n.li,{children:"Bullet point lists should start with a dash."}),"\n",(0,i.jsxs)(n.li,{children:["Link the package request using a ",(0,i.jsx)(n.code,{children:"Resolves"})," line."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Here is an example in our standard format:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"tree: Add at v2.1.1\n\n**Summary**\n\nAdd the tree package, which recursively lists directories in a tree like manner.\n\nResolves getsolus/packages#issuenumber\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Where ",(0,i.jsx)(n.code,{children:"issuenumber"})," is the issue number of the package request."]}),"\n",(0,i.jsxs)(n.p,{children:["For more information on suitable commit messages, please check the ",(0,i.jsx)(n.a,{href:"https://github.com/solus-project/tooling-central/blob/master/README.rst#using-git",children:"tooling central documentation"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["If you need a change to depend on another change, mention it in the commit message too (use the full URL): ",(0,i.jsx)(n.code,{children:"Depends on https://github.com/getsolus/packages/issues/234"})]}),"\n",(0,i.jsxs)(n.p,{children:["Next, you'll ",(0,i.jsx)(n.a,{href:"/docs/packaging/submitting-a-pull-request",children:"submit a pull request for review"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,n,a)=>{a.d(n,{Z:()=>l,a:()=>r});var i=a(67294);const s={},t=i.createContext(s);function r(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c9c1a3f4.fbdbc69c.js b/assets/js/c9c1a3f4.86924b51.js similarity index 99% rename from assets/js/c9c1a3f4.fbdbc69c.js rename to assets/js/c9c1a3f4.86924b51.js index 4bd328d3c..a1c6115dd 100644 --- a/assets/js/c9c1a3f4.fbdbc69c.js +++ b/assets/js/c9c1a3f4.86924b51.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6121],{24080:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>r,contentTitle:()=>a,default:()=>c,frontMatter:()=>o,metadata:()=>d,toc:()=>h});var n=i(85893),s=i(11151);const o={title:"Configuration",summary:"Help for configuring the Budgie desktop on Solus"},a="Configuration",d={id:"user/editions/budgie/configuration",title:"Configuration",description:"Date and Time",source:"@site/docs/user/editions/budgie/configuration.md",sourceDirName:"user/editions/budgie",slug:"/user/editions/budgie/configuration",permalink:"/docs/user/editions/budgie/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/budgie/configuration.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Configuration",summary:"Help for configuring the Budgie desktop on Solus"},sidebar:"userSidebar",previous:{title:"Budgie",permalink:"/docs/user/editions/budgie/"},next:{title:"Tips and Tricks",permalink:"/docs/user/editions/budgie/tips-and-tricks"}},r={},h=[{value:"Date and Time",id:"date-and-time",level:2},{value:"Default Applications",id:"default-applications",level:2},{value:"Displays",id:"displays",level:2},{value:"Keyboard Layout",id:"keyboard-layout",level:2},{value:"Keyboard Layout Indicator",id:"keyboard-layout-indicator",level:3},{value:"IBus",id:"ibus",level:3},{value:"Language",id:"language",level:2},{value:"Mouse and Touchpad",id:"mouse-and-touchpad",level:2},{value:"Mouse",id:"mouse",level:3},{value:"Touchpad",id:"touchpad",level:3},{value:"Testing",id:"testing",level:3},{value:"Network",id:"network",level:2},{value:"Non-Hidden Network",id:"non-hidden-network",level:3},{value:"Hidden Network",id:"hidden-network",level:3},{value:"Sound and Sound Devices",id:"sound-and-sound-devices",level:2},{value:"Settings",id:"settings",level:3},{value:"Users",id:"users",level:2},{value:"Adding a User",id:"adding-a-user",level:3},{value:"Removing a User",id:"removing-a-user",level:3},{value:"Desktop Background",id:"desktop-background",level:2},{value:"Desktop Icons",id:"desktop-icons",level:2},{value:"Workspaces",id:"workspaces",level:2},{value:"Keyboard Shortcuts",id:"keyboard-shortcuts",level:3},{value:"Workspaces Configuration",id:"workspaces-configuration",level:3}];function l(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,n.jsx)(t.h1,{id:"system",children:"System"}),"\n",(0,n.jsx)(t.h2,{id:"date-and-time",children:"Date and Time"}),"\n",(0,n.jsx)(t.p,{children:'In Budgie, the easiest way to access the date and time settings is by left clicking on the time in the bottom panel and clicking on "System time and date settings".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Date and Time Right-Click",src:i(87872).Z+"",width:"289",height:"162"})}),"\n",(0,n.jsx)(t.p,{children:'Alternatively, you can open the Budgie Control Center, and scroll the left-hand sidebar down to the bottom to find "Date & Time".'}),"\n",(0,n.jsx)(t.p,{children:'You will be presented with the following window. From here, you can enable / disable automatic date & time, automatic time zone changing, and change between AM/PM and 24-hour time formats. Note that changing the system date & time and time zone information requires clicking the "Unlock" button at the top of the window, and entering your password.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Date and Time",src:i(73249).Z+"",width:"996",height:"702"})}),"\n",(0,n.jsx)(t.p,{children:'If you wish to change how the time is displayed in the bottom panel, open Budgie Desktop Settings from the Budgie Menu, choose the Bottom Panel from the left-hand sidebar, choose "Clock" from the list of applets in the middle, then adjust your desired settings on the right-hand side.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Clock Applet",src:i(65486).Z+"",width:"761",height:"609"})}),"\n",(0,n.jsxs)(t.p,{children:["If you want to set a custom date & time format, the ",(0,n.jsx)(t.a,{href:"https://pubs.opengroup.org/onlinepubs/9699919799/utilities/date.html",children:'"conversion specifications" referenced by the POSIX standards'})," list the options that can be entered."]}),"\n",(0,n.jsx)(t.h2,{id:"default-applications",children:"Default Applications"}),"\n",(0,n.jsx)(t.p,{children:'You can configure default applications in Budgie by opening the Budgie Control Center, and scrolling the left-hand sidebar down to "Default Applications".'}),"\n",(0,n.jsx)(t.p,{children:"The drop-down boxes here enable choosing the default application for each category of file. For most categories, you will need to have already installed alternative applications before you can change the default settings. For instance, if you wish to change the default video player from Celluloid to VLC, then you must first install VLC (available in the Software Center)."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Default Applications",src:i(74063).Z+"",width:"991",height:"697"})}),"\n",(0,n.jsx)(t.p,{children:'You can specify default applications for individual file types by right-clicking on a file and clicking on "Open With" from the popup menu, then choosing "Other Application".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Context Menu",src:i(45728).Z+"",width:"879",height:"579"})}),"\n",(0,n.jsx)(t.p,{children:'Next, select the application you wish to use from the list, then click "Set as default" below the list. Finish by clicking "OK". In the future, all files with the same file type will open with the chosen application.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Application Selection",src:i(23242).Z+"",width:"914",height:"618"})}),"\n",(0,n.jsx)(t.h2,{id:"displays",children:"Displays"}),"\n",(0,n.jsx)(t.p,{children:'You can configure your display(s) in Budgie by opening the Budgie Menu and then clicking on "Displays" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:"You will then be shown the following window."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Displays Overview",src:i(77218).Z+"",width:"742",height:"345"})}),"\n",(0,n.jsx)(t.p,{children:"Click on the individual display you wish to configure. You will now be able to select if you wish to use this monitor as the primary or secondary display, mirror it with another display, or turn it off. This window also gives you the size and aspect ratio, ability to rotate the display, and ability to change the resolution."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Individual Display Settings",src:i(27773).Z+"",width:"741",height:"365"})}),"\n",(0,n.jsx)(t.p,{children:"Going back to the Displays section, you also have the option to arrange your displays. Click the \u201cArrange Combined Displays\u201d button and then drag your displays so they are arranged to your liking."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Arrange Displays",src:i(26715).Z+"",width:"742",height:"381"})}),"\n",(0,n.jsx)(t.p,{children:'Click "Apply" once you are happy with your changes. You will be shown a message asking if the display looks OK, if it does, click on "Keep This Configuration".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Confirm Display Settings",src:i(42677).Z+"",width:"466",height:"114"})}),"\n",(0,n.jsx)(t.h2,{id:"keyboard-layout",children:"Keyboard Layout"}),"\n",(0,n.jsx)(t.p,{children:'Using Budgie, you can change your keyboard layout in the Budgie Control Center. Click on the Budgie Menu, click the System Settings icon at the bottom or "Budgie Control Center" in the application list, and then click on "Keyboard" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Keyboard Settings",src:i(12486).Z+"",width:"988",height:"695"})}),"\n",(0,n.jsx)(t.p,{children:'Click the "+" button to add an input source (keyboard layout). You will be shown the following dialog.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Add Input Source",src:i(93747).Z+"",width:"988",height:"696"})}),"\n",(0,n.jsx)(t.p,{children:'Here you can select the language and then keyboard layout within each language section. If it does not appear in this list, click the "\u22ee" button (three vertical dots). This will enable you to search for the keyboard layout you wish to use.'}),"\n",(0,n.jsx)(t.p,{children:'After choosing the keyboard layout, click the "Add" button at the top of the window. You will be brought back to the following dialog with your new keyboard layout. In the image below, we are now using English (US) and English (UK) layouts.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie New Layout Added",src:i(63730).Z+"",width:"987",height:"697"})}),"\n",(0,n.jsx)(t.p,{children:'You can remove a keyboard layout by clicking on one of the items, for instance English (UK), then clicking the "\u22ee" button, then choosing "Remove".'}),"\n",(0,n.jsxs)(t.p,{children:["If you wish to use multiple keyboard layouts, you can switch between them by using the keyboard shortcut ",(0,n.jsx)(t.code,{children:"Super + Shift + Space"}),", or by adding the Keyboard Layout Indicator applet to your Budgie panel."]}),"\n",(0,n.jsx)(t.h3,{id:"keyboard-layout-indicator",children:"Keyboard Layout Indicator"}),"\n",(0,n.jsx)(t.p,{children:'To add the Keyboard Layout Indicator to your panel, open the Budgie Desktop Settings app from the Budgie Menu, then click "Bottom Panel" on the left-hand sidebar.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Bottom Panel Settings",src:i(65486).Z+"",width:"761",height:"609"})}),"\n",(0,n.jsx)(t.p,{children:'On the right side of the window, click the "+" button next to "Add applet".'}),"\n",(0,n.jsx)(t.p,{children:'Find the Keyboard Layout Indicator entry and select it, then click "Add" at the top of the window. This will add the Keyboard Layout Indicator (to the center section by default), as shown below.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Keyboard Layout Applet",src:i(85522).Z+"",width:"1850",height:"159"})}),"\n",(0,n.jsx)(t.h3,{id:"ibus",children:"IBus"}),"\n",(0,n.jsxs)(t.p,{children:["Budgie comes with IBus ready to go straight out of the box. If you need an additional IBus IME see: ",(0,n.jsx)(t.a,{href:"/docs/user/software/localization/ibus/",children:"IBus"})]}),"\n",(0,n.jsxs)(t.p,{children:["You will now be able to switch between your keyboard layouts by using the keyboard shortcut ",(0,n.jsx)(t.code,{children:"Super + Shift + Space"})," or by using the Keyboard Layout Indicator applet."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Keyboard Layout Applet: IBus",src:i(38896).Z+"",width:"169",height:"140"})}),"\n",(0,n.jsx)(t.h2,{id:"language",children:"Language"}),"\n",(0,n.jsx)(t.p,{children:'You can change your language in Budgie by opening the Budgie Menu and then clicking on "Region and Language" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:"You will now be shown the following window. This window allows you to change your language, formatting for dates and times and the language of your keyboard."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Region and Languages",src:i(21178).Z+"",width:"742",height:"345"})}),"\n",(0,n.jsx)(t.p,{children:'Start by clicking "Language". This brings up a selection of languages to chose from.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Selecting Language",src:i(34067).Z+"",width:"742",height:"489"})}),"\n",(0,n.jsx)(t.p,{children:"If your language does not appear in the list, click the \u22ee button at the bottom (three vertical dots) to show all the available languages. You can use the search box to go directly to your choice or scroll down the list."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Language Search",src:i(74738).Z+"",width:"742",height:"489"})}),"\n",(0,n.jsxs)(t.p,{children:['Once you have selected the language you wish to use, click "Done". You ',(0,n.jsx)(t.em,{children:"may"})," need to logout and login to your computer for it to take affect."]}),"\n",(0,n.jsx)(t.h2,{id:"mouse-and-touchpad",children:"Mouse and Touchpad"}),"\n",(0,n.jsx)(t.p,{children:'You can configure the settings of your mouse and / or touchpad by opening the Budgie Menu and then clicking on "Mouse and Touchpad" in the System Settings category. You will see either settings for your mouse or trackpad, depending on the device.'}),"\n",(0,n.jsx)(t.h3,{id:"mouse",children:"Mouse"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Mouse Settings",src:i(56272).Z+"",width:"742",height:"585"})}),"\n",(0,n.jsx)(t.p,{children:"For mice, you can set:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"The primary button (usually left click) to be left or right."}),"\n",(0,n.jsx)(t.li,{children:"Mouse speed."}),"\n",(0,n.jsx)(t.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"touchpad",children:"Touchpad"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Touchpad Settings",src:i(7722).Z+"",width:"742",height:"585"})}),"\n",(0,n.jsx)(t.p,{children:"For touchpads, you can set:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"The primary button (usually left click) to be left or right."}),"\n",(0,n.jsx)(t.li,{children:"Enabling / disabling of the touchpad."}),"\n",(0,n.jsx)(t.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n",(0,n.jsx)(t.li,{children:"Touchpad speed."}),"\n",(0,n.jsx)(t.li,{children:"Enabling / disabling of Tap to Click."}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"testing",children:"Testing"}),"\n",(0,n.jsx)(t.p,{children:'You can test your settings by clicking the "Test Your Settings" button in the top right of the window.'}),"\n",(0,n.jsx)(t.h2,{id:"network",children:"Network"}),"\n",(0,n.jsx)(t.p,{children:'To configure your network settings in Budgie, start by opening the Budgie Menu and then click on "Network" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Network Overview",src:i(18399).Z+"",width:"742",height:"491"})}),"\n",(0,n.jsx)(t.p,{children:"To configure wireless, go to the Wi-Fi section. If your wireless is currently turned off, click the toggle button, leave the Network section, and go back in."}),"\n",(0,n.jsx)(t.h3,{id:"non-hidden-network",children:"Non-Hidden Network"}),"\n",(0,n.jsx)(t.p,{children:"In the WiFi section of the Network settings window, click the access point you wish to connect to."}),"\n",(0,n.jsx)(t.p,{children:'You may now be prompted to authenticate with the network. Type in your password and then click "Connect".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Network Authentication",src:i(29656).Z+"",width:"742",height:"491"})}),"\n",(0,n.jsx)(t.p,{children:"If your password is correct, you will now be authenticated with the network."}),"\n",(0,n.jsx)(t.h3,{id:"hidden-network",children:"Hidden Network"}),"\n",(0,n.jsx)(t.p,{children:"If you wish to connect to a hidden network, click \u201cConnect to Hidden Network...\u201d in the WiFi section of the Network settings window. It will show the following dialog, where you type the network name and type of security (if any)."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Hidden Network",src:i(35320).Z+"",width:"741",height:"490"})}),"\n",(0,n.jsx)(t.p,{children:"If the network is found and has a password, you will be prompted to authenticate with the network."}),"\n",(0,n.jsx)(t.h2,{id:"sound-and-sound-devices",children:"Sound and Sound Devices"}),"\n",(0,n.jsx)(t.p,{children:"To change the volume in Budgie, simply left click on the speaker icon in the system tray and drag the slider or use the plus and minus icons to reach your desired level."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Volume Control",src:i(48355).Z+"",width:"117",height:"249"})}),"\n",(0,n.jsx)(t.h3,{id:"settings",children:"Settings"}),"\n",(0,n.jsxs)(t.p,{children:["You can access sound settings via the Sound applet in Raven, the Notification and Widget Center. Open Raven, either by clicking on its icon in the far right of the system tray or using the keyboard shortcut ",(0,n.jsx)(t.code,{children:"Super + A"}),". The Sound applet allows you to enable, disable and alter input and output methods as well as providing a simple volume slider."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Raven Sound Applet",src:i(11145).Z+"",width:"299",height:"235"})}),"\n",(0,n.jsx)(t.p,{children:'You can access further sound settings, including individual application volume controls, and a simple speaker test by opening the Budgie Menu and then clicking on "Sound" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Sound Settings",src:i(20315).Z+"",width:"742",height:"495"})}),"\n",(0,n.jsx)(t.h2,{id:"users",children:"Users"}),"\n",(0,n.jsx)(t.p,{children:'To add and remove users with Budgie, start by opening the Budgie Menu and then click on "Users" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie User Settings",src:i(79964).Z+"",width:"742",height:"453"})}),"\n",(0,n.jsx)(t.p,{children:'To manage your own or other accounts, you first need to authenticate. Click the "Unlock" button in the top right corner and type your password. Note that you are required to be an administrator. If you\'re the only user on the system, then your account is an administrator by default.'}),"\n",(0,n.jsx)(t.p,{children:'In the event the password provided is correct, the "Unlock" button will change to "Add User..."'}),"\n",(0,n.jsx)(t.h3,{id:"adding-a-user",children:"Adding a User"}),"\n",(0,n.jsx)(t.p,{children:'To add a user, click the "Add User..." button in the top right corner of the Users window.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Add User Button",src:i(11494).Z+"",width:"225",height:"65"})}),"\n",(0,n.jsx)(t.p,{children:"This will open the Add User window (shown below)."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Add User Dialog",src:i(38645).Z+"",width:"466",height:"546"})}),"\n",(0,n.jsx)(t.p,{children:'Fill in the required items and then finish adding the new user by clicking "Add" in the top right corner.'}),"\n",(0,n.jsx)(t.h3,{id:"removing-a-user",children:"Removing a User"}),"\n",(0,n.jsx)(t.p,{children:'To remove a user, open the Users window and then click on the user you wish to remove. Now click on the red "Remove User..." button in the bottom right corner.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie User List",src:i(86781).Z+"",width:"742",height:"592"})}),"\n",(0,n.jsx)(t.p,{children:"Upon clicking to remove the user, you will be given the option to keep their files, delete their files, or cancel the removal of the user\u2019s account."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Keep Files Prompt",src:i(86420).Z+"",width:"508",height:"162"})}),"\n",(0,n.jsx)(t.h1,{id:"user-interface",children:"User Interface"}),"\n",(0,n.jsx)(t.h2,{id:"desktop-background",children:"Desktop Background"}),"\n",(0,n.jsx)(t.p,{children:'To change the desktop background in Budgie, open the Budgie Control Center by selecting "System Settings" from either the Budgie Menu, or by right-clicking on a blank spot on the desktop.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Desktop Right-Click Menu",src:i(99786).Z+"",width:"390",height:"253"})}),"\n",(0,n.jsx)(t.p,{children:'Once the Budgie Control Center is open, click "Background" on the left-hand sidebar.'}),"\n",(0,n.jsx)(t.p,{children:'Click one of the images displayed on the right to choose a pre-installed background image, or click "Add Picture..." in the headerbar to add one of your own image files to the available options.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Control Center Background Section",src:i(17750).Z+"",width:"1017",height:"715"})}),"\n",(0,n.jsx)(t.h2,{id:"desktop-icons",children:"Desktop Icons"}),"\n",(0,n.jsx)(t.p,{children:'Desktop Icons are enabled by default. To disable them, open the Budgie Desktop Settings app by selecting "Budgie Desktop Settings" from the Budgie Menu, or from the pop-up menu when right-clicking on a blank spot on the desktop.'}),"\n",(0,n.jsx)(t.p,{children:'In the Budgie Desktop Settings app, click "Desktop" in the left-hand sidebar - Desktop Icons is the first toggle switch on that screen.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Desktop Icons",src:i(33784).Z+"",width:"781",height:"627"})}),"\n",(0,n.jsx)(t.p,{children:"To place files on your desktop, you can either drag them directly onto the Desktop, or move the files you want to the Desktop folder within the Nemo file manager app (as shown in the image below)."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Desktop Folder",src:i(50045).Z+"",width:"820",height:"602"})}),"\n",(0,n.jsx)(t.h2,{id:"workspaces",children:"Workspaces"}),"\n",(0,n.jsx)(t.p,{children:"Budgie enables the switching of workspaces with the Workspace Switcher. You can enable workspaces in Budgie by adding the Workspace Switcher applet to your panel."}),"\n",(0,n.jsx)(t.p,{children:'To add this applet, open the Budgie Control Center by selecting "System Settings" from either the Budgie Menu, or by right-clicking on a blank spot on the desktop. Once in the Budgie Control Center, in the left-hand sidebar, select the panel to which you want to add the Workspace Switcher (choose the default Bottom Panel if you don\'t want to add more panels at this time).'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Desktop Settings Panel Section",src:i(61881).Z+"",width:"763",height:"611"})}),"\n",(0,n.jsx)(t.p,{children:'Click the + button next to "Add applet" on the right side of the window. This will open the list of available applets - scroll down until you find "Workspace Switcher", select it, and then click the \'Add\' button in the top-right of the window.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Adding Budgie Workspaces Applet",src:i(73099).Z+"",width:"761",height:"610"})}),"\n",(0,n.jsx)(t.p,{children:"You should now see your workspaces available in the main Budgie panel. Applications can be moved between workspaces by dragging and dropping their icons within the Workspace Switcher."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Workspaces",src:i(67713).Z+"",width:"1850",height:"141"})}),"\n",(0,n.jsx)(t.h3,{id:"keyboard-shortcuts",children:"Keyboard Shortcuts"}),"\n",(0,n.jsx)(t.p,{children:"Budgie provides a variety of keyboard shortcuts for workspaces."}),"\n",(0,n.jsx)(t.p,{children:'To view these shortcuts, open the Budgie Control Center app, choose the "Keyboard" section in the left-hand sidebar, then scroll down in the right part of the window to choose "Keyboard Shortcuts".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Control Center Keyboard Shortcuts",src:i(72264).Z+"",width:"995",height:"702"})}),"\n",(0,n.jsx)(t.p,{children:'Workspace shortcuts are contained in the "Navigation" section of the Keyboard Shortcuts window.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Control Center Keyboard Shortcuts Sections",src:i(7521).Z+"",width:"996",height:"699"})}),"\n",(0,n.jsx)(t.h3,{id:"workspaces-configuration",children:"Workspaces Configuration"}),"\n",(0,n.jsx)(t.p,{children:'There are 4 workspaces available in Budgie by default. To add a new workspace, click on the "+" button.'}),"\n",(0,n.jsx)(t.p,{children:"If you wish to remove or rename your workspace, right click on the desired workspace and select rename or remove."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Remove or Rename Workspaces",src:i(65893).Z+"",width:"1850",height:"187"})})]})}function c(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},11494:(e,t,i)=>{i.d(t,{Z:()=>n});const n="data:image/jpeg;base64,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"},38645:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-add-user-dialog-4a76a1d5811db1f477173c3c1fabb43a.jpg"},26715:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-arrange-displays-c6b7dca4d418eed7a79be42eabbab2d1.png"},93747:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-add-input-method-09685f6a24a0012c3d954350511f449e.jpg"},17750:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-background-08d0ef91e1aafde95ab900656618ae4b.jpg"},73249:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-date-time-2e2a41c3504dc830843f938bbd142981.jpg"},74063:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-default-applications-ba0f2bc0472afc29f3a3bfd62fff4019.jpg"},72264:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-keyboard-shortcuts-location-51ebaf6cc1a0f2d2581a35cf1b9a7116.jpg"},7521:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-keyboard-shortcuts-popup-e16d754e17feaf2519cfb56d76b95e6c.jpg"},12486:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-keyboard-c35874adf88277c7f6368628e9faab58.jpg"},73099:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-panel-add-workspace-switcher-4756fd9ee280619d8b3250bc42817117.jpg"},99786:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-desktop-blank-space-right-click-c41f4ca4d33cfcdbea6b0db8bf37e069.jpg"},65486:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-desktop-settings-bottom-panel-clock-62957b69b2028aed4498146d258826cf.jpg"},61881:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-desktop-settings-bottom-panel-4e14285d1a0df0b2b7f8ac1090064038.jpg"},33784:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-desktop-settings-desktop-section-dbeac4ca05a68e1d4aa726cc015b067c.jpg"},42677:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-display-confirm-a76d736f32f356662af758fb94f6aafc.jpg"},77218:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-displays-overview-6bbedd44653525b6c3aba838cf30349d.jpg"},27773:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-individual-display-settings-2d5ef78b2175bb97fc2e729a90ee5774.jpg"},63730:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-input-sources-multiple-dd4489d88d1d5a55afa2528664e5f908.jpg"},86420:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-keep-files-prompt-5b7532e8ea1cf62ad466bf6d2eec702f.jpg"},38896:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-keyboard-layout-applet-ibus-306635b913e0265ce1f47e1098002e0c.jpg"},85522:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-keyboard-layout-switcher-f8ab66e42e1f0f982ecb691869490507.jpg"},56272:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-mouse-settings-4652630acfe19020bb0b29d0155bf012.jpg"},86781:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-multiple-user-settings-e0957ed6affeef47726232f6fa2c22a0.jpg"},50045:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-nemo-desktop-folder-898d96b13673ff56b0d1e9bed198808e.jpg"},29656:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-network-authentication-976c81d75e055000d1146dfd8d26f45f.jpg"},35320:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-network-hidden-0567bce591f6219bb35378032a3db3e9.jpg"},18399:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-network-overview-56ca62f1ff834202f557968bddfe6ae8.jpg"},23242:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-open-with-other-deae0e7e2f5b6a1afc5f79813a668609.jpg"},45728:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-open-with-196e12963d47d150975ab06f51c54b28.jpg"},67713:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-panel-with-workspace-switcher-f5efe929dd564a1560a58ce5c108e7b1.jpg"},21178:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-region-and-languages-335dc9a1b149e6ee8b31960b2786e80f.jpg"},74738:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-selecting-language-search-0ef7ad4ad481eba3511f505c0d48dd64.png"},34067:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-selecting-language-1b584e15820bf752584efc6dd7b15aeb.png"},79964:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-single-user-settings-39514927d322f1eae5e257384a82106b.jpg"},20315:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-sound-settings-83f0c82715b44956569594953085dad1.jpg"},87872:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-system-time-and-date-popup-cdcd8a6af79f4efe8cc7d4620468d2a4.jpg"},7722:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-touchpad-settings-ee9690f056a1ed39ebddd5cd61936608.jpg"},48355:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-volume-control-cf7733bc82bb3684cc809cf0ec743cef.jpg"},65893:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-workspace-context-menu-d7ddb2b7d5c1ae6ae9e4b0c0ca4ed11f.jpg"},11145:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/raven-sound-applet-84fdb76d11a39ca554f2bc756205d35e.jpg"},11151:(e,t,i)=>{i.d(t,{Z:()=>d,a:()=>a});var n=i(67294);const s={},o=n.createContext(s);function a(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6121],{24080:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>r,contentTitle:()=>a,default:()=>c,frontMatter:()=>o,metadata:()=>d,toc:()=>h});var n=i(85893),s=i(11151);const o={title:"Configuration",summary:"Help for configuring the Budgie desktop on Solus"},a="Configuration",d={id:"user/editions/budgie/configuration",title:"Configuration",description:"Date and Time",source:"@site/docs/user/editions/budgie/configuration.md",sourceDirName:"user/editions/budgie",slug:"/user/editions/budgie/configuration",permalink:"/docs/user/editions/budgie/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/budgie/configuration.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Configuration",summary:"Help for configuring the Budgie desktop on Solus"},sidebar:"userSidebar",previous:{title:"Budgie",permalink:"/docs/user/editions/budgie/"},next:{title:"Tips and Tricks",permalink:"/docs/user/editions/budgie/tips-and-tricks"}},r={},h=[{value:"Date and Time",id:"date-and-time",level:2},{value:"Default Applications",id:"default-applications",level:2},{value:"Displays",id:"displays",level:2},{value:"Keyboard Layout",id:"keyboard-layout",level:2},{value:"Keyboard Layout Indicator",id:"keyboard-layout-indicator",level:3},{value:"IBus",id:"ibus",level:3},{value:"Language",id:"language",level:2},{value:"Mouse and Touchpad",id:"mouse-and-touchpad",level:2},{value:"Mouse",id:"mouse",level:3},{value:"Touchpad",id:"touchpad",level:3},{value:"Testing",id:"testing",level:3},{value:"Network",id:"network",level:2},{value:"Non-Hidden Network",id:"non-hidden-network",level:3},{value:"Hidden Network",id:"hidden-network",level:3},{value:"Sound and Sound Devices",id:"sound-and-sound-devices",level:2},{value:"Settings",id:"settings",level:3},{value:"Users",id:"users",level:2},{value:"Adding a User",id:"adding-a-user",level:3},{value:"Removing a User",id:"removing-a-user",level:3},{value:"Desktop Background",id:"desktop-background",level:2},{value:"Desktop Icons",id:"desktop-icons",level:2},{value:"Workspaces",id:"workspaces",level:2},{value:"Keyboard Shortcuts",id:"keyboard-shortcuts",level:3},{value:"Workspaces Configuration",id:"workspaces-configuration",level:3}];function l(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,n.jsx)(t.h1,{id:"system",children:"System"}),"\n",(0,n.jsx)(t.h2,{id:"date-and-time",children:"Date and Time"}),"\n",(0,n.jsx)(t.p,{children:'In Budgie, the easiest way to access the date and time settings is by left clicking on the time in the bottom panel and clicking on "System time and date settings".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Date and Time Right-Click",src:i(87872).Z+"",width:"289",height:"162"})}),"\n",(0,n.jsx)(t.p,{children:'Alternatively, you can open the Budgie Control Center, and scroll the left-hand sidebar down to the bottom to find "Date & Time".'}),"\n",(0,n.jsx)(t.p,{children:'You will be presented with the following window. From here, you can enable / disable automatic date & time, automatic time zone changing, and change between AM/PM and 24-hour time formats. Note that changing the system date & time and time zone information requires clicking the "Unlock" button at the top of the window, and entering your password.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Date and Time",src:i(73249).Z+"",width:"996",height:"702"})}),"\n",(0,n.jsx)(t.p,{children:'If you wish to change how the time is displayed in the bottom panel, open Budgie Desktop Settings from the Budgie Menu, choose the Bottom Panel from the left-hand sidebar, choose "Clock" from the list of applets in the middle, then adjust your desired settings on the right-hand side.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Clock Applet",src:i(65486).Z+"",width:"761",height:"609"})}),"\n",(0,n.jsxs)(t.p,{children:["If you want to set a custom date & time format, the ",(0,n.jsx)(t.a,{href:"https://pubs.opengroup.org/onlinepubs/9699919799/utilities/date.html",children:'"conversion specifications" referenced by the POSIX standards'})," list the options that can be entered."]}),"\n",(0,n.jsx)(t.h2,{id:"default-applications",children:"Default Applications"}),"\n",(0,n.jsx)(t.p,{children:'You can configure default applications in Budgie by opening the Budgie Control Center, and scrolling the left-hand sidebar down to "Default Applications".'}),"\n",(0,n.jsx)(t.p,{children:"The drop-down boxes here enable choosing the default application for each category of file. For most categories, you will need to have already installed alternative applications before you can change the default settings. For instance, if you wish to change the default video player from Celluloid to VLC, then you must first install VLC (available in the Software Center)."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Default Applications",src:i(74063).Z+"",width:"991",height:"697"})}),"\n",(0,n.jsx)(t.p,{children:'You can specify default applications for individual file types by right-clicking on a file and clicking on "Open With" from the popup menu, then choosing "Other Application".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Context Menu",src:i(45728).Z+"",width:"879",height:"579"})}),"\n",(0,n.jsx)(t.p,{children:'Next, select the application you wish to use from the list, then click "Set as default" below the list. Finish by clicking "OK". In the future, all files with the same file type will open with the chosen application.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Application Selection",src:i(23242).Z+"",width:"914",height:"618"})}),"\n",(0,n.jsx)(t.h2,{id:"displays",children:"Displays"}),"\n",(0,n.jsx)(t.p,{children:'You can configure your display(s) in Budgie by opening the Budgie Menu and then clicking on "Displays" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:"You will then be shown the following window."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Displays Overview",src:i(77218).Z+"",width:"742",height:"345"})}),"\n",(0,n.jsx)(t.p,{children:"Click on the individual display you wish to configure. You will now be able to select if you wish to use this monitor as the primary or secondary display, mirror it with another display, or turn it off. This window also gives you the size and aspect ratio, ability to rotate the display, and ability to change the resolution."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Individual Display Settings",src:i(27773).Z+"",width:"741",height:"365"})}),"\n",(0,n.jsx)(t.p,{children:"Going back to the Displays section, you also have the option to arrange your displays. Click the \u201cArrange Combined Displays\u201d button and then drag your displays so they are arranged to your liking."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Arrange Displays",src:i(26715).Z+"",width:"742",height:"381"})}),"\n",(0,n.jsx)(t.p,{children:'Click "Apply" once you are happy with your changes. You will be shown a message asking if the display looks OK, if it does, click on "Keep This Configuration".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Confirm Display Settings",src:i(42677).Z+"",width:"466",height:"114"})}),"\n",(0,n.jsx)(t.h2,{id:"keyboard-layout",children:"Keyboard Layout"}),"\n",(0,n.jsx)(t.p,{children:'Using Budgie, you can change your keyboard layout in the Budgie Control Center. Click on the Budgie Menu, click the System Settings icon at the bottom or "Budgie Control Center" in the application list, and then click on "Keyboard" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Keyboard Settings",src:i(12486).Z+"",width:"988",height:"695"})}),"\n",(0,n.jsx)(t.p,{children:'Click the "+" button to add an input source (keyboard layout). You will be shown the following dialog.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Add Input Source",src:i(93747).Z+"",width:"988",height:"696"})}),"\n",(0,n.jsx)(t.p,{children:'Here you can select the language and then keyboard layout within each language section. If it does not appear in this list, click the "\u22ee" button (three vertical dots). This will enable you to search for the keyboard layout you wish to use.'}),"\n",(0,n.jsx)(t.p,{children:'After choosing the keyboard layout, click the "Add" button at the top of the window. You will be brought back to the following dialog with your new keyboard layout. In the image below, we are now using English (US) and English (UK) layouts.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie New Layout Added",src:i(63730).Z+"",width:"987",height:"697"})}),"\n",(0,n.jsx)(t.p,{children:'You can remove a keyboard layout by clicking on one of the items, for instance English (UK), then clicking the "\u22ee" button, then choosing "Remove".'}),"\n",(0,n.jsxs)(t.p,{children:["If you wish to use multiple keyboard layouts, you can switch between them by using the keyboard shortcut ",(0,n.jsx)(t.code,{children:"Super + Shift + Space"}),", or by adding the Keyboard Layout Indicator applet to your Budgie panel."]}),"\n",(0,n.jsx)(t.h3,{id:"keyboard-layout-indicator",children:"Keyboard Layout Indicator"}),"\n",(0,n.jsx)(t.p,{children:'To add the Keyboard Layout Indicator to your panel, open the Budgie Desktop Settings app from the Budgie Menu, then click "Bottom Panel" on the left-hand sidebar.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Bottom Panel Settings",src:i(65486).Z+"",width:"761",height:"609"})}),"\n",(0,n.jsx)(t.p,{children:'On the right side of the window, click the "+" button next to "Add applet".'}),"\n",(0,n.jsx)(t.p,{children:'Find the Keyboard Layout Indicator entry and select it, then click "Add" at the top of the window. This will add the Keyboard Layout Indicator (to the center section by default), as shown below.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Keyboard Layout Applet",src:i(85522).Z+"",width:"1850",height:"159"})}),"\n",(0,n.jsx)(t.h3,{id:"ibus",children:"IBus"}),"\n",(0,n.jsxs)(t.p,{children:["Budgie comes with IBus ready to go straight out of the box. If you need an additional IBus IME see: ",(0,n.jsx)(t.a,{href:"/docs/user/software/localization/ibus/",children:"IBus"})]}),"\n",(0,n.jsxs)(t.p,{children:["You will now be able to switch between your keyboard layouts by using the keyboard shortcut ",(0,n.jsx)(t.code,{children:"Super + Shift + Space"})," or by using the Keyboard Layout Indicator applet."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Keyboard Layout Applet: IBus",src:i(38896).Z+"",width:"169",height:"140"})}),"\n",(0,n.jsx)(t.h2,{id:"language",children:"Language"}),"\n",(0,n.jsx)(t.p,{children:'You can change your language in Budgie by opening the Budgie Menu and then clicking on "Region and Language" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:"You will now be shown the following window. This window allows you to change your language, formatting for dates and times and the language of your keyboard."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Region and Languages",src:i(21178).Z+"",width:"742",height:"345"})}),"\n",(0,n.jsx)(t.p,{children:'Start by clicking "Language". This brings up a selection of languages to chose from.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Selecting Language",src:i(34067).Z+"",width:"742",height:"489"})}),"\n",(0,n.jsx)(t.p,{children:"If your language does not appear in the list, click the \u22ee button at the bottom (three vertical dots) to show all the available languages. You can use the search box to go directly to your choice or scroll down the list."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Language Search",src:i(74738).Z+"",width:"742",height:"489"})}),"\n",(0,n.jsxs)(t.p,{children:['Once you have selected the language you wish to use, click "Done". You ',(0,n.jsx)(t.em,{children:"may"})," need to logout and login to your computer for it to take affect."]}),"\n",(0,n.jsx)(t.h2,{id:"mouse-and-touchpad",children:"Mouse and Touchpad"}),"\n",(0,n.jsx)(t.p,{children:'You can configure the settings of your mouse and / or touchpad by opening the Budgie Menu and then clicking on "Mouse and Touchpad" in the System Settings category. You will see either settings for your mouse or trackpad, depending on the device.'}),"\n",(0,n.jsx)(t.h3,{id:"mouse",children:"Mouse"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Mouse Settings",src:i(56272).Z+"",width:"742",height:"585"})}),"\n",(0,n.jsx)(t.p,{children:"For mice, you can set:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"The primary button (usually left click) to be left or right."}),"\n",(0,n.jsx)(t.li,{children:"Mouse speed."}),"\n",(0,n.jsx)(t.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"touchpad",children:"Touchpad"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Touchpad Settings",src:i(7722).Z+"",width:"742",height:"585"})}),"\n",(0,n.jsx)(t.p,{children:"For touchpads, you can set:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"The primary button (usually left click) to be left or right."}),"\n",(0,n.jsx)(t.li,{children:"Enabling / disabling of the touchpad."}),"\n",(0,n.jsx)(t.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n",(0,n.jsx)(t.li,{children:"Touchpad speed."}),"\n",(0,n.jsx)(t.li,{children:"Enabling / disabling of Tap to Click."}),"\n"]}),"\n",(0,n.jsx)(t.h3,{id:"testing",children:"Testing"}),"\n",(0,n.jsx)(t.p,{children:'You can test your settings by clicking the "Test Your Settings" button in the top right of the window.'}),"\n",(0,n.jsx)(t.h2,{id:"network",children:"Network"}),"\n",(0,n.jsx)(t.p,{children:'To configure your network settings in Budgie, start by opening the Budgie Menu and then click on "Network" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Network Overview",src:i(18399).Z+"",width:"742",height:"491"})}),"\n",(0,n.jsx)(t.p,{children:"To configure wireless, go to the Wi-Fi section. If your wireless is currently turned off, click the toggle button, leave the Network section, and go back in."}),"\n",(0,n.jsx)(t.h3,{id:"non-hidden-network",children:"Non-Hidden Network"}),"\n",(0,n.jsx)(t.p,{children:"In the WiFi section of the Network settings window, click the access point you wish to connect to."}),"\n",(0,n.jsx)(t.p,{children:'You may now be prompted to authenticate with the network. Type in your password and then click "Connect".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Network Authentication",src:i(29656).Z+"",width:"742",height:"491"})}),"\n",(0,n.jsx)(t.p,{children:"If your password is correct, you will now be authenticated with the network."}),"\n",(0,n.jsx)(t.h3,{id:"hidden-network",children:"Hidden Network"}),"\n",(0,n.jsx)(t.p,{children:"If you wish to connect to a hidden network, click \u201cConnect to Hidden Network...\u201d in the WiFi section of the Network settings window. It will show the following dialog, where you type the network name and type of security (if any)."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Hidden Network",src:i(35320).Z+"",width:"741",height:"490"})}),"\n",(0,n.jsx)(t.p,{children:"If the network is found and has a password, you will be prompted to authenticate with the network."}),"\n",(0,n.jsx)(t.h2,{id:"sound-and-sound-devices",children:"Sound and Sound Devices"}),"\n",(0,n.jsx)(t.p,{children:"To change the volume in Budgie, simply left click on the speaker icon in the system tray and drag the slider or use the plus and minus icons to reach your desired level."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Volume Control",src:i(48355).Z+"",width:"117",height:"249"})}),"\n",(0,n.jsx)(t.h3,{id:"settings",children:"Settings"}),"\n",(0,n.jsxs)(t.p,{children:["You can access sound settings via the Sound applet in Raven, the Notification and Widget Center. Open Raven, either by clicking on its icon in the far right of the system tray or using the keyboard shortcut ",(0,n.jsx)(t.code,{children:"Super + A"}),". The Sound applet allows you to enable, disable and alter input and output methods as well as providing a simple volume slider."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Raven Sound Applet",src:i(11145).Z+"",width:"299",height:"235"})}),"\n",(0,n.jsx)(t.p,{children:'You can access further sound settings, including individual application volume controls, and a simple speaker test by opening the Budgie Menu and then clicking on "Sound" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Sound Settings",src:i(20315).Z+"",width:"742",height:"495"})}),"\n",(0,n.jsx)(t.h2,{id:"users",children:"Users"}),"\n",(0,n.jsx)(t.p,{children:'To add and remove users with Budgie, start by opening the Budgie Menu and then click on "Users" in the System Settings category.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie User Settings",src:i(79964).Z+"",width:"742",height:"453"})}),"\n",(0,n.jsx)(t.p,{children:'To manage your own or other accounts, you first need to authenticate. Click the "Unlock" button in the top right corner and type your password. Note that you are required to be an administrator. If you\'re the only user on the system, then your account is an administrator by default.'}),"\n",(0,n.jsx)(t.p,{children:'In the event the password provided is correct, the "Unlock" button will change to "Add User..."'}),"\n",(0,n.jsx)(t.h3,{id:"adding-a-user",children:"Adding a User"}),"\n",(0,n.jsx)(t.p,{children:'To add a user, click the "Add User..." button in the top right corner of the Users window.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Add User Button",src:i(11494).Z+"",width:"225",height:"65"})}),"\n",(0,n.jsx)(t.p,{children:"This will open the Add User window (shown below)."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Add User Dialog",src:i(38645).Z+"",width:"466",height:"546"})}),"\n",(0,n.jsx)(t.p,{children:'Fill in the required items and then finish adding the new user by clicking "Add" in the top right corner.'}),"\n",(0,n.jsx)(t.h3,{id:"removing-a-user",children:"Removing a User"}),"\n",(0,n.jsx)(t.p,{children:'To remove a user, open the Users window and then click on the user you wish to remove. Now click on the red "Remove User..." button in the bottom right corner.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie User List",src:i(86781).Z+"",width:"742",height:"592"})}),"\n",(0,n.jsx)(t.p,{children:"Upon clicking to remove the user, you will be given the option to keep their files, delete their files, or cancel the removal of the user\u2019s account."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Keep Files Prompt",src:i(86420).Z+"",width:"508",height:"162"})}),"\n",(0,n.jsx)(t.h1,{id:"user-interface",children:"User Interface"}),"\n",(0,n.jsx)(t.h2,{id:"desktop-background",children:"Desktop Background"}),"\n",(0,n.jsx)(t.p,{children:'To change the desktop background in Budgie, open the Budgie Control Center by selecting "System Settings" from either the Budgie Menu, or by right-clicking on a blank spot on the desktop.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Desktop Right-Click Menu",src:i(99786).Z+"",width:"390",height:"253"})}),"\n",(0,n.jsx)(t.p,{children:'Once the Budgie Control Center is open, click "Background" on the left-hand sidebar.'}),"\n",(0,n.jsx)(t.p,{children:'Click one of the images displayed on the right to choose a pre-installed background image, or click "Add Picture..." in the headerbar to add one of your own image files to the available options.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Control Center Background Section",src:i(17750).Z+"",width:"1017",height:"715"})}),"\n",(0,n.jsx)(t.h2,{id:"desktop-icons",children:"Desktop Icons"}),"\n",(0,n.jsx)(t.p,{children:'Desktop Icons are enabled by default. To disable them, open the Budgie Desktop Settings app by selecting "Budgie Desktop Settings" from the Budgie Menu, or from the pop-up menu when right-clicking on a blank spot on the desktop.'}),"\n",(0,n.jsx)(t.p,{children:'In the Budgie Desktop Settings app, click "Desktop" in the left-hand sidebar - Desktop Icons is the first toggle switch on that screen.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Desktop Icons",src:i(33784).Z+"",width:"781",height:"627"})}),"\n",(0,n.jsx)(t.p,{children:"To place files on your desktop, you can either drag them directly onto the Desktop, or move the files you want to the Desktop folder within the Nemo file manager app (as shown in the image below)."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Desktop Folder",src:i(50045).Z+"",width:"820",height:"602"})}),"\n",(0,n.jsx)(t.h2,{id:"workspaces",children:"Workspaces"}),"\n",(0,n.jsx)(t.p,{children:"Budgie enables the switching of workspaces with the Workspace Switcher. You can enable workspaces in Budgie by adding the Workspace Switcher applet to your panel."}),"\n",(0,n.jsx)(t.p,{children:'To add this applet, open the Budgie Control Center by selecting "System Settings" from either the Budgie Menu, or by right-clicking on a blank spot on the desktop. Once in the Budgie Control Center, in the left-hand sidebar, select the panel to which you want to add the Workspace Switcher (choose the default Bottom Panel if you don\'t want to add more panels at this time).'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Desktop Settings Panel Section",src:i(61881).Z+"",width:"763",height:"611"})}),"\n",(0,n.jsx)(t.p,{children:'Click the + button next to "Add applet" on the right side of the window. This will open the list of available applets - scroll down until you find "Workspace Switcher", select it, and then click the \'Add\' button in the top-right of the window.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Adding Budgie Workspaces Applet",src:i(73099).Z+"",width:"761",height:"610"})}),"\n",(0,n.jsx)(t.p,{children:"You should now see your workspaces available in the main Budgie panel. Applications can be moved between workspaces by dragging and dropping their icons within the Workspace Switcher."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Workspaces",src:i(67713).Z+"",width:"1850",height:"141"})}),"\n",(0,n.jsx)(t.h3,{id:"keyboard-shortcuts",children:"Keyboard Shortcuts"}),"\n",(0,n.jsx)(t.p,{children:"Budgie provides a variety of keyboard shortcuts for workspaces."}),"\n",(0,n.jsx)(t.p,{children:'To view these shortcuts, open the Budgie Control Center app, choose the "Keyboard" section in the left-hand sidebar, then scroll down in the right part of the window to choose "Keyboard Shortcuts".'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Control Center Keyboard Shortcuts",src:i(72264).Z+"",width:"995",height:"702"})}),"\n",(0,n.jsx)(t.p,{children:'Workspace shortcuts are contained in the "Navigation" section of the Keyboard Shortcuts window.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Control Center Keyboard Shortcuts Sections",src:i(7521).Z+"",width:"996",height:"699"})}),"\n",(0,n.jsx)(t.h3,{id:"workspaces-configuration",children:"Workspaces Configuration"}),"\n",(0,n.jsx)(t.p,{children:'There are 4 workspaces available in Budgie by default. To add a new workspace, click on the "+" button.'}),"\n",(0,n.jsx)(t.p,{children:"If you wish to remove or rename your workspace, right click on the desired workspace and select rename or remove."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Budgie Remove or Rename Workspaces",src:i(65893).Z+"",width:"1850",height:"187"})})]})}function c(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},11494:(e,t,i)=>{i.d(t,{Z:()=>n});const n="data:image/jpeg;base64,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"},38645:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-add-user-dialog-4a76a1d5811db1f477173c3c1fabb43a.jpg"},26715:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-arrange-displays-c6b7dca4d418eed7a79be42eabbab2d1.png"},93747:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-add-input-method-09685f6a24a0012c3d954350511f449e.jpg"},17750:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-background-08d0ef91e1aafde95ab900656618ae4b.jpg"},73249:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-date-time-2e2a41c3504dc830843f938bbd142981.jpg"},74063:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-default-applications-ba0f2bc0472afc29f3a3bfd62fff4019.jpg"},72264:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-keyboard-shortcuts-location-51ebaf6cc1a0f2d2581a35cf1b9a7116.jpg"},7521:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-keyboard-shortcuts-popup-e16d754e17feaf2519cfb56d76b95e6c.jpg"},12486:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-keyboard-c35874adf88277c7f6368628e9faab58.jpg"},73099:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-control-center-panel-add-workspace-switcher-4756fd9ee280619d8b3250bc42817117.jpg"},99786:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-desktop-blank-space-right-click-c41f4ca4d33cfcdbea6b0db8bf37e069.jpg"},65486:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-desktop-settings-bottom-panel-clock-62957b69b2028aed4498146d258826cf.jpg"},61881:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-desktop-settings-bottom-panel-4e14285d1a0df0b2b7f8ac1090064038.jpg"},33784:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-desktop-settings-desktop-section-dbeac4ca05a68e1d4aa726cc015b067c.jpg"},42677:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-display-confirm-a76d736f32f356662af758fb94f6aafc.jpg"},77218:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-displays-overview-6bbedd44653525b6c3aba838cf30349d.jpg"},27773:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-individual-display-settings-2d5ef78b2175bb97fc2e729a90ee5774.jpg"},63730:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-input-sources-multiple-dd4489d88d1d5a55afa2528664e5f908.jpg"},86420:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-keep-files-prompt-5b7532e8ea1cf62ad466bf6d2eec702f.jpg"},38896:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-keyboard-layout-applet-ibus-306635b913e0265ce1f47e1098002e0c.jpg"},85522:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-keyboard-layout-switcher-f8ab66e42e1f0f982ecb691869490507.jpg"},56272:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-mouse-settings-4652630acfe19020bb0b29d0155bf012.jpg"},86781:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-multiple-user-settings-e0957ed6affeef47726232f6fa2c22a0.jpg"},50045:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-nemo-desktop-folder-898d96b13673ff56b0d1e9bed198808e.jpg"},29656:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-network-authentication-976c81d75e055000d1146dfd8d26f45f.jpg"},35320:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-network-hidden-0567bce591f6219bb35378032a3db3e9.jpg"},18399:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-network-overview-56ca62f1ff834202f557968bddfe6ae8.jpg"},23242:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-open-with-other-deae0e7e2f5b6a1afc5f79813a668609.jpg"},45728:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-open-with-196e12963d47d150975ab06f51c54b28.jpg"},67713:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-panel-with-workspace-switcher-f5efe929dd564a1560a58ce5c108e7b1.jpg"},21178:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-region-and-languages-335dc9a1b149e6ee8b31960b2786e80f.jpg"},74738:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-selecting-language-search-0ef7ad4ad481eba3511f505c0d48dd64.png"},34067:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-selecting-language-1b584e15820bf752584efc6dd7b15aeb.png"},79964:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-single-user-settings-39514927d322f1eae5e257384a82106b.jpg"},20315:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-sound-settings-83f0c82715b44956569594953085dad1.jpg"},87872:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-system-time-and-date-popup-cdcd8a6af79f4efe8cc7d4620468d2a4.jpg"},7722:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-touchpad-settings-ee9690f056a1ed39ebddd5cd61936608.jpg"},48355:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-volume-control-cf7733bc82bb3684cc809cf0ec743cef.jpg"},65893:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/budgie-workspace-context-menu-d7ddb2b7d5c1ae6ae9e4b0c0ca4ed11f.jpg"},11145:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/raven-sound-applet-84fdb76d11a39ca554f2bc756205d35e.jpg"},11151:(e,t,i)=>{i.d(t,{Z:()=>d,a:()=>a});var n=i(67294);const s={},o=n.createContext(s);function a(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cca891e2.0b18e5be.js b/assets/js/cca891e2.62ee8e8c.js similarity index 99% rename from assets/js/cca891e2.0b18e5be.js rename to assets/js/cca891e2.62ee8e8c.js index 4b63e1678..b2cb1f66e 100644 --- a/assets/js/cca891e2.0b18e5be.js +++ b/assets/js/cca891e2.62ee8e8c.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9773],{7857:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var s=i(85893),r=i(11151);const n={title:"Package Inclusion Policy",summary:"What's needed to include packages into the repository"},o="Package Inclusion Policy",a={id:"packaging/procedures/package-inclusion",title:"Package Inclusion Policy",description:"This policy sets forth the criteria for a package to be accepted for inclusion into the Solus repositories or rejected.",source:"@site/docs/packaging/procedures/package-inclusion.md",sourceDirName:"packaging/procedures",slug:"/packaging/procedures/package-inclusion",permalink:"/docs/packaging/procedures/package-inclusion",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/package-inclusion.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Package Inclusion Policy",summary:"What's needed to include packages into the repository"},sidebar:"packagingSidebar",previous:{title:"Maintainership",permalink:"/docs/packaging/procedures/maintainership"},next:{title:"Release Processes",permalink:"/docs/packaging/procedures/release-processes"}},l={},c=[{value:"Criteria",id:"criteria",level:2},{value:"Explicitly redistributable",id:"explicitly-redistributable",level:3},{value:"Server software",id:"server-software",level:3},{value:"Software age",id:"software-age",level:3},{value:"Stack complexity",id:"stack-complexity",level:3},{value:"Value-add",id:"value-add",level:3},{value:"Rejection",id:"rejection",level:2}];function d(e){const t={a:"a",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"package-inclusion-policy",children:"Package Inclusion Policy"})}),"\n",(0,s.jsx)(t.p,{children:"This policy sets forth the criteria for a package to be accepted for inclusion into the Solus repositories or rejected."}),"\n",(0,s.jsx)(t.h2,{id:"criteria",children:"Criteria"}),"\n",(0,s.jsx)(t.h3,{id:"explicitly-redistributable",children:"Explicitly redistributable"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Software under a free software or open source software license, or license text which explicitly states that it is ",(0,s.jsx)(t.strong,{children:"permissible"})," to redistribute the software. We use the ",(0,s.jsx)(t.a,{href:"https://spdx.org/licenses/",children:"SPDX License List"}),"."]}),"\n",(0,s.jsx)(t.li,{children:"For anything that cannot be redistributed by Solus, there is the possibility for them to be provided as a Flatpak, for Third Party repository inclusion, however the Solus project is not responsible for flatpak or snap implementation of these items. These items should then fetch only at installation time, and not contain non distributable components."}),"\n",(0,s.jsx)(t.li,{children:"Solus supports both VCS (currently only git, this will expand) and traditional software sources (such as tarballs) for packages, equally."}),"\n",(0,s.jsxs)(t.li,{children:["Unless ",(0,s.jsx)(t.strong,{children:"absolutely unavoidable"}),", the sources for a package should be source, and not ",(0,s.jsx)(t.strong,{children:"binary, prebuilt"})," sources. Exceptions may be made in rare cases, such as stage1 bootstrap for a compiler, or requires custom components otherwise impossible to provide in Solus (patched libraries, etc.)"]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"server-software",children:"Server software"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Mail servers such as Postfix, Dovecot, etc, are ",(0,s.jsx)(t.strong,{children:"not"})," eligible for inclusion. Solus does not provide a server operating system."]}),"\n",(0,s.jsxs)(t.li,{children:["Web servers and database daemons ",(0,s.jsx)(t.strong,{children:"are"})," eligible for inclusion, as they facilitate web developers to work locally."]}),"\n",(0,s.jsx)(t.li,{children:"Anything outside of these may be catered to by the usage of Docker, or other container technology. Thus, container technology must be supported by Solus to support access to ancillary cases."}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"software-age",children:"Software age"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"DOA (dead-on-arrival) packages are generally rejected from Solus. However, they may be included at the discretion of the project, if they provide unique functionality."}),"\n",(0,s.jsx)(t.li,{children:"Projects with no tags/tarballs which lack traction, may be frozen until a suitable release is made. Tagging releases is an indicator for good release engineering practices."}),"\n",(0,s.jsxs)(t.li,{children:["Typically, we prefer ",(0,s.jsx)(t.strong,{children:"stable"})," tagged releases. However, this may be waived if:","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"The software has significant traction (i.e. prerelease)"}),"\n",(0,s.jsx)(t.li,{children:"A bug fix only exists beyond the latest stable release for a git source"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"stack-complexity",children:"Stack complexity"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Certain requests may tick all the boxes, but introduce a level of complexity or require a level of engagement not possible to balance for Solus Staff. Under certain situations, a request will be frozen until it has a dedicated maintainer."}),"\n",(0,s.jsx)(t.li,{children:"This extends to requests for full desktop environments. However, this does not extend to minor components like drop-in window managers or panels separate of a dependent stack (i.e. Awesome WM, tint2, etc.)"}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"value-add",children:"Value-add"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["A web wrapper which ",(0,s.jsx)(t.strong,{children:"adds value"}),", such as Discord, with the global push-to-talk shortcut, is eligible for inclusion."]}),"\n",(0,s.jsxs)(t.li,{children:["A web page wrapper, that adds ",(0,s.jsx)(t.strong,{children:"no further value"})," other than \u201cconvenient desktop shortcut\u201d or \u201ctray icon\u201d, are ",(0,s.jsx)(t.strong,{children:"not"})," eligible for inclusion. Web browsers already support desktop notifications."]}),"\n",(0,s.jsx)(t.li,{children:"If the newly requested package offers no functionality above that of an alternative already in the repositories, it will very likely be rejected. \u201cIt\u2019s pretty\u201d is never a sufficient reason."}),"\n",(0,s.jsx)(t.li,{children:"If the requested package is curated towards, or developed with the intent to work on, a specific operating system, it will very likely be rejected. This includes packages which require libraries that are built with the intent to work on a specific operating system."}),"\n",(0,s.jsxs)(t.li,{children:["Likewise, when a new package offers a better alternative to an ",(0,s.jsx)(t.strong,{children:"existing"})," package, we should look to replace the old one with the new one, to ensure the repository is always deduplicating."]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"rejection",children:"Rejection"}),"\n",(0,s.jsxs)(t.p,{children:["Solus Staff members reserve the right to permanently reject a package request without the need for further discussion once the rejection is issued. The limited time of contributors should be considered and respected, instead of dragging out and 'necromancing' old issues in a vain attempt to force inclusion of previously rejected software. In the event of any policy change, existing/expired package requests will NOT be reevaluated under new criteria as this would lead to an exponential growth in work upon every policy change, and is physically impossible to handle for a project of ",(0,s.jsx)(t.em,{children:"any"})," size."]})]})}function h(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>o});var s=i(67294);const r={},n=s.createContext(r);function o(e){const t=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9773],{7857:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var s=i(85893),r=i(11151);const n={title:"Package Inclusion Policy",summary:"What's needed to include packages into the repository"},o="Package Inclusion Policy",a={id:"packaging/procedures/package-inclusion",title:"Package Inclusion Policy",description:"This policy sets forth the criteria for a package to be accepted for inclusion into the Solus repositories or rejected.",source:"@site/docs/packaging/procedures/package-inclusion.md",sourceDirName:"packaging/procedures",slug:"/packaging/procedures/package-inclusion",permalink:"/docs/packaging/procedures/package-inclusion",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/package-inclusion.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Package Inclusion Policy",summary:"What's needed to include packages into the repository"},sidebar:"packagingSidebar",previous:{title:"Maintainership",permalink:"/docs/packaging/procedures/maintainership"},next:{title:"Release Processes",permalink:"/docs/packaging/procedures/release-processes"}},l={},c=[{value:"Criteria",id:"criteria",level:2},{value:"Explicitly redistributable",id:"explicitly-redistributable",level:3},{value:"Server software",id:"server-software",level:3},{value:"Software age",id:"software-age",level:3},{value:"Stack complexity",id:"stack-complexity",level:3},{value:"Value-add",id:"value-add",level:3},{value:"Rejection",id:"rejection",level:2}];function d(e){const t={a:"a",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"package-inclusion-policy",children:"Package Inclusion Policy"})}),"\n",(0,s.jsx)(t.p,{children:"This policy sets forth the criteria for a package to be accepted for inclusion into the Solus repositories or rejected."}),"\n",(0,s.jsx)(t.h2,{id:"criteria",children:"Criteria"}),"\n",(0,s.jsx)(t.h3,{id:"explicitly-redistributable",children:"Explicitly redistributable"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Software under a free software or open source software license, or license text which explicitly states that it is ",(0,s.jsx)(t.strong,{children:"permissible"})," to redistribute the software. We use the ",(0,s.jsx)(t.a,{href:"https://spdx.org/licenses/",children:"SPDX License List"}),"."]}),"\n",(0,s.jsx)(t.li,{children:"For anything that cannot be redistributed by Solus, there is the possibility for them to be provided as a Flatpak, for Third Party repository inclusion, however the Solus project is not responsible for flatpak or snap implementation of these items. These items should then fetch only at installation time, and not contain non distributable components."}),"\n",(0,s.jsx)(t.li,{children:"Solus supports both VCS (currently only git, this will expand) and traditional software sources (such as tarballs) for packages, equally."}),"\n",(0,s.jsxs)(t.li,{children:["Unless ",(0,s.jsx)(t.strong,{children:"absolutely unavoidable"}),", the sources for a package should be source, and not ",(0,s.jsx)(t.strong,{children:"binary, prebuilt"})," sources. Exceptions may be made in rare cases, such as stage1 bootstrap for a compiler, or requires custom components otherwise impossible to provide in Solus (patched libraries, etc.)"]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"server-software",children:"Server software"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Mail servers such as Postfix, Dovecot, etc, are ",(0,s.jsx)(t.strong,{children:"not"})," eligible for inclusion. Solus does not provide a server operating system."]}),"\n",(0,s.jsxs)(t.li,{children:["Web servers and database daemons ",(0,s.jsx)(t.strong,{children:"are"})," eligible for inclusion, as they facilitate web developers to work locally."]}),"\n",(0,s.jsx)(t.li,{children:"Anything outside of these may be catered to by the usage of Docker, or other container technology. Thus, container technology must be supported by Solus to support access to ancillary cases."}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"software-age",children:"Software age"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"DOA (dead-on-arrival) packages are generally rejected from Solus. However, they may be included at the discretion of the project, if they provide unique functionality."}),"\n",(0,s.jsx)(t.li,{children:"Projects with no tags/tarballs which lack traction, may be frozen until a suitable release is made. Tagging releases is an indicator for good release engineering practices."}),"\n",(0,s.jsxs)(t.li,{children:["Typically, we prefer ",(0,s.jsx)(t.strong,{children:"stable"})," tagged releases. However, this may be waived if:","\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"The software has significant traction (i.e. prerelease)"}),"\n",(0,s.jsx)(t.li,{children:"A bug fix only exists beyond the latest stable release for a git source"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"stack-complexity",children:"Stack complexity"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Certain requests may tick all the boxes, but introduce a level of complexity or require a level of engagement not possible to balance for Solus Staff. Under certain situations, a request will be frozen until it has a dedicated maintainer."}),"\n",(0,s.jsx)(t.li,{children:"This extends to requests for full desktop environments. However, this does not extend to minor components like drop-in window managers or panels separate of a dependent stack (i.e. Awesome WM, tint2, etc.)"}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"value-add",children:"Value-add"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["A web wrapper which ",(0,s.jsx)(t.strong,{children:"adds value"}),", such as Discord, with the global push-to-talk shortcut, is eligible for inclusion."]}),"\n",(0,s.jsxs)(t.li,{children:["A web page wrapper, that adds ",(0,s.jsx)(t.strong,{children:"no further value"})," other than \u201cconvenient desktop shortcut\u201d or \u201ctray icon\u201d, are ",(0,s.jsx)(t.strong,{children:"not"})," eligible for inclusion. Web browsers already support desktop notifications."]}),"\n",(0,s.jsx)(t.li,{children:"If the newly requested package offers no functionality above that of an alternative already in the repositories, it will very likely be rejected. \u201cIt\u2019s pretty\u201d is never a sufficient reason."}),"\n",(0,s.jsx)(t.li,{children:"If the requested package is curated towards, or developed with the intent to work on, a specific operating system, it will very likely be rejected. This includes packages which require libraries that are built with the intent to work on a specific operating system."}),"\n",(0,s.jsxs)(t.li,{children:["Likewise, when a new package offers a better alternative to an ",(0,s.jsx)(t.strong,{children:"existing"})," package, we should look to replace the old one with the new one, to ensure the repository is always deduplicating."]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"rejection",children:"Rejection"}),"\n",(0,s.jsxs)(t.p,{children:["Solus Staff members reserve the right to permanently reject a package request without the need for further discussion once the rejection is issued. The limited time of contributors should be considered and respected, instead of dragging out and 'necromancing' old issues in a vain attempt to force inclusion of previously rejected software. In the event of any policy change, existing/expired package requests will NOT be reevaluated under new criteria as this would lead to an exponential growth in work upon every policy change, and is physically impossible to handle for a project of ",(0,s.jsx)(t.em,{children:"any"})," size."]})]})}function h(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},11151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>o});var s=i(67294);const r={},n=s.createContext(r);function o(e){const t=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ce4855c1.731f708b.js b/assets/js/ce4855c1.2ba31148.js similarity index 98% rename from assets/js/ce4855c1.731f708b.js rename to assets/js/ce4855c1.2ba31148.js index ca31e7c23..cf99ec20b 100644 --- a/assets/js/ce4855c1.731f708b.js +++ b/assets/js/ce4855c1.2ba31148.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3440],{66855:(n,e,t)=>{t.r(e),t.d(e,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=t(85893),i=t(11151);const r={title:"Translation instructions",summary:"Instructions for translators"},o="Translation instructions",a={id:"packaging/translation-instructions",title:"Translation instructions",description:'Users will arrive here from the "Translation instructions" link on Transifex.',source:"@site/docs/packaging/translation-instructions.md",sourceDirName:"packaging",slug:"/packaging/translation-instructions",permalink:"/docs/packaging/translation-instructions",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/translation-instructions.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Translation instructions",summary:"Instructions for translators"},sidebar:"packagingSidebar",previous:{title:"Rebuilding a stack",permalink:"/docs/packaging/stack-rebuilds"},next:{title:"Troubleshooting for Packagers",permalink:"/docs/packaging/troubleshooting-packaging"}},c={},l=[{value:"Project specific instructions",id:"project-specific-instructions",level:2},{value:"Solus Mate Transition Tool",id:"solus-mate-transition-tool",level:3}];function u(n){const e={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,i.a)(),...n.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.header,{children:(0,s.jsx)(e.h1,{id:"translation-instructions",children:"Translation instructions"})}),"\n",(0,s.jsx)(e.p,{children:'Users will arrive here from the "Translation instructions" link on Transifex.'}),"\n",(0,s.jsxs)(e.p,{children:["Please join our ",(0,s.jsx)(e.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix rooms"})," if you have questions about our translation projects."]}),"\n",(0,s.jsx)(e.h2,{id:"project-specific-instructions",children:"Project specific instructions"}),"\n",(0,s.jsx)(e.h3,{id:"solus-mate-transition-tool",children:"Solus Mate Transition Tool"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.a,{href:"https://app.transifex.com/solus/solus-mate-transition-tool/",children:"Transifex project link"})}),"\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsxs)(e.li,{children:["Strings which include curly braces ",(0,s.jsx)(e.code,{children:"{ }"})," should be translated leaving the curly braces, ",(0,s.jsx)(e.em,{children:"and anything inside the braces"}),", untouched."]}),"\n",(0,s.jsxs)(e.li,{children:["Examples:","\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"{DE} Successfully installed, please reboot to continue."})," translates to:"]}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.code,{children:"{DE} Instalado exitosamente, reinicie para continuar."})}),"\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"Successfully Installed {}"})," translates to:"]}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.code,{children:"Instalado exitosamente {}"})}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(e.li,{children:["Do not translate the following strings; leave them untouched:","\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.code,{children:"Packagekit"})}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.code,{children:"XDG_SESSION_DESKTOP"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(e.li,{children:"If a string includes a new-line character, be sure to include it in the same place in the translation."}),"\n"]})]})}function d(n={}){const{wrapper:e}={...(0,i.a)(),...n.components};return e?(0,s.jsx)(e,{...n,children:(0,s.jsx)(u,{...n})}):u(n)}},11151:(n,e,t)=>{t.d(e,{Z:()=>a,a:()=>o});var s=t(67294);const i={},r=s.createContext(i);function o(n){const e=s.useContext(r);return s.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function a(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(i):n.components||i:o(n.components),s.createElement(r.Provider,{value:e},n.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3440],{66855:(n,e,t)=>{t.r(e),t.d(e,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=t(85893),i=t(11151);const r={title:"Translation instructions",summary:"Instructions for translators"},o="Translation instructions",a={id:"packaging/translation-instructions",title:"Translation instructions",description:'Users will arrive here from the "Translation instructions" link on Transifex.',source:"@site/docs/packaging/translation-instructions.md",sourceDirName:"packaging",slug:"/packaging/translation-instructions",permalink:"/docs/packaging/translation-instructions",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/translation-instructions.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Translation instructions",summary:"Instructions for translators"},sidebar:"packagingSidebar",previous:{title:"Rebuilding a stack",permalink:"/docs/packaging/stack-rebuilds"},next:{title:"Troubleshooting for Packagers",permalink:"/docs/packaging/troubleshooting-packaging"}},c={},l=[{value:"Project specific instructions",id:"project-specific-instructions",level:2},{value:"Solus Mate Transition Tool",id:"solus-mate-transition-tool",level:3}];function u(n){const e={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,i.a)(),...n.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.header,{children:(0,s.jsx)(e.h1,{id:"translation-instructions",children:"Translation instructions"})}),"\n",(0,s.jsx)(e.p,{children:'Users will arrive here from the "Translation instructions" link on Transifex.'}),"\n",(0,s.jsxs)(e.p,{children:["Please join our ",(0,s.jsx)(e.a,{href:"/docs/user/contributing/getting-involved#matrix-chat",children:"Matrix rooms"})," if you have questions about our translation projects."]}),"\n",(0,s.jsx)(e.h2,{id:"project-specific-instructions",children:"Project specific instructions"}),"\n",(0,s.jsx)(e.h3,{id:"solus-mate-transition-tool",children:"Solus Mate Transition Tool"}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.a,{href:"https://app.transifex.com/solus/solus-mate-transition-tool/",children:"Transifex project link"})}),"\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsxs)(e.li,{children:["Strings which include curly braces ",(0,s.jsx)(e.code,{children:"{ }"})," should be translated leaving the curly braces, ",(0,s.jsx)(e.em,{children:"and anything inside the braces"}),", untouched."]}),"\n",(0,s.jsxs)(e.li,{children:["Examples:","\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"{DE} Successfully installed, please reboot to continue."})," translates to:"]}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.code,{children:"{DE} Instalado exitosamente, reinicie para continuar."})}),"\n",(0,s.jsxs)(e.li,{children:[(0,s.jsx)(e.code,{children:"Successfully Installed {}"})," translates to:"]}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.code,{children:"Instalado exitosamente {}"})}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(e.li,{children:["Do not translate the following strings; leave them untouched:","\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.code,{children:"Packagekit"})}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.code,{children:"XDG_SESSION_DESKTOP"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(e.li,{children:"If a string includes a new-line character, be sure to include it in the same place in the translation."}),"\n"]})]})}function d(n={}){const{wrapper:e}={...(0,i.a)(),...n.components};return e?(0,s.jsx)(e,{...n,children:(0,s.jsx)(u,{...n})}):u(n)}},11151:(n,e,t)=>{t.d(e,{Z:()=>a,a:()=>o});var s=t(67294);const i={},r=s.createContext(i);function o(n){const e=s.useContext(r);return s.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function a(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(i):n.components||i:o(n.components),s.createElement(r.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/cec10a63.fc9527ff.js b/assets/js/cec10a63.af6f885d.js similarity index 99% rename from assets/js/cec10a63.fc9527ff.js rename to assets/js/cec10a63.af6f885d.js index 8c57fa33b..87ea0a615 100644 --- a/assets/js/cec10a63.fc9527ff.js +++ b/assets/js/cec10a63.af6f885d.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8422],{96928:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var t=n(85893),i=n(11151);const r={title:"Configuration",summary:"Learn how to customize and configure the Plasma Desktop on Solus."},o="Configuration",l={id:"user/editions/plasma/configuration",title:"Configuration",description:"Opening System Settings",source:"@site/docs/user/editions/plasma/configuration.md",sourceDirName:"user/editions/plasma",slug:"/user/editions/plasma/configuration",permalink:"/docs/user/editions/plasma/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/plasma/configuration.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Configuration",summary:"Learn how to customize and configure the Plasma Desktop on Solus."},sidebar:"userSidebar",previous:{title:"Plasma",permalink:"/docs/user/editions/plasma/"},next:{title:"Tips and Tricks",permalink:"/docs/user/editions/plasma/tips-and-tricks"}},d={},c=[{value:"Opening System Settings",id:"opening-system-settings",level:2},{value:"Date and time",id:"date-and-time",level:2},{value:"Default Applications",id:"default-applications",level:2},{value:"Configuring default applications from System Settings",id:"configuring-default-applications-from-system-settings",level:3},{value:"Configuring default applications from the file manager",id:"configuring-default-applications-from-the-file-manager",level:3},{value:"Displays",id:"displays",level:2},{value:"Keyboard layout",id:"keyboard-layout",level:2},{value:"Configuring keyboard layouts",id:"configuring-keyboard-layouts",level:3},{value:"Using IBus",id:"using-ibus",level:3},{value:"Mouse and touchpad",id:"mouse-and-touchpad",level:2},{value:"Network settings",id:"network-settings",level:2},{value:"Connecting to a hidden Wi-Fi network",id:"connecting-to-a-hidden-wi-fi-network",level:3},{value:"Sound and sound devices",id:"sound-and-sound-devices",level:2},{value:"Users",id:"users",level:2},{value:"Adding user accounts",id:"adding-user-accounts",level:3},{value:"Removing user accounts",id:"removing-user-accounts",level:3},{value:"User interface",id:"user-interface",level:2},{value:"Customizing the desktop",id:"customizing-the-desktop",level:3},{value:"Virtual desktops",id:"virtual-desktops",level:2},{value:"Creating virtual desktops",id:"creating-virtual-desktops",level:3},{value:"Switching between virtual desktops",id:"switching-between-virtual-desktops",level:3}];function a(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,t.jsx)(s.h2,{id:"opening-system-settings",children:"Opening System Settings"}),"\n",(0,t.jsx)(s.p,{children:"You can open the system settings in Solus Plasma using any of the following methods:"}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Method"}),(0,t.jsx)(s.th,{children:"Description"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Application menu"}),(0,t.jsxs)(s.td,{children:["Open the application menu and go to ",(0,t.jsx)(s.strong,{children:"Settings"})," > ",(0,t.jsx)(s.strong,{children:"System Settings"})]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"KRunner"}),(0,t.jsxs)(s.td,{children:["Press ",(0,t.jsx)(s.code,{children:"Alt + F2"})," or ",(0,t.jsx)(s.code,{children:"Alt + Space"}),", type ",(0,t.jsx)(s.code,{children:"systemsettings"}),", and press Enter"]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Terminal"}),(0,t.jsxs)(s.td,{children:["Open a terminal window and execute ",(0,t.jsx)(s.code,{children:"systemsettings"})]})]})]})]}),"\n",(0,t.jsx)(s.h2,{id:"date-and-time",children:"Date and time"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Personalization"})," > ",(0,t.jsx)(s.strong,{children:"Regional Settings"})," > ",(0,t.jsx)(s.strong,{children:"Date and Time"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["Configure the date and time of your system.","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["If you want Solus to set the date and time automatically, select ",(0,t.jsx)(s.strong,{children:"Set date and time automatically"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["If you want to set the date and time manually, clear the ",(0,t.jsx)(s.strong,{children:"Set date and time automatically"})," checkbox, then use the available controls.\n",(0,t.jsx)(s.img,{alt:"Plasma date and time settings",src:n(46488).Z+"",width:"1022",height:"730"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["(Optional) Configure the time zone of your system.","\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Time Zone"})," tab."]}),"\n",(0,t.jsx)(s.li,{children:"Select a time zone from the list."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["(Optional) Customize how the time and date display in the bottom panel.","\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsx)(s.li,{children:"Right-click the digital clock widget on the bottom panel."}),"\n",(0,t.jsxs)(s.li,{children:["Select ",(0,t.jsx)(s.strong,{children:"Configure Digital Clock..."})]}),"\n",(0,t.jsx)(s.li,{children:"Configure the available settings as needed."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"default-applications",children:"Default Applications"}),"\n",(0,t.jsx)(s.h3,{id:"configuring-default-applications-from-system-settings",children:"Configuring default applications from System Settings"}),"\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Personalization"})," > ",(0,t.jsx)(s.strong,{children:"Applications"})," > ",(0,t.jsx)(s.strong,{children:"Default Applications"}),", then use the menus to select your preferred default applications."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Default applications",src:n(74995).Z+"",width:"1022",height:"731"})}),"\n",(0,t.jsx)(s.h3,{id:"configuring-default-applications-from-the-file-manager",children:"Configuring default applications from the file manager"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Open Dolphin."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Navigate to the folder that contains the file you want to open."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Right-click the file."}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Context menu",src:n(9501).Z+"",width:"714",height:"456"})}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Go to ",(0,t.jsx)(s.strong,{children:"Open With"})," > ",(0,t.jsx)(s.strong,{children:"Other Application"}),"."]}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Choose Application"})," dialog appears."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Choose the application you want to use from the list."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Select ",(0,t.jsx)(s.strong,{children:"Remember application association for all files of type [file type]"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Choose application dialog",src:n(65400).Z+"",width:"373",height:"571"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"displays",children:"Displays"}),"\n",(0,t.jsx)(s.admonition,{type:"tip",children:(0,t.jsxs)(s.p,{children:["Press ",(0,t.jsx)(s.code,{children:"Super + P"})," to access the screen layout settings."]})}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Hardware"})," > ",(0,t.jsx)(s.strong,{children:"Display and Monitor"})," > ",(0,t.jsx)(s.strong,{children:"Display Configuration"}),"."]}),"\n",(0,t.jsx)(s.li,{children:"Select the display you want to configure."}),"\n",(0,t.jsxs)(s.li,{children:["Configure the available settings as needed.\n",(0,t.jsx)(s.img,{alt:"Screen settings available in Solus Plasma",src:n(56304).Z+"",width:"1021",height:"763"})]}),"\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"}),"."]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"keyboard-layout",children:"Keyboard layout"}),"\n",(0,t.jsx)(s.h3,{id:"configuring-keyboard-layouts",children:"Configuring keyboard layouts"}),"\n",(0,t.jsx)(s.admonition,{title:"Important",type:"caution",children:(0,t.jsxs)(s.p,{children:["If you need to input languages that do not use Latin characters (for example, Chinese or Japanese), ",(0,t.jsx)(s.a,{href:"#using-ibus",children:"use IBus instead"}),"."]})}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Input Devices"})," > ",(0,t.jsx)(s.strong,{children:"Keyboard"})," > ",(0,t.jsx)(s.strong,{children:"Layouts"}),"."]}),"\n",(0,t.jsxs)(s.p,{children:["The layouts screen appears.\n",(0,t.jsx)(s.img,{alt:"Keyboard layouts",src:n(52570).Z+"",width:"743",height:"728"})]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Select ",(0,t.jsx)(s.strong,{children:"Configure layouts"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Configure keyboard layouts as you need."}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["To add a keyboard layout click ",(0,t.jsx)(s.strong,{children:"Add"}),", select a layout from the list, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["To remove a keyboard layout select a layout from the list and click ",(0,t.jsx)(s.strong,{children:"Remove"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["To order the list of keyboard layouts, select a layout from the list, then use the ",(0,t.jsx)(s.strong,{children:"Move Up"})," and ",(0,t.jsx)(s.strong,{children:"Move Down"})," buttons to reorder the list."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Configure a keyboard shortcut to switch between layouts by using the options under ",(0,t.jsx)(s.strong,{children:"Shortcuts for Switching Layout"}),"."]}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["To use the default shortcuts Solus Plasma provides, use the ",(0,t.jsx)(s.strong,{children:"Main shortcuts"})," and ",(0,t.jsx)(s.strong,{children:"3rd level shortcuts"})," options."]}),"\n",(0,t.jsxs)(s.li,{children:["To use a custom shortcut, use the ",(0,t.jsx)(s.strong,{children:"Alternative shortcut"})," option."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"using-ibus",children:"Using IBus"}),"\n",(0,t.jsx)(s.p,{children:"Solus Plasma includes IBus installed by default. However, you need to enable and integrate IBus with Plasma before usage."}),"\n",(0,t.jsx)(s.admonition,{title:"Important",type:"caution",children:(0,t.jsxs)(s.p,{children:["Using IBus overrides the configuration in the ",(0,t.jsx)(s.strong,{children:"Layouts"})," section of ",(0,t.jsx)(s.strong,{children:"System Settings"})]})}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Open the ",(0,t.jsx)(s.code,{children:"/home/[username]/.bashrc"})," file with a text editor."]}),"\n",(0,t.jsx)(s.li,{children:"Add the following lines at the end of the file."}),"\n"]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"export GTK_IM_MODULE=ibus\nexport QT_IM_MODULE=ibus\nexport XMODIFIERS=@im=ibus\n"})}),"\n",(0,t.jsxs)(s.ol,{start:"3",children:["\n",(0,t.jsx)(s.li,{children:"Save the file."}),"\n",(0,t.jsxs)(s.li,{children:["Configure IBus to autostart.","\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Workspace"})," > ",(0,t.jsx)(s.strong,{children:"Startup and Shutdown"})," > ",(0,t.jsx)(s.strong,{children:"Autostart"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Add"}),", then ",(0,t.jsx)(s.strong,{children:"Add Application"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["In the search box, enter ",(0,t.jsx)(s.code,{children:"ibus-daemon -rxR"})," and press ",(0,t.jsx)(s.strong,{children:"OK"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.li,{children:"Log out from your session, then log in again."}),"\n",(0,t.jsxs)(s.li,{children:["Configure keyboard layouts as you need.","\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Open ",(0,t.jsx)(s.strong,{children:"IBus Preferences"})," from the application launcher."]}),"\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.strong,{children:"Input Method"})," tab, add the keyboard layout you need."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.admonition,{title:"Important",type:"caution",children:(0,t.jsxs)(s.p,{children:["Some keyboard layouts require ",(0,t.jsx)(s.a,{href:"/docs/user/software/localization/ibus",children:"installing additional packages"}),"."]})}),"\n",(0,t.jsx)(s.h2,{id:"mouse-and-touchpad",children:"Mouse and touchpad"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to the appropriate configuration screen:","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["To configure the mouse, go to ",(0,t.jsx)(s.strong,{children:"Input Devices"})," > ",(0,t.jsx)(s.strong,{children:"Mouse"}),".\n",(0,t.jsx)(s.img,{alt:"Mouse settings",src:n(70080).Z+"",width:"749",height:"343"})]}),"\n",(0,t.jsxs)(s.li,{children:["To configure the touchpad, go to ",(0,t.jsx)(s.strong,{children:"Input Devices"})," > ",(0,t.jsx)(s.strong,{children:"Touchpad"}),".\n",(0,t.jsx)(s.img,{alt:"Touchpad settings",src:n(95387).Z+"",width:"748",height:"591"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.li,{children:"Configure the available settings as needed."}),"\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"}),"."]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"network-settings",children:"Network settings"}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Networks"})," widget on the bottom panel allows you to perform frequent networking tasks, such as connecting to a Wi-Fi network or enabling airplane mode."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Networks widget",src:n(80253).Z+"",width:"460",height:"489"})}),"\n",(0,t.jsx)(s.h3,{id:"connecting-to-a-hidden-wi-fi-network",children:"Connecting to a hidden Wi-Fi network"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.strong,{children:"System Settings"})," screen, go to ",(0,t.jsx)(s.strong,{children:"Network"})," > ",(0,t.jsx)(s.strong,{children:"Connections"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click the ",(0,t.jsx)(s.strong,{children:"Add new connection"})," icon (+)."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Select ",(0,t.jsx)(s.strong,{children:"Wi-Fi"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Create"}),"."]}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"New Connection"})," window appears.\n",(0,t.jsx)(s.img,{alt:"New connection settings",src:n(98991).Z+"",width:"651",height:"656"})]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.strong,{children:"Wi-Fi"})," tab, specify the name (SSID) and basic network settings."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.strong,{children:"Wi-Fi Security"})," tab, configure the password or other authentication settings."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Use the ",(0,t.jsx)(s.strong,{children:"IPv4"}),", ",(0,t.jsx)(s.strong,{children:"IPv6"})," and ",(0,t.jsx)(s.strong,{children:"General configuration"})," tabs to configure additional settings, such as DNS servers."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Save"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"sound-and-sound-devices",children:"Sound and sound devices"}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Audio Volume widget",src:n(14781).Z+"",width:"497",height:"489"})}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Audio Volume"})," widget on the bottom panel allows you to perform the following tasks:"]}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Task"}),(0,t.jsx)(s.th,{children:"Description"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Select the active output device"}),(0,t.jsx)(s.td,{children:"Select any of the available output devices to change the active output device of your system."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Select the active input device"}),(0,t.jsx)(s.td,{children:"Select any of the available input devices to change the active input device of your system."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Control the volume of a device"}),(0,t.jsx)(s.td,{children:"Use the sliders to adjust the master volume of an input/output device."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Adjust the volume for a specific app"}),(0,t.jsxs)(s.td,{children:["The ",(0,t.jsx)(s.strong,{children:"Volume"})," tab allows you to control the volume for a specific application."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Open the audio settings"}),(0,t.jsxs)(s.td,{children:["Click the ",(0,t.jsx)(s.strong,{children:"Configure Audio Devices"})," button to open the audio configuration screen in System Settings."]})]})]})]}),"\n",(0,t.jsx)(s.h2,{id:"users",children:"Users"}),"\n",(0,t.jsx)(s.h3,{id:"adding-user-accounts",children:"Adding user accounts"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Personalization"})," > ",(0,t.jsx)(s.strong,{children:"Users"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Add New User"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Configure the necessary settings."}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Add user account",src:n(69367).Z+"",width:"752",height:"731"})}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Create"})]}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Authentication Required"})," window appears."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Specify your user password and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"removing-user-accounts",children:"Removing user accounts"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Personalization"})," > ",(0,t.jsx)(s.strong,{children:"Users"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Select an account from the user list."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Delete User"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["To delete the the user account files, select ",(0,t.jsx)(s.strong,{children:"Delete files"}),"; to keep the files for posterior use, select ",(0,t.jsx)(s.strong,{children:"Keep files"}),"."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Keep or delete user files",src:n(49300).Z+"",width:"671",height:"525"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"user-interface",children:"User interface"}),"\n",(0,t.jsx)(s.h3,{id:"customizing-the-desktop",children:"Customizing the desktop"}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Desktop Settings"})," screen allows you to customize various aspects of your desktop, such as the wallpaper and the desktop icons. To open ",(0,t.jsx)(s.strong,{children:"Desktop Settings"})," screen, right-click anywhere on the desktop and select ",(0,t.jsx)(s.strong,{children:"Configure Desktop and Wallpaper..."}),"."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Desktop context menu",src:n(53004).Z+"",width:"537",height:"355"})}),"\n",(0,t.jsxs)(s.p,{children:["The following table describes how to customize the desktop using the ",(0,t.jsx)(s.strong,{children:"Desktop Folder Settings"})," screen."]}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Section"}),(0,t.jsx)(s.th,{children:"Description"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Change the wallpaper"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Wallpaper"})," section, choose an image from the list, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Hide the desktop icons"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Wallpaper"})," section, change ",(0,t.jsx)(s.strong,{children:"Layout"})," to ",(0,t.jsx)(s.strong,{children:"Desktop"}),", and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Configure mouse gestures"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Mouse Actions"})," section to setup mouse gestures."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Change the folder displayed on the desktop"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Location"})," section, select a location in your system, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Change the appearance of the desktop icons"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Icons"})," section, configure the necessary settings, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Display only specific files in the desktop"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Filter"})," section,configure the necessary settings, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]})]})]}),"\n",(0,t.jsx)(s.admonition,{type:"info",children:(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.strong,{children:"Icons"})," and ",(0,t.jsx)(s.strong,{children:"Location"})," are only available when the desktop layout is set to ",(0,t.jsx)(s.strong,{children:"Folder View"}),"."]})}),"\n",(0,t.jsx)(s.h2,{id:"virtual-desktops",children:"Virtual desktops"}),"\n",(0,t.jsx)(s.p,{children:"Plasma allows you to have multiple desktops on your computer."}),"\n",(0,t.jsx)(s.p,{children:"Virtual desktops are helpful to keep tasks organized and avoid clutter. For example, you could have one virtual desktop for work, one for school, and one for personal use."}),"\n",(0,t.jsx)(s.p,{children:"Plasma arranges virtual desktops in a grid. You can configure the rows of the grid to suit your needs."}),"\n",(0,t.jsx)(s.admonition,{type:"note",children:(0,t.jsx)(s.p,{children:"Solus Plasma has one virtual desktop and one row by default."})}),"\n",(0,t.jsx)(s.h3,{id:"creating-virtual-desktops",children:"Creating virtual desktops"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Workspace"})," > ",(0,t.jsx)(s.strong,{children:"Workspace Behavior"})," > ",(0,t.jsx)(s.strong,{children:"Virtual Desktops"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Define the number of rows in the grid."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Create a new virtual desktop."}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Add"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["(Optional) Click the ",(0,t.jsx)(s.strong,{children:"Rename"})," button to change the name of the virtual desktop."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Repeat the previous step to add multiple virtual desktops."}),"\n",(0,t.jsx)(s.admonition,{type:"caution",children:(0,t.jsx)(s.p,{children:"Plasma arranges the desktops by the rows automatically."})}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"(Optional) Configure the behavior of the virtual desktops."}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Navigation wraps around"}),": Lets you cycle through your virtual desktops in a loop using keyboard shortcuts or mouse gestures."]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Show animation when switching"}),": Displays animations when switching between virtual desktops."]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Show on-screen display when switching"}),": Displays the name of the current desktop when switching between desktops."]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Show desktop layout indicators"}),": Displays the virtual desktop grid when you switch between desktops."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.admonition,{type:"tip",children:(0,t.jsxs)(s.p,{children:["Plasma displays the virtual desktop grid next to the application launcher button.\n",(0,t.jsx)(s.img,{alt:"Virtual desktop grid",src:n(86582).Z+"",width:"375",height:"325"})]})}),"\n",(0,t.jsx)(s.h3,{id:"switching-between-virtual-desktops",children:"Switching between virtual desktops"}),"\n",(0,t.jsx)(s.p,{children:"The following table outlines the methods to change between desktops in Solus Plasma."}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Method"}),(0,t.jsx)(s.th,{children:"Description"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Using the applet in the bottom panel"}),(0,t.jsx)(s.td,{children:"Use the the virtual desktop grid next to the application launcher button to change between your virtual desktops."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Using mouse gestures"}),(0,t.jsx)(s.td,{children:"Move the mouse pointer anywhere in the desktop, then move the mouse wheel to change between your virtual desktops."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Using keyboard shortcuts"}),(0,t.jsxs)(s.td,{children:["Open System Settings, go to ",(0,t.jsx)(s.strong,{children:"Workspace"})," > ",(0,t.jsx)(s.strong,{children:"Shortcuts"})," > ",(0,t.jsx)(s.strong,{children:"KWin"}),", then search for ",(0,t.jsx)(s.code,{children:"desktop"})," to see the available keyboard shortcuts to switch between virtual desktops"]})]})]})]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Keyboard shortcuts to switch between desktops",src:n(79834).Z+"",width:"1150",height:"859"})}),"\n",(0,t.jsx)(s.admonition,{type:"note",children:(0,t.jsx)(s.p,{children:"Some of the keyboard shortcuts are disabled by default."})})]})}function h(e={}){const{wrapper:s}={...(0,i.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},69367:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/add-user-account-1e83f41522d5b43ae2f29250e52bb758.png"},14781:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/audio-widget-48a0e65d8e699ad8ca493a1e2dfcfb10.png"},65400:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/choose-application-f3747627db0cff378d7192b6c7b253f0.png"},46488:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/date-time-9e18cbfa859270a81d6973cab14ae1b6.png"},74995:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/default-apps-screen-3da638bbc4ab452b8242fb718543a132.png"},53004:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/desktop-context-menu-2a7196d846dab6acdff78dacb64b3fd6.png"},9501:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/file-context-menu-default-app-0816ad4ab5c64beeef9817dad6cbaeb7.png"},49300:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/keep-delete-files-9a5622ed38b6dd5a1002312f0a7a01cd.png"},52570:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/keyboard-layouts-468ec6547841069b372a81ef4120a67b.png"},70080:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/mouse-settings-0ec1470b23397d7d0aba492f1f4806fe.png"},80253:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/networks-widget-5446dcc803349c7a20e445393930a00a.png"},98991:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/new-wifi-network-b1c4e7f299993318ae998c66b217fa69.png"},56304:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/screen-configuration-2fd6ef5f5d7a1d590ae67d553f6f58c9.png"},79834:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/switch-desktop-shortcut-list-8b9812e81259bd41b56730a22d11728b.png"},95387:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/touchpad-settings-71fa3d9caf82f2103b978f12bf73a5be.png"},86582:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/vd-grid-bb98a6b6492fe334b36271eac65b4acb.png"},11151:(e,s,n)=>{n.d(s,{Z:()=>l,a:()=>o});var t=n(67294);const i={},r=t.createContext(i);function o(e){const s=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8422],{96928:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var t=n(85893),i=n(11151);const r={title:"Configuration",summary:"Learn how to customize and configure the Plasma Desktop on Solus."},o="Configuration",l={id:"user/editions/plasma/configuration",title:"Configuration",description:"Opening System Settings",source:"@site/docs/user/editions/plasma/configuration.md",sourceDirName:"user/editions/plasma",slug:"/user/editions/plasma/configuration",permalink:"/docs/user/editions/plasma/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/plasma/configuration.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Configuration",summary:"Learn how to customize and configure the Plasma Desktop on Solus."},sidebar:"userSidebar",previous:{title:"Plasma",permalink:"/docs/user/editions/plasma/"},next:{title:"Tips and Tricks",permalink:"/docs/user/editions/plasma/tips-and-tricks"}},d={},c=[{value:"Opening System Settings",id:"opening-system-settings",level:2},{value:"Date and time",id:"date-and-time",level:2},{value:"Default Applications",id:"default-applications",level:2},{value:"Configuring default applications from System Settings",id:"configuring-default-applications-from-system-settings",level:3},{value:"Configuring default applications from the file manager",id:"configuring-default-applications-from-the-file-manager",level:3},{value:"Displays",id:"displays",level:2},{value:"Keyboard layout",id:"keyboard-layout",level:2},{value:"Configuring keyboard layouts",id:"configuring-keyboard-layouts",level:3},{value:"Using IBus",id:"using-ibus",level:3},{value:"Mouse and touchpad",id:"mouse-and-touchpad",level:2},{value:"Network settings",id:"network-settings",level:2},{value:"Connecting to a hidden Wi-Fi network",id:"connecting-to-a-hidden-wi-fi-network",level:3},{value:"Sound and sound devices",id:"sound-and-sound-devices",level:2},{value:"Users",id:"users",level:2},{value:"Adding user accounts",id:"adding-user-accounts",level:3},{value:"Removing user accounts",id:"removing-user-accounts",level:3},{value:"User interface",id:"user-interface",level:2},{value:"Customizing the desktop",id:"customizing-the-desktop",level:3},{value:"Virtual desktops",id:"virtual-desktops",level:2},{value:"Creating virtual desktops",id:"creating-virtual-desktops",level:3},{value:"Switching between virtual desktops",id:"switching-between-virtual-desktops",level:3}];function a(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,t.jsx)(s.h2,{id:"opening-system-settings",children:"Opening System Settings"}),"\n",(0,t.jsx)(s.p,{children:"You can open the system settings in Solus Plasma using any of the following methods:"}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Method"}),(0,t.jsx)(s.th,{children:"Description"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Application menu"}),(0,t.jsxs)(s.td,{children:["Open the application menu and go to ",(0,t.jsx)(s.strong,{children:"Settings"})," > ",(0,t.jsx)(s.strong,{children:"System Settings"})]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"KRunner"}),(0,t.jsxs)(s.td,{children:["Press ",(0,t.jsx)(s.code,{children:"Alt + F2"})," or ",(0,t.jsx)(s.code,{children:"Alt + Space"}),", type ",(0,t.jsx)(s.code,{children:"systemsettings"}),", and press Enter"]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Terminal"}),(0,t.jsxs)(s.td,{children:["Open a terminal window and execute ",(0,t.jsx)(s.code,{children:"systemsettings"})]})]})]})]}),"\n",(0,t.jsx)(s.h2,{id:"date-and-time",children:"Date and time"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Personalization"})," > ",(0,t.jsx)(s.strong,{children:"Regional Settings"})," > ",(0,t.jsx)(s.strong,{children:"Date and Time"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["Configure the date and time of your system.","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["If you want Solus to set the date and time automatically, select ",(0,t.jsx)(s.strong,{children:"Set date and time automatically"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["If you want to set the date and time manually, clear the ",(0,t.jsx)(s.strong,{children:"Set date and time automatically"})," checkbox, then use the available controls.\n",(0,t.jsx)(s.img,{alt:"Plasma date and time settings",src:n(46488).Z+"",width:"1022",height:"730"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["(Optional) Configure the time zone of your system.","\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Time Zone"})," tab."]}),"\n",(0,t.jsx)(s.li,{children:"Select a time zone from the list."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["(Optional) Customize how the time and date display in the bottom panel.","\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsx)(s.li,{children:"Right-click the digital clock widget on the bottom panel."}),"\n",(0,t.jsxs)(s.li,{children:["Select ",(0,t.jsx)(s.strong,{children:"Configure Digital Clock..."})]}),"\n",(0,t.jsx)(s.li,{children:"Configure the available settings as needed."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"default-applications",children:"Default Applications"}),"\n",(0,t.jsx)(s.h3,{id:"configuring-default-applications-from-system-settings",children:"Configuring default applications from System Settings"}),"\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Personalization"})," > ",(0,t.jsx)(s.strong,{children:"Applications"})," > ",(0,t.jsx)(s.strong,{children:"Default Applications"}),", then use the menus to select your preferred default applications."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Default applications",src:n(74995).Z+"",width:"1022",height:"731"})}),"\n",(0,t.jsx)(s.h3,{id:"configuring-default-applications-from-the-file-manager",children:"Configuring default applications from the file manager"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Open Dolphin."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Navigate to the folder that contains the file you want to open."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Right-click the file."}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Context menu",src:n(9501).Z+"",width:"714",height:"456"})}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Go to ",(0,t.jsx)(s.strong,{children:"Open With"})," > ",(0,t.jsx)(s.strong,{children:"Other Application"}),"."]}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Choose Application"})," dialog appears."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Choose the application you want to use from the list."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Select ",(0,t.jsx)(s.strong,{children:"Remember application association for all files of type [file type]"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Choose application dialog",src:n(65400).Z+"",width:"373",height:"571"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"displays",children:"Displays"}),"\n",(0,t.jsx)(s.admonition,{type:"tip",children:(0,t.jsxs)(s.p,{children:["Press ",(0,t.jsx)(s.code,{children:"Super + P"})," to access the screen layout settings."]})}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Hardware"})," > ",(0,t.jsx)(s.strong,{children:"Display and Monitor"})," > ",(0,t.jsx)(s.strong,{children:"Display Configuration"}),"."]}),"\n",(0,t.jsx)(s.li,{children:"Select the display you want to configure."}),"\n",(0,t.jsxs)(s.li,{children:["Configure the available settings as needed.\n",(0,t.jsx)(s.img,{alt:"Screen settings available in Solus Plasma",src:n(56304).Z+"",width:"1021",height:"763"})]}),"\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"}),"."]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"keyboard-layout",children:"Keyboard layout"}),"\n",(0,t.jsx)(s.h3,{id:"configuring-keyboard-layouts",children:"Configuring keyboard layouts"}),"\n",(0,t.jsx)(s.admonition,{title:"Important",type:"caution",children:(0,t.jsxs)(s.p,{children:["If you need to input languages that do not use Latin characters (for example, Chinese or Japanese), ",(0,t.jsx)(s.a,{href:"#using-ibus",children:"use IBus instead"}),"."]})}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Input Devices"})," > ",(0,t.jsx)(s.strong,{children:"Keyboard"})," > ",(0,t.jsx)(s.strong,{children:"Layouts"}),"."]}),"\n",(0,t.jsxs)(s.p,{children:["The layouts screen appears.\n",(0,t.jsx)(s.img,{alt:"Keyboard layouts",src:n(52570).Z+"",width:"743",height:"728"})]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Select ",(0,t.jsx)(s.strong,{children:"Configure layouts"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Configure keyboard layouts as you need."}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["To add a keyboard layout click ",(0,t.jsx)(s.strong,{children:"Add"}),", select a layout from the list, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["To remove a keyboard layout select a layout from the list and click ",(0,t.jsx)(s.strong,{children:"Remove"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["To order the list of keyboard layouts, select a layout from the list, then use the ",(0,t.jsx)(s.strong,{children:"Move Up"})," and ",(0,t.jsx)(s.strong,{children:"Move Down"})," buttons to reorder the list."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Configure a keyboard shortcut to switch between layouts by using the options under ",(0,t.jsx)(s.strong,{children:"Shortcuts for Switching Layout"}),"."]}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["To use the default shortcuts Solus Plasma provides, use the ",(0,t.jsx)(s.strong,{children:"Main shortcuts"})," and ",(0,t.jsx)(s.strong,{children:"3rd level shortcuts"})," options."]}),"\n",(0,t.jsxs)(s.li,{children:["To use a custom shortcut, use the ",(0,t.jsx)(s.strong,{children:"Alternative shortcut"})," option."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"using-ibus",children:"Using IBus"}),"\n",(0,t.jsx)(s.p,{children:"Solus Plasma includes IBus installed by default. However, you need to enable and integrate IBus with Plasma before usage."}),"\n",(0,t.jsx)(s.admonition,{title:"Important",type:"caution",children:(0,t.jsxs)(s.p,{children:["Using IBus overrides the configuration in the ",(0,t.jsx)(s.strong,{children:"Layouts"})," section of ",(0,t.jsx)(s.strong,{children:"System Settings"})]})}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Open the ",(0,t.jsx)(s.code,{children:"/home/[username]/.bashrc"})," file with a text editor."]}),"\n",(0,t.jsx)(s.li,{children:"Add the following lines at the end of the file."}),"\n"]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"export GTK_IM_MODULE=ibus\nexport QT_IM_MODULE=ibus\nexport XMODIFIERS=@im=ibus\n"})}),"\n",(0,t.jsxs)(s.ol,{start:"3",children:["\n",(0,t.jsx)(s.li,{children:"Save the file."}),"\n",(0,t.jsxs)(s.li,{children:["Configure IBus to autostart.","\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Workspace"})," > ",(0,t.jsx)(s.strong,{children:"Startup and Shutdown"})," > ",(0,t.jsx)(s.strong,{children:"Autostart"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Add"}),", then ",(0,t.jsx)(s.strong,{children:"Add Application"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["In the search box, enter ",(0,t.jsx)(s.code,{children:"ibus-daemon -rxR"})," and press ",(0,t.jsx)(s.strong,{children:"OK"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.li,{children:"Log out from your session, then log in again."}),"\n",(0,t.jsxs)(s.li,{children:["Configure keyboard layouts as you need.","\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Open ",(0,t.jsx)(s.strong,{children:"IBus Preferences"})," from the application launcher."]}),"\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.strong,{children:"Input Method"})," tab, add the keyboard layout you need."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.admonition,{title:"Important",type:"caution",children:(0,t.jsxs)(s.p,{children:["Some keyboard layouts require ",(0,t.jsx)(s.a,{href:"/docs/user/software/localization/ibus",children:"installing additional packages"}),"."]})}),"\n",(0,t.jsx)(s.h2,{id:"mouse-and-touchpad",children:"Mouse and touchpad"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to the appropriate configuration screen:","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["To configure the mouse, go to ",(0,t.jsx)(s.strong,{children:"Input Devices"})," > ",(0,t.jsx)(s.strong,{children:"Mouse"}),".\n",(0,t.jsx)(s.img,{alt:"Mouse settings",src:n(70080).Z+"",width:"749",height:"343"})]}),"\n",(0,t.jsxs)(s.li,{children:["To configure the touchpad, go to ",(0,t.jsx)(s.strong,{children:"Input Devices"})," > ",(0,t.jsx)(s.strong,{children:"Touchpad"}),".\n",(0,t.jsx)(s.img,{alt:"Touchpad settings",src:n(95387).Z+"",width:"748",height:"591"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.li,{children:"Configure the available settings as needed."}),"\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"}),"."]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"network-settings",children:"Network settings"}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Networks"})," widget on the bottom panel allows you to perform frequent networking tasks, such as connecting to a Wi-Fi network or enabling airplane mode."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Networks widget",src:n(80253).Z+"",width:"460",height:"489"})}),"\n",(0,t.jsx)(s.h3,{id:"connecting-to-a-hidden-wi-fi-network",children:"Connecting to a hidden Wi-Fi network"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.strong,{children:"System Settings"})," screen, go to ",(0,t.jsx)(s.strong,{children:"Network"})," > ",(0,t.jsx)(s.strong,{children:"Connections"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click the ",(0,t.jsx)(s.strong,{children:"Add new connection"})," icon (+)."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Select ",(0,t.jsx)(s.strong,{children:"Wi-Fi"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Create"}),"."]}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"New Connection"})," window appears.\n",(0,t.jsx)(s.img,{alt:"New connection settings",src:n(98991).Z+"",width:"651",height:"656"})]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.strong,{children:"Wi-Fi"})," tab, specify the name (SSID) and basic network settings."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.strong,{children:"Wi-Fi Security"})," tab, configure the password or other authentication settings."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Use the ",(0,t.jsx)(s.strong,{children:"IPv4"}),", ",(0,t.jsx)(s.strong,{children:"IPv6"})," and ",(0,t.jsx)(s.strong,{children:"General configuration"})," tabs to configure additional settings, such as DNS servers."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Save"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"sound-and-sound-devices",children:"Sound and sound devices"}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Audio Volume widget",src:n(14781).Z+"",width:"497",height:"489"})}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Audio Volume"})," widget on the bottom panel allows you to perform the following tasks:"]}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Task"}),(0,t.jsx)(s.th,{children:"Description"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Select the active output device"}),(0,t.jsx)(s.td,{children:"Select any of the available output devices to change the active output device of your system."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Select the active input device"}),(0,t.jsx)(s.td,{children:"Select any of the available input devices to change the active input device of your system."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Control the volume of a device"}),(0,t.jsx)(s.td,{children:"Use the sliders to adjust the master volume of an input/output device."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Adjust the volume for a specific app"}),(0,t.jsxs)(s.td,{children:["The ",(0,t.jsx)(s.strong,{children:"Volume"})," tab allows you to control the volume for a specific application."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Open the audio settings"}),(0,t.jsxs)(s.td,{children:["Click the ",(0,t.jsx)(s.strong,{children:"Configure Audio Devices"})," button to open the audio configuration screen in System Settings."]})]})]})]}),"\n",(0,t.jsx)(s.h2,{id:"users",children:"Users"}),"\n",(0,t.jsx)(s.h3,{id:"adding-user-accounts",children:"Adding user accounts"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Personalization"})," > ",(0,t.jsx)(s.strong,{children:"Users"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Add New User"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Configure the necessary settings."}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Add user account",src:n(69367).Z+"",width:"752",height:"731"})}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Create"})]}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Authentication Required"})," window appears."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Specify your user password and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"removing-user-accounts",children:"Removing user accounts"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Personalization"})," > ",(0,t.jsx)(s.strong,{children:"Users"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Select an account from the user list."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Delete User"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["To delete the the user account files, select ",(0,t.jsx)(s.strong,{children:"Delete files"}),"; to keep the files for posterior use, select ",(0,t.jsx)(s.strong,{children:"Keep files"}),"."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Keep or delete user files",src:n(49300).Z+"",width:"671",height:"525"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"user-interface",children:"User interface"}),"\n",(0,t.jsx)(s.h3,{id:"customizing-the-desktop",children:"Customizing the desktop"}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.strong,{children:"Desktop Settings"})," screen allows you to customize various aspects of your desktop, such as the wallpaper and the desktop icons. To open ",(0,t.jsx)(s.strong,{children:"Desktop Settings"})," screen, right-click anywhere on the desktop and select ",(0,t.jsx)(s.strong,{children:"Configure Desktop and Wallpaper..."}),"."]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Desktop context menu",src:n(53004).Z+"",width:"537",height:"355"})}),"\n",(0,t.jsxs)(s.p,{children:["The following table describes how to customize the desktop using the ",(0,t.jsx)(s.strong,{children:"Desktop Folder Settings"})," screen."]}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Section"}),(0,t.jsx)(s.th,{children:"Description"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Change the wallpaper"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Wallpaper"})," section, choose an image from the list, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Hide the desktop icons"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Wallpaper"})," section, change ",(0,t.jsx)(s.strong,{children:"Layout"})," to ",(0,t.jsx)(s.strong,{children:"Desktop"}),", and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Configure mouse gestures"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Mouse Actions"})," section to setup mouse gestures."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Change the folder displayed on the desktop"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Location"})," section, select a location in your system, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Change the appearance of the desktop icons"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Icons"})," section, configure the necessary settings, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Display only specific files in the desktop"}),(0,t.jsxs)(s.td,{children:["Go to the ",(0,t.jsx)(s.strong,{children:"Filter"})," section,configure the necessary settings, and click ",(0,t.jsx)(s.strong,{children:"OK"}),"."]})]})]})]}),"\n",(0,t.jsx)(s.admonition,{type:"info",children:(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.strong,{children:"Icons"})," and ",(0,t.jsx)(s.strong,{children:"Location"})," are only available when the desktop layout is set to ",(0,t.jsx)(s.strong,{children:"Folder View"}),"."]})}),"\n",(0,t.jsx)(s.h2,{id:"virtual-desktops",children:"Virtual desktops"}),"\n",(0,t.jsx)(s.p,{children:"Plasma allows you to have multiple desktops on your computer."}),"\n",(0,t.jsx)(s.p,{children:"Virtual desktops are helpful to keep tasks organized and avoid clutter. For example, you could have one virtual desktop for work, one for school, and one for personal use."}),"\n",(0,t.jsx)(s.p,{children:"Plasma arranges virtual desktops in a grid. You can configure the rows of the grid to suit your needs."}),"\n",(0,t.jsx)(s.admonition,{type:"note",children:(0,t.jsx)(s.p,{children:"Solus Plasma has one virtual desktop and one row by default."})}),"\n",(0,t.jsx)(s.h3,{id:"creating-virtual-desktops",children:"Creating virtual desktops"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["In the ",(0,t.jsx)(s.a,{href:"#opening-system-settings",children:(0,t.jsx)(s.strong,{children:"System Settings"})})," screen, go to ",(0,t.jsx)(s.strong,{children:"Workspace"})," > ",(0,t.jsx)(s.strong,{children:"Workspace Behavior"})," > ",(0,t.jsx)(s.strong,{children:"Virtual Desktops"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Define the number of rows in the grid."}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Create a new virtual desktop."}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Click ",(0,t.jsx)(s.strong,{children:"Add"}),"."]}),"\n",(0,t.jsxs)(s.li,{children:["(Optional) Click the ",(0,t.jsx)(s.strong,{children:"Rename"})," button to change the name of the virtual desktop."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"Repeat the previous step to add multiple virtual desktops."}),"\n",(0,t.jsx)(s.admonition,{type:"caution",children:(0,t.jsx)(s.p,{children:"Plasma arranges the desktops by the rows automatically."})}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsx)(s.p,{children:"(Optional) Configure the behavior of the virtual desktops."}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Navigation wraps around"}),": Lets you cycle through your virtual desktops in a loop using keyboard shortcuts or mouse gestures."]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Show animation when switching"}),": Displays animations when switching between virtual desktops."]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Show on-screen display when switching"}),": Displays the name of the current desktop when switching between desktops."]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Show desktop layout indicators"}),": Displays the virtual desktop grid when you switch between desktops."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["\n",(0,t.jsxs)(s.p,{children:["Click ",(0,t.jsx)(s.strong,{children:"Apply"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.admonition,{type:"tip",children:(0,t.jsxs)(s.p,{children:["Plasma displays the virtual desktop grid next to the application launcher button.\n",(0,t.jsx)(s.img,{alt:"Virtual desktop grid",src:n(86582).Z+"",width:"375",height:"325"})]})}),"\n",(0,t.jsx)(s.h3,{id:"switching-between-virtual-desktops",children:"Switching between virtual desktops"}),"\n",(0,t.jsx)(s.p,{children:"The following table outlines the methods to change between desktops in Solus Plasma."}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Method"}),(0,t.jsx)(s.th,{children:"Description"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Using the applet in the bottom panel"}),(0,t.jsx)(s.td,{children:"Use the the virtual desktop grid next to the application launcher button to change between your virtual desktops."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Using mouse gestures"}),(0,t.jsx)(s.td,{children:"Move the mouse pointer anywhere in the desktop, then move the mouse wheel to change between your virtual desktops."})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Using keyboard shortcuts"}),(0,t.jsxs)(s.td,{children:["Open System Settings, go to ",(0,t.jsx)(s.strong,{children:"Workspace"})," > ",(0,t.jsx)(s.strong,{children:"Shortcuts"})," > ",(0,t.jsx)(s.strong,{children:"KWin"}),", then search for ",(0,t.jsx)(s.code,{children:"desktop"})," to see the available keyboard shortcuts to switch between virtual desktops"]})]})]})]}),"\n",(0,t.jsx)(s.p,{children:(0,t.jsx)(s.img,{alt:"Keyboard shortcuts to switch between desktops",src:n(79834).Z+"",width:"1150",height:"859"})}),"\n",(0,t.jsx)(s.admonition,{type:"note",children:(0,t.jsx)(s.p,{children:"Some of the keyboard shortcuts are disabled by default."})})]})}function h(e={}){const{wrapper:s}={...(0,i.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},69367:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/add-user-account-1e83f41522d5b43ae2f29250e52bb758.png"},14781:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/audio-widget-48a0e65d8e699ad8ca493a1e2dfcfb10.png"},65400:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/choose-application-f3747627db0cff378d7192b6c7b253f0.png"},46488:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/date-time-9e18cbfa859270a81d6973cab14ae1b6.png"},74995:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/default-apps-screen-3da638bbc4ab452b8242fb718543a132.png"},53004:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/desktop-context-menu-2a7196d846dab6acdff78dacb64b3fd6.png"},9501:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/file-context-menu-default-app-0816ad4ab5c64beeef9817dad6cbaeb7.png"},49300:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/keep-delete-files-9a5622ed38b6dd5a1002312f0a7a01cd.png"},52570:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/keyboard-layouts-468ec6547841069b372a81ef4120a67b.png"},70080:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/mouse-settings-0ec1470b23397d7d0aba492f1f4806fe.png"},80253:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/networks-widget-5446dcc803349c7a20e445393930a00a.png"},98991:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/new-wifi-network-b1c4e7f299993318ae998c66b217fa69.png"},56304:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/screen-configuration-2fd6ef5f5d7a1d590ae67d553f6f58c9.png"},79834:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/switch-desktop-shortcut-list-8b9812e81259bd41b56730a22d11728b.png"},95387:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/touchpad-settings-71fa3d9caf82f2103b978f12bf73a5be.png"},86582:(e,s,n)=>{n.d(s,{Z:()=>t});const t=n.p+"assets/images/vd-grid-bb98a6b6492fe334b36271eac65b4acb.png"},11151:(e,s,n)=>{n.d(s,{Z:()=>l,a:()=>o});var t=n(67294);const i={},r=t.createContext(i);function o(e){const s=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d00f7e62.ec65eead.js b/assets/js/d00f7e62.5566e19e.js similarity index 99% rename from assets/js/d00f7e62.ec65eead.js rename to assets/js/d00f7e62.5566e19e.js index cf2bc642a..24a75eb29 100644 --- a/assets/js/d00f7e62.ec65eead.js +++ b/assets/js/d00f7e62.5566e19e.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[255],{67868:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>r,toc:()=>l});var o=a(85893),t=a(11151);const s={title:"Your First Package Update",summary:"An example of how to build a package that exists in the Solus repos for new packagers."},i="Your First Package Update",r={id:"packaging/your-first-package-update",title:"Your First Package Update",description:"This page will guide you through the steps required to build your first package. This is really a test to make sure that your build environment is set up correctly. You will clone an existing package, build it, then install it, and finally remove it.",source:"@site/docs/packaging/your-first-package-update.md",sourceDirName:"packaging",slug:"/packaging/your-first-package-update",permalink:"/docs/packaging/your-first-package-update",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/your-first-package-update.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Your First Package Update",summary:"An example of how to build a package that exists in the Solus repos for new packagers."},sidebar:"packagingSidebar",previous:{title:"Troubleshooting for Packagers",permalink:"/docs/packaging/troubleshooting-packaging"}},c={},l=[{value:"Cloning and building nano",id:"cloning-and-building-nano",level:2},{value:"Installing your new nano package",id:"installing-your-new-nano-package",level:2},{value:"Returning to the repository version (optional)",id:"returning-to-the-repository-version-optional",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"your-first-package-update",children:"Your First Package Update"})}),"\n",(0,o.jsxs)(n.p,{children:["This page will guide you through the steps required to build your first package. This is really a test to make sure that your ",(0,o.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging",children:"build environment is set up correctly"}),". You will clone an existing package, build it, then install it, and finally remove it."]}),"\n",(0,o.jsxs)(n.h2,{id:"cloning-and-building-nano",children:["Cloning and building ",(0,o.jsx)(n.code,{children:"nano"})]}),"\n",(0,o.jsxs)(n.p,{children:["For this example we will use the text editor ",(0,o.jsx)(n.code,{children:"nano"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"Change to your packaging directory. Your directory may have a different name or location:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cd ~/solus-packages\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Switch to the directory containing the ",(0,o.jsx)(n.code,{children:"nano"})," recipe:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cd packages/n/nano\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Alternatively, if you've set up the ",(0,o.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#set-up-repository-helper-functions-optional",children:"Monorepo Helper Functions"})," you can replace the above to steps by these simple commands",":n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"gotosoluspkgs\ngotopkg nano\n"})}),"\n",(0,o.jsx)(n.p,{children:'Increase the release number by one ("bump" the package) and then check the results:'}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"go-task bump\ngit diff\n"})}),"\n",(0,o.jsx)(n.p,{children:"You should see output from git similar to the following:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-diff",children:"diff --git a/package.yml b/package.yml\nindex 2ff1756..4bc344c 100644\n--- a/package.yml\n+++ b/package.yml\n@@ -1,6 +1,6 @@\n name : nano\n version : '7.2'\n-release : 161\n+release : 162\n source :\n - https://www.nano-editor.org/dist/v7/nano-7.2.tar.xz : 86f3442768bd2873cec693f83cdf80b4b444ad3cc14760b74361474fc87a4526\n homepage : https://www.nano-editor.org\n"})}),"\n",(0,o.jsx)(n.p,{children:"Next, build the package:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"go-task\n"})}),"\n",(0,o.jsxs)(n.p,{children:["You will be prompted to enter your password by sudo, and the ",(0,o.jsx)(n.code,{children:"solbuild"})," tool will build the package.\nIf the build is successful, you will have a ",(0,o.jsx)(n.code,{children:"nano"})," package file with a name like ",(0,o.jsx)(n.code,{children:"nano-7.2-161-1-x86_64.eopkg"}),". Run the ",(0,o.jsx)(n.code,{children:"ls"})," tool to check the exact name:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ ls\nabi_used_libs files package.yml\nabi_used_symbols nano-7.2-162-1-x86_64.eopkg pspec_x86_64.xml\n"})}),"\n",(0,o.jsx)(n.p,{children:"Congratulations! You have successfully built your first package on Solus."}),"\n",(0,o.jsxs)(n.h2,{id:"installing-your-new-nano-package",children:["Installing your new ",(0,o.jsx)(n.code,{children:"nano"})," package"]}),"\n",(0,o.jsxs)(n.p,{children:["To install your new ",(0,o.jsx)(n.code,{children:"nano"})," package, run the following command. Your filename will probably be slightly different."]}),"\n",(0,o.jsx)(n.p,{children:"This is done so you can test that the package works as expected. Each package submission will require you to describe what testing you did."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it nano-7.2-162-1-x86_64.eopkg\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Testing ",(0,o.jsx)(n.code,{children:"nano"})," is pretty easy. Testing other packages may be more complicated, depending on what they do."]}),"\n",(0,o.jsxs)(n.p,{children:["To test your newly built ",(0,o.jsx)(n.code,{children:"nano"})," package, simply run it on command line, then make sure you can edit and save a file."]}),"\n",(0,o.jsx)(n.h2,{id:"returning-to-the-repository-version-optional",children:"Returning to the repository version (optional)"}),"\n",(0,o.jsx)(n.p,{children:"It is a good idea to remove the package you built, and return to the repository version, once you are done testing."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it --reinstall nano\n"})})]})}function p(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},11151:(e,n,a)=>{a.d(n,{Z:()=>r,a:()=>i});var o=a(67294);const t={},s=o.createContext(t);function i(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[255],{67868:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>r,toc:()=>l});var o=a(85893),t=a(11151);const s={title:"Your First Package Update",summary:"An example of how to build a package that exists in the Solus repos for new packagers."},i="Your First Package Update",r={id:"packaging/your-first-package-update",title:"Your First Package Update",description:"This page will guide you through the steps required to build your first package. This is really a test to make sure that your build environment is set up correctly. You will clone an existing package, build it, then install it, and finally remove it.",source:"@site/docs/packaging/your-first-package-update.md",sourceDirName:"packaging",slug:"/packaging/your-first-package-update",permalink:"/docs/packaging/your-first-package-update",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/your-first-package-update.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Your First Package Update",summary:"An example of how to build a package that exists in the Solus repos for new packagers."},sidebar:"packagingSidebar",previous:{title:"Troubleshooting for Packagers",permalink:"/docs/packaging/troubleshooting-packaging"}},c={},l=[{value:"Cloning and building nano",id:"cloning-and-building-nano",level:2},{value:"Installing your new nano package",id:"installing-your-new-nano-package",level:2},{value:"Returning to the repository version (optional)",id:"returning-to-the-repository-version-optional",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"your-first-package-update",children:"Your First Package Update"})}),"\n",(0,o.jsxs)(n.p,{children:["This page will guide you through the steps required to build your first package. This is really a test to make sure that your ",(0,o.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging",children:"build environment is set up correctly"}),". You will clone an existing package, build it, then install it, and finally remove it."]}),"\n",(0,o.jsxs)(n.h2,{id:"cloning-and-building-nano",children:["Cloning and building ",(0,o.jsx)(n.code,{children:"nano"})]}),"\n",(0,o.jsxs)(n.p,{children:["For this example we will use the text editor ",(0,o.jsx)(n.code,{children:"nano"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"Change to your packaging directory. Your directory may have a different name or location:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cd ~/solus-packages\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Switch to the directory containing the ",(0,o.jsx)(n.code,{children:"nano"})," recipe:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cd packages/n/nano\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Alternatively, if you've set up the ",(0,o.jsx)(n.a,{href:"/docs/packaging/prepare-for-packaging#set-up-repository-helper-functions-optional",children:"Monorepo Helper Functions"})," you can replace the above to steps by these simple commands",":n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"gotosoluspkgs\ngotopkg nano\n"})}),"\n",(0,o.jsx)(n.p,{children:'Increase the release number by one ("bump" the package) and then check the results:'}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"go-task bump\ngit diff\n"})}),"\n",(0,o.jsx)(n.p,{children:"You should see output from git similar to the following:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-diff",children:"diff --git a/package.yml b/package.yml\nindex 2ff1756..4bc344c 100644\n--- a/package.yml\n+++ b/package.yml\n@@ -1,6 +1,6 @@\n name : nano\n version : '7.2'\n-release : 161\n+release : 162\n source :\n - https://www.nano-editor.org/dist/v7/nano-7.2.tar.xz : 86f3442768bd2873cec693f83cdf80b4b444ad3cc14760b74361474fc87a4526\n homepage : https://www.nano-editor.org\n"})}),"\n",(0,o.jsx)(n.p,{children:"Next, build the package:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"go-task\n"})}),"\n",(0,o.jsxs)(n.p,{children:["You will be prompted to enter your password by sudo, and the ",(0,o.jsx)(n.code,{children:"solbuild"})," tool will build the package.\nIf the build is successful, you will have a ",(0,o.jsx)(n.code,{children:"nano"})," package file with a name like ",(0,o.jsx)(n.code,{children:"nano-7.2-161-1-x86_64.eopkg"}),". Run the ",(0,o.jsx)(n.code,{children:"ls"})," tool to check the exact name:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ ls\nabi_used_libs files package.yml\nabi_used_symbols nano-7.2-162-1-x86_64.eopkg pspec_x86_64.xml\n"})}),"\n",(0,o.jsx)(n.p,{children:"Congratulations! You have successfully built your first package on Solus."}),"\n",(0,o.jsxs)(n.h2,{id:"installing-your-new-nano-package",children:["Installing your new ",(0,o.jsx)(n.code,{children:"nano"})," package"]}),"\n",(0,o.jsxs)(n.p,{children:["To install your new ",(0,o.jsx)(n.code,{children:"nano"})," package, run the following command. Your filename will probably be slightly different."]}),"\n",(0,o.jsx)(n.p,{children:"This is done so you can test that the package works as expected. Each package submission will require you to describe what testing you did."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it nano-7.2-162-1-x86_64.eopkg\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Testing ",(0,o.jsx)(n.code,{children:"nano"})," is pretty easy. Testing other packages may be more complicated, depending on what they do."]}),"\n",(0,o.jsxs)(n.p,{children:["To test your newly built ",(0,o.jsx)(n.code,{children:"nano"})," package, simply run it on command line, then make sure you can edit and save a file."]}),"\n",(0,o.jsx)(n.h2,{id:"returning-to-the-repository-version-optional",children:"Returning to the repository version (optional)"}),"\n",(0,o.jsx)(n.p,{children:"It is a good idea to remove the package you built, and return to the repository version, once you are done testing."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it --reinstall nano\n"})})]})}function p(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},11151:(e,n,a)=>{a.d(n,{Z:()=>r,a:()=>i});var o=a(67294);const t={},s=o.createContext(t);function i(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d0d2faf6.63069d38.js b/assets/js/d0d2faf6.fce96d12.js similarity index 98% rename from assets/js/d0d2faf6.63069d38.js rename to assets/js/d0d2faf6.fce96d12.js index fafd67c80..b270b9a32 100644 --- a/assets/js/d0d2faf6.63069d38.js +++ b/assets/js/d0d2faf6.fce96d12.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4507],{79267:(e,s,a)=>{a.r(s),a.d(s,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>l});var t=a(85893),n=a(11151);const r={title:"Release Processes",summary:"Release Processes"},o="Release Processes",i={id:"packaging/procedures/release-processes",title:"Release Processes",description:"This post is intended as both information to users, and guidelines for developers and contributors of Solus. Solus employs a formal architecture to enable the curated rolling release model, which is made possible through the use of ferryd, solbuild and a split-repository model.",source:"@site/docs/packaging/procedures/release-processes.md",sourceDirName:"packaging/procedures",slug:"/packaging/procedures/release-processes",permalink:"/docs/packaging/procedures/release-processes",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/release-processes.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Release Processes",summary:"Release Processes"},sidebar:"packagingSidebar",previous:{title:"Package Inclusion Policy",permalink:"/docs/packaging/procedures/package-inclusion"},next:{title:"Requesting a Package Update",permalink:"/docs/packaging/procedures/request-a-package-update"}},c={},l=[{value:"Repository staging",id:"repository-staging",level:2},{value:"Weekly Sync - Every Friday",id:"weekly-sync---every-friday",level:2},{value:"Package deprecation",id:"package-deprecation",level:2},{value:"Deprecating a package",id:"deprecating-a-package",level:3},{value:"Un-deprecating a package",id:"un-deprecating-a-package",level:3},{value:"Major stack changes",id:"major-stack-changes",level:2}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",...(0,n.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"release-processes",children:"Release Processes"})}),"\n",(0,t.jsx)(s.p,{children:"This post is intended as both information to users, and guidelines for developers and contributors of Solus. Solus employs a formal architecture to enable the curated rolling release model, which is made possible through the use of ferryd, solbuild and a split-repository model."}),"\n",(0,t.jsx)(s.h2,{id:"repository-staging",children:"Repository staging"}),"\n",(0,t.jsxs)(s.p,{children:["All package builds for Solus, updates or otherwise, will always enter the ",(0,t.jsx)(s.code,{children:"unstable"})," repository first. Consequently, all Solus developers and contributors should ensure ",(0,t.jsx)(s.code,{children:"solbuild"})," is configured to use the unstable target. As and when the weekly stabilization efforts have completed, the ",(0,t.jsx)(s.code,{children:"unstable"})," repository will be pulled into ",(0,t.jsx)(s.code,{children:"shannon"}),", the stable target."]}),"\n",(0,t.jsxs)(s.p,{children:["This effectively means that ",(0,t.jsx)(s.code,{children:"shannon"})," is a rolling snapshot of ",(0,t.jsx)(s.code,{children:"unstable"}),". Note that the weekly sync will not make each repository match identically - the ",(0,t.jsx)(s.strong,{children:"tip"})," of every package in ",(0,t.jsx)(s.code,{children:"unstable"})," will be merged into ",(0,t.jsx)(s.code,{children:"shannon"}),". This ensures that the ",(0,t.jsx)(s.code,{children:"shannon"})," update path is cost-efficient in terms of package availability, and that the delta packages provided on ",(0,t.jsx)(s.code,{children:"shannon"})," match the true update path for those users. Lastly, this also ensures that there are no unintended packages arriving in shannon from older builds."]}),"\n",(0,t.jsxs)(s.p,{children:["Solus installations always default to the ",(0,t.jsx)(s.code,{children:"shannon"})," repository, making shannon the published distribution, and ",(0,t.jsx)(s.code,{children:"unstable"})," the development distribution."]}),"\n",(0,t.jsx)(s.h2,{id:"weekly-sync---every-friday",children:"Weekly Sync - Every Friday"}),"\n",(0,t.jsx)(s.p,{children:"At minimum there shall be one sync per week - this will always be on a Friday. As a result, users are never more than a few days away from unstable. This allows packagers to make deeper changes to Solus and still have time to stabilize the repository before releasing changes on the Friday."}),"\n",(0,t.jsxs)(s.p,{children:["Given the high volume of changes within Solus in any sync window, the Friday sync should be viewed more as a release than a simple sync. All developers and contributors should try their best to ensure that their changes do not introduce regressions, and that existing update paths are ",(0,t.jsx)(s.strong,{children:"always respected"}),"."]}),"\n",(0,t.jsx)(s.p,{children:"Minor syncs during the week, and correctional syncs shortly after the Friday-sync, are permitted assuming they do not introduce breaking changes to shannon. These may include minor packaging changes, security updates, etc."}),"\n",(0,t.jsx)(s.h2,{id:"package-deprecation",children:"Package deprecation"}),"\n",(0,t.jsx)(s.p,{children:"There are times when a package may need to be deprecated or even renamed. Packagers owning these changes must first communicate the need to ensure a coordinated deprecation."}),"\n",(0,t.jsxs)(s.p,{children:["Deprecated packages will remove themselves from the users systems as the first operation in an update or package install using the package manager, once marked as ",(0,t.jsx)(s.code,{children:"Obsolete"})," in the index."]}),"\n",(0,t.jsx)(s.h3,{id:"deprecating-a-package",children:"Deprecating a package"}),"\n",(0,t.jsx)(s.p,{children:"Follow these steps to submit a package for deprecation:"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Create a new branch in the Solus ",(0,t.jsx)(s.code,{children:"packages"})," repository ",(0,t.jsx)(s.a,{href:"https://github.com/getsolus/packages",children:"on GitHub"}),' (forking it first if necessary) with a suitable name such as "deprecate-foobar"']}),"\n",(0,t.jsxs)(s.li,{children:["Edit ",(0,t.jsx)(s.code,{children:"repo_data/distribution.xml.in"})]}),"\n",(0,t.jsxs)(s.li,{children:["Add the package you wish to deprecate at the end of the ",(0,t.jsx)(s.code,{children:""})," section"]}),"\n",(0,t.jsxs)(s.li,{children:["Change directory to repo_data (",(0,t.jsx)(s.code,{children:"cd repo_data"}),"), then run the ",(0,t.jsx)(s.code,{children:"merged_repos.sh"})," script"]}),"\n",(0,t.jsxs)(s.li,{children:["Remove the package from the Solus ",(0,t.jsx)(s.code,{children:"packages"})," repository, for example ",(0,t.jsx)(s.code,{children:"rm -fr packages/f/foobar"})]}),"\n",(0,t.jsx)(s.li,{children:"Commit and push your changes to your repository/branch"}),"\n",(0,t.jsx)(s.li,{children:"Open a Pull Request on GitHub"}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"un-deprecating-a-package",children:"Un-deprecating a package"}),"\n",(0,t.jsx)(s.p,{children:"The above steps also apply to un-deprecating a package, with the following additions:"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Create a new branch in the Solus ",(0,t.jsx)(s.code,{children:"packages"})," repository ",(0,t.jsx)(s.a,{href:"https://github.com/getsolus/packages",children:"on GitHub"}),' (forking it first if necessary) with a suitable name such as "undeprecate-foobar"']}),"\n",(0,t.jsxs)(s.li,{children:["Find the commit deprecating the package and restore the package within the repository structure. For example restore all files in packages/f/foobar or use ",(0,t.jsx)(s.code,{children:"git revert"})," if appropriate"]}),"\n",(0,t.jsxs)(s.li,{children:["Edit ",(0,t.jsx)(s.code,{children:"repo_data/distribution.xml.in"})," and remove the package you wish to undeprecate in the ",(0,t.jsx)(s.code,{children:""})," section"]}),"\n",(0,t.jsxs)(s.li,{children:["Change directory to repo_data (",(0,t.jsx)(s.code,{children:"cd repo_data"}),"), then run the ",(0,t.jsx)(s.code,{children:"merged_repos.sh"})," script"]}),"\n",(0,t.jsxs)(s.li,{children:["Open a Pull Request on GitHub and ask a Solus Staff member to use available tooling to update the repository files, then index the repository with ",(0,t.jsx)(s.code,{children:"ferryctl index unstable"})," (or do it yourself if you have the ability)"]}),"\n",(0,t.jsx)(s.li,{children:"Bump or update the package"}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"major-stack-changes",children:"Major stack changes"}),"\n",(0,t.jsx)(s.p,{children:"Large stack upgrades should begin as closely to the last Friday sync as possible, to ensure there is plenty of time for the work to be completed, integrated, and tested for regressions."})]})}function h(e={}){const{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},11151:(e,s,a)=>{a.d(s,{Z:()=>i,a:()=>o});var t=a(67294);const n={},r=t.createContext(n);function o(e){const s=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4507],{79267:(e,s,a)=>{a.r(s),a.d(s,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>l});var t=a(85893),n=a(11151);const r={title:"Release Processes",summary:"Release Processes"},o="Release Processes",i={id:"packaging/procedures/release-processes",title:"Release Processes",description:"This post is intended as both information to users, and guidelines for developers and contributors of Solus. Solus employs a formal architecture to enable the curated rolling release model, which is made possible through the use of ferryd, solbuild and a split-repository model.",source:"@site/docs/packaging/procedures/release-processes.md",sourceDirName:"packaging/procedures",slug:"/packaging/procedures/release-processes",permalink:"/docs/packaging/procedures/release-processes",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/procedures/release-processes.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Release Processes",summary:"Release Processes"},sidebar:"packagingSidebar",previous:{title:"Package Inclusion Policy",permalink:"/docs/packaging/procedures/package-inclusion"},next:{title:"Requesting a Package Update",permalink:"/docs/packaging/procedures/request-a-package-update"}},c={},l=[{value:"Repository staging",id:"repository-staging",level:2},{value:"Weekly Sync - Every Friday",id:"weekly-sync---every-friday",level:2},{value:"Package deprecation",id:"package-deprecation",level:2},{value:"Deprecating a package",id:"deprecating-a-package",level:3},{value:"Un-deprecating a package",id:"un-deprecating-a-package",level:3},{value:"Major stack changes",id:"major-stack-changes",level:2}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",...(0,n.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"release-processes",children:"Release Processes"})}),"\n",(0,t.jsx)(s.p,{children:"This post is intended as both information to users, and guidelines for developers and contributors of Solus. Solus employs a formal architecture to enable the curated rolling release model, which is made possible through the use of ferryd, solbuild and a split-repository model."}),"\n",(0,t.jsx)(s.h2,{id:"repository-staging",children:"Repository staging"}),"\n",(0,t.jsxs)(s.p,{children:["All package builds for Solus, updates or otherwise, will always enter the ",(0,t.jsx)(s.code,{children:"unstable"})," repository first. Consequently, all Solus developers and contributors should ensure ",(0,t.jsx)(s.code,{children:"solbuild"})," is configured to use the unstable target. As and when the weekly stabilization efforts have completed, the ",(0,t.jsx)(s.code,{children:"unstable"})," repository will be pulled into ",(0,t.jsx)(s.code,{children:"shannon"}),", the stable target."]}),"\n",(0,t.jsxs)(s.p,{children:["This effectively means that ",(0,t.jsx)(s.code,{children:"shannon"})," is a rolling snapshot of ",(0,t.jsx)(s.code,{children:"unstable"}),". Note that the weekly sync will not make each repository match identically - the ",(0,t.jsx)(s.strong,{children:"tip"})," of every package in ",(0,t.jsx)(s.code,{children:"unstable"})," will be merged into ",(0,t.jsx)(s.code,{children:"shannon"}),". This ensures that the ",(0,t.jsx)(s.code,{children:"shannon"})," update path is cost-efficient in terms of package availability, and that the delta packages provided on ",(0,t.jsx)(s.code,{children:"shannon"})," match the true update path for those users. Lastly, this also ensures that there are no unintended packages arriving in shannon from older builds."]}),"\n",(0,t.jsxs)(s.p,{children:["Solus installations always default to the ",(0,t.jsx)(s.code,{children:"shannon"})," repository, making shannon the published distribution, and ",(0,t.jsx)(s.code,{children:"unstable"})," the development distribution."]}),"\n",(0,t.jsx)(s.h2,{id:"weekly-sync---every-friday",children:"Weekly Sync - Every Friday"}),"\n",(0,t.jsx)(s.p,{children:"At minimum there shall be one sync per week - this will always be on a Friday. As a result, users are never more than a few days away from unstable. This allows packagers to make deeper changes to Solus and still have time to stabilize the repository before releasing changes on the Friday."}),"\n",(0,t.jsxs)(s.p,{children:["Given the high volume of changes within Solus in any sync window, the Friday sync should be viewed more as a release than a simple sync. All developers and contributors should try their best to ensure that their changes do not introduce regressions, and that existing update paths are ",(0,t.jsx)(s.strong,{children:"always respected"}),"."]}),"\n",(0,t.jsx)(s.p,{children:"Minor syncs during the week, and correctional syncs shortly after the Friday-sync, are permitted assuming they do not introduce breaking changes to shannon. These may include minor packaging changes, security updates, etc."}),"\n",(0,t.jsx)(s.h2,{id:"package-deprecation",children:"Package deprecation"}),"\n",(0,t.jsx)(s.p,{children:"There are times when a package may need to be deprecated or even renamed. Packagers owning these changes must first communicate the need to ensure a coordinated deprecation."}),"\n",(0,t.jsxs)(s.p,{children:["Deprecated packages will remove themselves from the users systems as the first operation in an update or package install using the package manager, once marked as ",(0,t.jsx)(s.code,{children:"Obsolete"})," in the index."]}),"\n",(0,t.jsx)(s.h3,{id:"deprecating-a-package",children:"Deprecating a package"}),"\n",(0,t.jsx)(s.p,{children:"Follow these steps to submit a package for deprecation:"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Create a new branch in the Solus ",(0,t.jsx)(s.code,{children:"packages"})," repository ",(0,t.jsx)(s.a,{href:"https://github.com/getsolus/packages",children:"on GitHub"}),' (forking it first if necessary) with a suitable name such as "deprecate-foobar"']}),"\n",(0,t.jsxs)(s.li,{children:["Edit ",(0,t.jsx)(s.code,{children:"repo_data/distribution.xml.in"})]}),"\n",(0,t.jsxs)(s.li,{children:["Add the package you wish to deprecate at the end of the ",(0,t.jsx)(s.code,{children:""})," section"]}),"\n",(0,t.jsxs)(s.li,{children:["Change directory to repo_data (",(0,t.jsx)(s.code,{children:"cd repo_data"}),"), then run the ",(0,t.jsx)(s.code,{children:"merged_repos.sh"})," script"]}),"\n",(0,t.jsxs)(s.li,{children:["Remove the package from the Solus ",(0,t.jsx)(s.code,{children:"packages"})," repository, for example ",(0,t.jsx)(s.code,{children:"rm -fr packages/f/foobar"})]}),"\n",(0,t.jsx)(s.li,{children:"Commit and push your changes to your repository/branch"}),"\n",(0,t.jsx)(s.li,{children:"Open a Pull Request on GitHub"}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"un-deprecating-a-package",children:"Un-deprecating a package"}),"\n",(0,t.jsx)(s.p,{children:"The above steps also apply to un-deprecating a package, with the following additions:"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Create a new branch in the Solus ",(0,t.jsx)(s.code,{children:"packages"})," repository ",(0,t.jsx)(s.a,{href:"https://github.com/getsolus/packages",children:"on GitHub"}),' (forking it first if necessary) with a suitable name such as "undeprecate-foobar"']}),"\n",(0,t.jsxs)(s.li,{children:["Find the commit deprecating the package and restore the package within the repository structure. For example restore all files in packages/f/foobar or use ",(0,t.jsx)(s.code,{children:"git revert"})," if appropriate"]}),"\n",(0,t.jsxs)(s.li,{children:["Edit ",(0,t.jsx)(s.code,{children:"repo_data/distribution.xml.in"})," and remove the package you wish to undeprecate in the ",(0,t.jsx)(s.code,{children:""})," section"]}),"\n",(0,t.jsxs)(s.li,{children:["Change directory to repo_data (",(0,t.jsx)(s.code,{children:"cd repo_data"}),"), then run the ",(0,t.jsx)(s.code,{children:"merged_repos.sh"})," script"]}),"\n",(0,t.jsxs)(s.li,{children:["Open a Pull Request on GitHub and ask a Solus Staff member to use available tooling to update the repository files, then index the repository with ",(0,t.jsx)(s.code,{children:"ferryctl index unstable"})," (or do it yourself if you have the ability)"]}),"\n",(0,t.jsx)(s.li,{children:"Bump or update the package"}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"major-stack-changes",children:"Major stack changes"}),"\n",(0,t.jsx)(s.p,{children:"Large stack upgrades should begin as closely to the last Friday sync as possible, to ensure there is plenty of time for the work to be completed, integrated, and tested for regressions."})]})}function h(e={}){const{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},11151:(e,s,a)=>{a.d(s,{Z:()=>i,a:()=>o});var t=a(67294);const n={},r=t.createContext(n);function o(e){const s=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d20919b7.02c2f2df.js b/assets/js/d20919b7.02c2f2df.js new file mode 100644 index 000000000..ce4374597 --- /dev/null +++ b/assets/js/d20919b7.02c2f2df.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2627],{20570:e=>{e.exports=JSON.parse('{"tag":{"label":"cleanup","permalink":"/blog/tags/cleanup","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/cleanup","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/d2363c7a.3ca2df4f.js b/assets/js/d2363c7a.3ca2df4f.js new file mode 100644 index 000000000..20f137ed1 --- /dev/null +++ b/assets/js/d2363c7a.3ca2df4f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2741],{1629:e=>{e.exports=JSON.parse('{"author":{"name":"Muhammad Alfi Syahrin","title":"Solus Staff","page":{"permalink":"/blog/authors/alfi"},"socials":{"github":"https://github.com/malfisya"},"imageURL":"https://avatars.githubusercontent.com/u/101771435","key":"alfi","count":1},"listMetadata":{"permalink":"/blog/authors/alfi","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/d4762887.0677ce0c.js b/assets/js/d4762887.6a978042.js similarity index 98% rename from assets/js/d4762887.0677ce0c.js rename to assets/js/d4762887.6a978042.js index a56f49282..170f49641 100644 --- a/assets/js/d4762887.0677ce0c.js +++ b/assets/js/d4762887.6a978042.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3624],{1108:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>r,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>u});var s=o(85893),n=o(11151);const i={title:"Installation Issues",summary:"Troubleshooting the Solus installation process"},l="Installation Issues",a={id:"user/troubleshooting/installation",title:"Installation Issues",description:"This article covers various issues that you may come across during installation of Solus.",source:"@site/docs/user/troubleshooting/installation.md",sourceDirName:"user/troubleshooting",slug:"/user/troubleshooting/installation",permalink:"/docs/user/troubleshooting/installation",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/troubleshooting/installation.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Installation Issues",summary:"Troubleshooting the Solus installation process"},sidebar:"userSidebar",previous:{title:"Boot Rescue",permalink:"/docs/user/troubleshooting/boot-rescue"},next:{title:"Plasma Troubleshooting",permalink:"/docs/user/troubleshooting/plasma"}},r={},u=[{value:"Can't install in EFI mode",id:"cant-install-in-efi-mode",level:2},{value:"I can't boot into Solus after installation!",id:"i-cant-boot-into-solus-after-installation",level:2},{value:"Legacy/BIOS installation",id:"legacybios-installation",level:3},{value:"EFI",id:"efi",level:3}];function c(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"installation-issues",children:"Installation Issues"})}),"\n",(0,s.jsx)(t.p,{children:"This article covers various issues that you may come across during installation of Solus."}),"\n",(0,s.jsx)(t.h2,{id:"cant-install-in-efi-mode",children:"Can't install in EFI mode"}),"\n",(0,s.jsxs)(t.p,{children:["The live ISO will attempt to install Solus by the same method it was booted. If it is unable to install the boot loader to the ESP, then it is likely booted in legacy mode. Ensure that the ISO has been created via a ",(0,s.jsx)(t.a,{href:"/docs/user/quick-start/installation",children:"supported method"})," and that an EFI boot is selected from the boot options."]}),"\n",(0,s.jsxs)(t.p,{children:["You can check whether the Solus ISO has booted in EFI mode by checking the for the existence of ",(0,s.jsx)(t.code,{children:"ls /sys/firmware/efi"})," (if it's not found, then it's booted in legacy mode)."]}),"\n",(0,s.jsx)(t.h2,{id:"i-cant-boot-into-solus-after-installation",children:"I can't boot into Solus after installation!"}),"\n",(0,s.jsx)(t.p,{children:"There are some misunderstandings with how legacy and EFI boot work (usually implemented as UEFI). These sections cover the common misconceptions."}),"\n",(0,s.jsx)(t.h3,{id:"legacybios-installation",children:"Legacy/BIOS installation"}),"\n",(0,s.jsx)(t.p,{children:"Legacy installations on Solus use the GRUB boot loader on an MBR disk. Only one boot loader can be used on an MBR disk, so if you haven't installed the Solus boot loader on the MBR, you will need to boot into the other OS and update GRUB prior to being able to boot Solus. This will also be required on each update of the kernel to ensure you're booting the latest release."}),"\n",(0,s.jsx)(t.h3,{id:"efi",children:"EFI"}),"\n",(0,s.jsxs)(t.p,{children:["EFI allows for multiple boot loaders to be installed, which means you can boot the Solus boot loader directly. To ensure you are booting Solus you need to boot ",(0,s.jsx)(t.code,{children:"Linux Boot Manager"})," from the EFI options. Common keys for bringing up a boot menu or the options during boot are hitting ",(0,s.jsx)(t.code,{children:"Esc/F2/F9/F10/F11/F12"})," during boot (this differs per motherboard). If a boot loader for another OS is not listed in the menu, then it is not correctly registered (and therefore not installed correctly). You can make the Solus boot menu appear via ",(0,s.jsx)(t.a,{href:"/docs/user/quick-start/boot-management#displaying-the-boot-menu-by-default-every-boot",children:"Displaying the Solus boot menu on boot"})," which should be able to boot Windows (as it's registered with UEFI properly) as well as Solus, but not other systems."]})]})}function d(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,t,o)=>{o.d(t,{Z:()=>a,a:()=>l});var s=o(67294);const n={},i=s.createContext(n);function l(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:l(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3624],{1108:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>r,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>u});var s=o(85893),n=o(11151);const i={title:"Installation Issues",summary:"Troubleshooting the Solus installation process"},l="Installation Issues",a={id:"user/troubleshooting/installation",title:"Installation Issues",description:"This article covers various issues that you may come across during installation of Solus.",source:"@site/docs/user/troubleshooting/installation.md",sourceDirName:"user/troubleshooting",slug:"/user/troubleshooting/installation",permalink:"/docs/user/troubleshooting/installation",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/troubleshooting/installation.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Installation Issues",summary:"Troubleshooting the Solus installation process"},sidebar:"userSidebar",previous:{title:"Boot Rescue",permalink:"/docs/user/troubleshooting/boot-rescue"},next:{title:"Plasma Troubleshooting",permalink:"/docs/user/troubleshooting/plasma"}},r={},u=[{value:"Can't install in EFI mode",id:"cant-install-in-efi-mode",level:2},{value:"I can't boot into Solus after installation!",id:"i-cant-boot-into-solus-after-installation",level:2},{value:"Legacy/BIOS installation",id:"legacybios-installation",level:3},{value:"EFI",id:"efi",level:3}];function c(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",...(0,n.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"installation-issues",children:"Installation Issues"})}),"\n",(0,s.jsx)(t.p,{children:"This article covers various issues that you may come across during installation of Solus."}),"\n",(0,s.jsx)(t.h2,{id:"cant-install-in-efi-mode",children:"Can't install in EFI mode"}),"\n",(0,s.jsxs)(t.p,{children:["The live ISO will attempt to install Solus by the same method it was booted. If it is unable to install the boot loader to the ESP, then it is likely booted in legacy mode. Ensure that the ISO has been created via a ",(0,s.jsx)(t.a,{href:"/docs/user/quick-start/installation",children:"supported method"})," and that an EFI boot is selected from the boot options."]}),"\n",(0,s.jsxs)(t.p,{children:["You can check whether the Solus ISO has booted in EFI mode by checking the for the existence of ",(0,s.jsx)(t.code,{children:"ls /sys/firmware/efi"})," (if it's not found, then it's booted in legacy mode)."]}),"\n",(0,s.jsx)(t.h2,{id:"i-cant-boot-into-solus-after-installation",children:"I can't boot into Solus after installation!"}),"\n",(0,s.jsx)(t.p,{children:"There are some misunderstandings with how legacy and EFI boot work (usually implemented as UEFI). These sections cover the common misconceptions."}),"\n",(0,s.jsx)(t.h3,{id:"legacybios-installation",children:"Legacy/BIOS installation"}),"\n",(0,s.jsx)(t.p,{children:"Legacy installations on Solus use the GRUB boot loader on an MBR disk. Only one boot loader can be used on an MBR disk, so if you haven't installed the Solus boot loader on the MBR, you will need to boot into the other OS and update GRUB prior to being able to boot Solus. This will also be required on each update of the kernel to ensure you're booting the latest release."}),"\n",(0,s.jsx)(t.h3,{id:"efi",children:"EFI"}),"\n",(0,s.jsxs)(t.p,{children:["EFI allows for multiple boot loaders to be installed, which means you can boot the Solus boot loader directly. To ensure you are booting Solus you need to boot ",(0,s.jsx)(t.code,{children:"Linux Boot Manager"})," from the EFI options. Common keys for bringing up a boot menu or the options during boot are hitting ",(0,s.jsx)(t.code,{children:"Esc/F2/F9/F10/F11/F12"})," during boot (this differs per motherboard). If a boot loader for another OS is not listed in the menu, then it is not correctly registered (and therefore not installed correctly). You can make the Solus boot menu appear via ",(0,s.jsx)(t.a,{href:"/docs/user/quick-start/boot-management#displaying-the-boot-menu-by-default-every-boot",children:"Displaying the Solus boot menu on boot"})," which should be able to boot Windows (as it's registered with UEFI properly) as well as Solus, but not other systems."]})]})}function d(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,t,o)=>{o.d(t,{Z:()=>a,a:()=>l});var s=o(67294);const n={},i=s.createContext(n);function l(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:l(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d5670106.e6cc6c2e.js b/assets/js/d5670106.51fe485e.js similarity index 99% rename from assets/js/d5670106.e6cc6c2e.js rename to assets/js/d5670106.51fe485e.js index ef8b5c9e7..e3d6252e4 100644 --- a/assets/js/d5670106.e6cc6c2e.js +++ b/assets/js/d5670106.51fe485e.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1950],{60908:(e,s,o)=>{o.r(s),o.d(s,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>t,toc:()=>a});var n=o(85893),r=o(11151);const i={title:"Plasma Troubleshooting",summary:"Troubleshooting Issues With the Plasma Desktop"},l="Plasma Desktop Troubleshooting",t={id:"user/troubleshooting/plasma",title:"Plasma Troubleshooting",description:"This contains fixes for various issues you might encounter with the Plasma desktop environment.",source:"@site/docs/user/troubleshooting/plasma.md",sourceDirName:"user/troubleshooting",slug:"/user/troubleshooting/plasma",permalink:"/docs/user/troubleshooting/plasma",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/troubleshooting/plasma.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Plasma Troubleshooting",summary:"Troubleshooting Issues With the Plasma Desktop"},sidebar:"userSidebar",previous:{title:"Installation Issues",permalink:"/docs/user/troubleshooting/installation"}},c={},a=[{value:"Desktop no longer responds to clicks, cursor stuck in "move" mode (cross)",id:"desktop-no-longer-responds-to-clicks-cursor-stuck-in-move-mode-cross",level:2},{value:"Application windows look corrupt / incomplete",id:"application-windows-look-corrupt--incomplete",level:2}];function d(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"plasma-desktop-troubleshooting",children:"Plasma Desktop Troubleshooting"})}),"\n",(0,n.jsx)(s.p,{children:"This contains fixes for various issues you might encounter with the Plasma desktop environment."}),"\n",(0,n.jsx)(s.h2,{id:"desktop-no-longer-responds-to-clicks-cursor-stuck-in-move-mode-cross",children:'Desktop no longer responds to clicks, cursor stuck in "move" mode (cross)'}),"\n",(0,n.jsx)(s.p,{children:"This is often caused by a Firefox bug. It can be triggered by various things, like moving Firefox windows."}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"Symptoms:"})}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Can't click on anything on the desktop."}),"\n",(0,n.jsx)(s.li,{children:"Bringing up windows with keyboard shortcuts (ex: Super for the app menu, F9 for a drop down terminal) works, but they don't get focused. You can't interact with them."}),"\n",(0,n.jsx)(s.li,{children:"Mouse cursor is stuck in move mode, it looks like a cross."}),"\n"]}),"\n",(0,n.jsxs)(s.p,{children:["You may not need to reboot to recover from this state. Killing all ",(0,n.jsx)(s.code,{children:"firefox"})," processes may be all that's necessary. To do so:"]}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsxs)(s.li,{children:["Open a virtual terminal by pressing ",(0,n.jsx)(s.code,{children:"Ctrl+Alt+F3"}),"."]}),"\n",(0,n.jsxs)(s.li,{children:["Run the following to kill all ",(0,n.jsx)(s.code,{children:"firefox"})," windows:"]}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"killall firefox\n"})}),"\n",(0,n.jsx)(s.p,{children:"This should close all Firefox windows."}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsxs)(s.li,{children:["Return to the Plasma session by pressing ",(0,n.jsx)(s.code,{children:"Ctrl+Alt+F2"}),".\nYou should now be able to use Plasma normally."]}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"application-windows-look-corrupt--incomplete",children:"Application windows look corrupt / incomplete"}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"Symptoms"})}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Application windows look corrupt. For example, NeoChat does not display room or user icons."}),"\n",(0,n.jsx)(s.li,{children:"Menus in an application are blank."}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:"You may be able to fix this by clearing KDE / Plasma cache files."}),"\n",(0,n.jsx)(s.admonition,{title:"Important",type:"caution",children:(0,n.jsx)(s.p,{children:"You should not be logged into your Plasma session while deleting the cache files, booting from a live USB is necessary."})}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsx)(s.li,{children:"While still logged into your Plasma session, go to your home directory:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"cd\n"})}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsx)(s.li,{children:"Run these commands to back up the following directories:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"cp -av ~/.kde{,.bak}\ncp -av ~/.config{,.bak}\ncp -av ~/.local{,.bak}\ncp -av ~/share{,.bak}\n"})}),"\n",(0,n.jsxs)(s.p,{children:["The commands create a copy of the folders. Each copy has the ",(0,n.jsx)(s.code,{children:".bak"})," extension (Example: ",(0,n.jsx)(s.code,{children:"~/.config.bak"}),"). These can be used to recover configuration files, if necessary."]}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsx)(s.li,{children:"Shut down the system."}),"\n",(0,n.jsxs)(s.li,{children:["Boot from a live USB, which you can create from one of the ",(0,n.jsx)(s.a,{href:"https://getsol.us/download/",children:"Solus installers"}),"."]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.a,{href:"/docs/user/troubleshooting/boot-rescue#mounting-your-system",children:"Mount your hard drive's file system"}),"."]}),"\n",(0,n.jsxs)(s.li,{children:["Change to your user's directory where you mounted your file system. For example, if you used ",(0,n.jsx)(s.code,{children:"/mount"}),":"]}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"cd /mount/home/username\n"})}),"\n",(0,n.jsx)(s.p,{children:'Replace "username" with the username you use for Solus.\nYou can make sure the directory is correct by listing the files:'}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"ls -laH\n"})}),"\n",(0,n.jsx)(s.p,{children:"You should see the files you would usually see in your home directory when logged into Solus normally."}),"\n",(0,n.jsx)(s.admonition,{title:"Important",type:"caution",children:(0,n.jsxs)(s.p,{children:["Avoid deleting the following directories: ",(0,n.jsx)(s.code,{children:"~/.kde"}),", ",(0,n.jsx)(s.code,{children:"~/.kde4"}),", ",(0,n.jsx)(s.code,{children:"~/.local"}),", and ",(0,n.jsx)(s.code,{children:"~/.config"})]})}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsx)(s.li,{children:"Remove the various caches that Plasma uses.\nExecute the following commands:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"rm -rf .cache/plasmashell*\nrm -rf .cache/org.kde.dirmodel-qml.kcache\nrm -rf .cache/kioexec/ .cache/krunner/ .cache/ksycoca5*\nrm -rf .cache/krunnerbookmarkrunnerfirefoxdbfile.sqlite\n\ncd ../.local/\nrm -rf kate/ kded5/ klipper/ knewstuff3/ kscreen/ konsole/ kwalletd/ ksysguard/ kmail2/ kcookiejar/ kactivitymanagerd/\n\ncd ../share/\nrm -rf dolphin kate kcookiejar kded5 keyrings klipper kmail2 knewstuff3 konsole kscreen ksysguard kwalletd kxmlgui5 plasma_engine_comic plasma plasma_notes org.kde.gwenview\n\ncd ../.config/\nrm -f plasma*\nrm -rf kde* akonadi* KDE kconf_updaterc baloo* dolphinrc drkonqirc gwenviewrc kmail2rc k*rc katemetainfos\n"})}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsx)(s.li,{children:"Shut down the live environment and remove the live USB drive."}),"\n",(0,n.jsx)(s.li,{children:"Reboot back into your regular Plasma session. Verify the issue is fixed."}),"\n",(0,n.jsx)(s.li,{children:"If you experience system instability, restore the previously backed up folders."}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:"To restore an entire directory:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{children:"cp -rav .kde.bak/share/config/ .kde/share/config\n"})}),"\n",(0,n.jsx)(s.p,{children:"After restoring the files or directories, restart your system."})]})}function h(e={}){const{wrapper:s}={...(0,r.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},11151:(e,s,o)=>{o.d(s,{Z:()=>t,a:()=>l});var n=o(67294);const r={},i=n.createContext(r);function l(e){const s=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),n.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1950],{60908:(e,s,o)=>{o.r(s),o.d(s,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>t,toc:()=>a});var n=o(85893),r=o(11151);const i={title:"Plasma Troubleshooting",summary:"Troubleshooting Issues With the Plasma Desktop"},l="Plasma Desktop Troubleshooting",t={id:"user/troubleshooting/plasma",title:"Plasma Troubleshooting",description:"This contains fixes for various issues you might encounter with the Plasma desktop environment.",source:"@site/docs/user/troubleshooting/plasma.md",sourceDirName:"user/troubleshooting",slug:"/user/troubleshooting/plasma",permalink:"/docs/user/troubleshooting/plasma",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/troubleshooting/plasma.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Plasma Troubleshooting",summary:"Troubleshooting Issues With the Plasma Desktop"},sidebar:"userSidebar",previous:{title:"Installation Issues",permalink:"/docs/user/troubleshooting/installation"}},c={},a=[{value:"Desktop no longer responds to clicks, cursor stuck in "move" mode (cross)",id:"desktop-no-longer-responds-to-clicks-cursor-stuck-in-move-mode-cross",level:2},{value:"Application windows look corrupt / incomplete",id:"application-windows-look-corrupt--incomplete",level:2}];function d(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"plasma-desktop-troubleshooting",children:"Plasma Desktop Troubleshooting"})}),"\n",(0,n.jsx)(s.p,{children:"This contains fixes for various issues you might encounter with the Plasma desktop environment."}),"\n",(0,n.jsx)(s.h2,{id:"desktop-no-longer-responds-to-clicks-cursor-stuck-in-move-mode-cross",children:'Desktop no longer responds to clicks, cursor stuck in "move" mode (cross)'}),"\n",(0,n.jsx)(s.p,{children:"This is often caused by a Firefox bug. It can be triggered by various things, like moving Firefox windows."}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"Symptoms:"})}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Can't click on anything on the desktop."}),"\n",(0,n.jsx)(s.li,{children:"Bringing up windows with keyboard shortcuts (ex: Super for the app menu, F9 for a drop down terminal) works, but they don't get focused. You can't interact with them."}),"\n",(0,n.jsx)(s.li,{children:"Mouse cursor is stuck in move mode, it looks like a cross."}),"\n"]}),"\n",(0,n.jsxs)(s.p,{children:["You may not need to reboot to recover from this state. Killing all ",(0,n.jsx)(s.code,{children:"firefox"})," processes may be all that's necessary. To do so:"]}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsxs)(s.li,{children:["Open a virtual terminal by pressing ",(0,n.jsx)(s.code,{children:"Ctrl+Alt+F3"}),"."]}),"\n",(0,n.jsxs)(s.li,{children:["Run the following to kill all ",(0,n.jsx)(s.code,{children:"firefox"})," windows:"]}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"killall firefox\n"})}),"\n",(0,n.jsx)(s.p,{children:"This should close all Firefox windows."}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsxs)(s.li,{children:["Return to the Plasma session by pressing ",(0,n.jsx)(s.code,{children:"Ctrl+Alt+F2"}),".\nYou should now be able to use Plasma normally."]}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"application-windows-look-corrupt--incomplete",children:"Application windows look corrupt / incomplete"}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"Symptoms"})}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Application windows look corrupt. For example, NeoChat does not display room or user icons."}),"\n",(0,n.jsx)(s.li,{children:"Menus in an application are blank."}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:"You may be able to fix this by clearing KDE / Plasma cache files."}),"\n",(0,n.jsx)(s.admonition,{title:"Important",type:"caution",children:(0,n.jsx)(s.p,{children:"You should not be logged into your Plasma session while deleting the cache files, booting from a live USB is necessary."})}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsx)(s.li,{children:"While still logged into your Plasma session, go to your home directory:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"cd\n"})}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsx)(s.li,{children:"Run these commands to back up the following directories:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"cp -av ~/.kde{,.bak}\ncp -av ~/.config{,.bak}\ncp -av ~/.local{,.bak}\ncp -av ~/share{,.bak}\n"})}),"\n",(0,n.jsxs)(s.p,{children:["The commands create a copy of the folders. Each copy has the ",(0,n.jsx)(s.code,{children:".bak"})," extension (Example: ",(0,n.jsx)(s.code,{children:"~/.config.bak"}),"). These can be used to recover configuration files, if necessary."]}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsx)(s.li,{children:"Shut down the system."}),"\n",(0,n.jsxs)(s.li,{children:["Boot from a live USB, which you can create from one of the ",(0,n.jsx)(s.a,{href:"https://getsol.us/download/",children:"Solus installers"}),"."]}),"\n",(0,n.jsxs)(s.li,{children:[(0,n.jsx)(s.a,{href:"/docs/user/troubleshooting/boot-rescue#mounting-your-system",children:"Mount your hard drive's file system"}),"."]}),"\n",(0,n.jsxs)(s.li,{children:["Change to your user's directory where you mounted your file system. For example, if you used ",(0,n.jsx)(s.code,{children:"/mount"}),":"]}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"cd /mount/home/username\n"})}),"\n",(0,n.jsx)(s.p,{children:'Replace "username" with the username you use for Solus.\nYou can make sure the directory is correct by listing the files:'}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"ls -laH\n"})}),"\n",(0,n.jsx)(s.p,{children:"You should see the files you would usually see in your home directory when logged into Solus normally."}),"\n",(0,n.jsx)(s.admonition,{title:"Important",type:"caution",children:(0,n.jsxs)(s.p,{children:["Avoid deleting the following directories: ",(0,n.jsx)(s.code,{children:"~/.kde"}),", ",(0,n.jsx)(s.code,{children:"~/.kde4"}),", ",(0,n.jsx)(s.code,{children:"~/.local"}),", and ",(0,n.jsx)(s.code,{children:"~/.config"})]})}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsx)(s.li,{children:"Remove the various caches that Plasma uses.\nExecute the following commands:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"rm -rf .cache/plasmashell*\nrm -rf .cache/org.kde.dirmodel-qml.kcache\nrm -rf .cache/kioexec/ .cache/krunner/ .cache/ksycoca5*\nrm -rf .cache/krunnerbookmarkrunnerfirefoxdbfile.sqlite\n\ncd ../.local/\nrm -rf kate/ kded5/ klipper/ knewstuff3/ kscreen/ konsole/ kwalletd/ ksysguard/ kmail2/ kcookiejar/ kactivitymanagerd/\n\ncd ../share/\nrm -rf dolphin kate kcookiejar kded5 keyrings klipper kmail2 knewstuff3 konsole kscreen ksysguard kwalletd kxmlgui5 plasma_engine_comic plasma plasma_notes org.kde.gwenview\n\ncd ../.config/\nrm -f plasma*\nrm -rf kde* akonadi* KDE kconf_updaterc baloo* dolphinrc drkonqirc gwenviewrc kmail2rc k*rc katemetainfos\n"})}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsx)(s.li,{children:"Shut down the live environment and remove the live USB drive."}),"\n",(0,n.jsx)(s.li,{children:"Reboot back into your regular Plasma session. Verify the issue is fixed."}),"\n",(0,n.jsx)(s.li,{children:"If you experience system instability, restore the previously backed up folders."}),"\n"]}),"\n",(0,n.jsx)(s.p,{children:"To restore an entire directory:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{children:"cp -rav .kde.bak/share/config/ .kde/share/config\n"})}),"\n",(0,n.jsx)(s.p,{children:"After restoring the files or directories, restart your system."})]})}function h(e={}){const{wrapper:s}={...(0,r.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},11151:(e,s,o)=>{o.d(s,{Z:()=>t,a:()=>l});var n=o(67294);const r={},i=n.createContext(r);function l(e){const s=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),n.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/da0423b8.d2dff3fd.js b/assets/js/da0423b8.d2dff3fd.js new file mode 100644 index 000000000..e66503a8a --- /dev/null +++ b/assets/js/da0423b8.d2dff3fd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3090],{5930:e=>{e.exports=JSON.parse('{"tag":{"label":"housekeeping","permalink":"/blog/tags/housekeeping","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/housekeeping","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/dabd6b33.d5c00ad6.js b/assets/js/dabd6b33.131692ae.js similarity index 98% rename from assets/js/dabd6b33.d5c00ad6.js rename to assets/js/dabd6b33.131692ae.js index 2819aebff..01294a3ba 100644 --- a/assets/js/dabd6b33.d5c00ad6.js +++ b/assets/js/dabd6b33.131692ae.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1059],{37101:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>r,default:()=>g,frontMatter:()=>s,metadata:()=>a,toc:()=>d});var n=t(85893),i=t(11151);const s={title:"Eopkg Configuration",summary:"Modifying the eopkg configuration"},r="Eopkg Configuration",a={id:"packaging/advanced-config/eopkg-configuration",title:"Eopkg Configuration",description:"The eopkg configuration file changes how eopkg works. The first section in the config has settings for the process of building a package. The second section allows you to configure the directories that eopkg uses for various operations. Lastly, the [general] section contains settings for the general operation of eopkg.",source:"@site/docs/packaging/advanced-config/eopkg-configuration.md",sourceDirName:"packaging/advanced-config",slug:"/packaging/advanced-config/eopkg-configuration",permalink:"/docs/packaging/advanced-config/eopkg-configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/advanced-config/eopkg-configuration.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Eopkg Configuration",summary:"Modifying the eopkg configuration"},sidebar:"packagingSidebar",previous:{title:"Advanced Configuration",permalink:"/docs/category/advanced-configuration"},next:{title:"Local Repository",permalink:"/docs/packaging/advanced-config/local-repository"}},c={},d=[{value:"Copying the default configuration",id:"copying-the-default-configuration",level:2},{value:"Notable keys",id:"notable-keys",level:2},{value:"Restoring defaults",id:"restoring-defaults",level:2}];function l(e){const o={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.header,{children:(0,n.jsx)(o.h1,{id:"eopkg-configuration",children:"Eopkg Configuration"})}),"\n",(0,n.jsxs)(o.p,{children:["The ",(0,n.jsx)(o.code,{children:"eopkg"})," configuration file changes how ",(0,n.jsx)(o.code,{children:"eopkg"})," works. The first section in the config has settings for the process of building a package. The second section allows you to configure the directories that ",(0,n.jsx)(o.code,{children:"eopkg"})," uses for various operations. Lastly, the ",(0,n.jsx)(o.code,{children:"[general]"})," section contains settings for the general operation of ",(0,n.jsx)(o.code,{children:"eopkg"}),"."]}),"\n",(0,n.jsx)(o.h2,{id:"copying-the-default-configuration",children:"Copying the default configuration"}),"\n",(0,n.jsxs)(o.p,{children:["Solus aims to be a stateless operating system, so the default configuration file for ",(0,n.jsx)(o.code,{children:"eopkg"})," is saved to ",(0,n.jsx)(o.code,{children:"/usr/share/defaults/eopkg/eopkg.conf"}),". To modify the configuration, you'll have to start by copying the default configuration file into ",(0,n.jsx)(o.code,{children:"/etc/eopkg"})," so it will override the default file:"]}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"sudo mkdir -p /etc/eopkg && sudo cp /usr/share/defaults/eopkg/eopkg.conf /etc/eopkg/eopkg.conf\n"})}),"\n",(0,n.jsx)(o.p,{children:"Once the file has been copied, you can edit it with your text editor of choice."}),"\n",(0,n.jsx)(o.h2,{id:"notable-keys",children:"Notable keys"}),"\n",(0,n.jsx)(o.p,{children:"Most keys in the config you'll probably want to leave untouched. However, some are useful to know about:"}),"\n",(0,n.jsxs)(o.table,{children:[(0,n.jsx)(o.thead,{children:(0,n.jsxs)(o.tr,{children:[(0,n.jsx)(o.th,{children:"Key"}),(0,n.jsx)(o.th,{children:"Description"}),(0,n.jsx)(o.th,{children:"Values"})]})}),(0,n.jsxs)(o.tbody,{children:[(0,n.jsxs)(o.tr,{children:[(0,n.jsx)(o.td,{children:"generateDebug"}),(0,n.jsx)(o.td,{children:"Whether or not debug symbol subpackages will be generated"}),(0,n.jsx)(o.td,{children:"True / False"})]}),(0,n.jsxs)(o.tr,{children:[(0,n.jsx)(o.td,{children:"jobs"}),(0,n.jsx)(o.td,{children:"How many building jobs to use when compiling the source"}),(0,n.jsx)(o.td,{children:"auto / number"})]}),(0,n.jsxs)(o.tr,{children:[(0,n.jsx)(o.td,{children:"retry_attempts"}),(0,n.jsx)(o.td,{children:"How many times to retry downloading a package during install"}),(0,n.jsx)(o.td,{children:"number"})]})]})]}),"\n",(0,n.jsx)(o.h2,{id:"restoring-defaults",children:"Restoring defaults"}),"\n",(0,n.jsxs)(o.p,{children:["If at any time you want to go back to the default configuration, simply remove the config file in ",(0,n.jsx)(o.code,{children:"/etc/eopkg"}),"."]})]})}function g(e={}){const{wrapper:o}={...(0,i.a)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},11151:(e,o,t)=>{t.d(o,{Z:()=>a,a:()=>r});var n=t(67294);const i={},s=n.createContext(i);function r(e){const o=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1059],{37101:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>r,default:()=>g,frontMatter:()=>s,metadata:()=>a,toc:()=>d});var n=t(85893),i=t(11151);const s={title:"Eopkg Configuration",summary:"Modifying the eopkg configuration"},r="Eopkg Configuration",a={id:"packaging/advanced-config/eopkg-configuration",title:"Eopkg Configuration",description:"The eopkg configuration file changes how eopkg works. The first section in the config has settings for the process of building a package. The second section allows you to configure the directories that eopkg uses for various operations. Lastly, the [general] section contains settings for the general operation of eopkg.",source:"@site/docs/packaging/advanced-config/eopkg-configuration.md",sourceDirName:"packaging/advanced-config",slug:"/packaging/advanced-config/eopkg-configuration",permalink:"/docs/packaging/advanced-config/eopkg-configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/packaging/advanced-config/eopkg-configuration.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Eopkg Configuration",summary:"Modifying the eopkg configuration"},sidebar:"packagingSidebar",previous:{title:"Advanced Configuration",permalink:"/docs/category/advanced-configuration"},next:{title:"Local Repository",permalink:"/docs/packaging/advanced-config/local-repository"}},c={},d=[{value:"Copying the default configuration",id:"copying-the-default-configuration",level:2},{value:"Notable keys",id:"notable-keys",level:2},{value:"Restoring defaults",id:"restoring-defaults",level:2}];function l(e){const o={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.header,{children:(0,n.jsx)(o.h1,{id:"eopkg-configuration",children:"Eopkg Configuration"})}),"\n",(0,n.jsxs)(o.p,{children:["The ",(0,n.jsx)(o.code,{children:"eopkg"})," configuration file changes how ",(0,n.jsx)(o.code,{children:"eopkg"})," works. The first section in the config has settings for the process of building a package. The second section allows you to configure the directories that ",(0,n.jsx)(o.code,{children:"eopkg"})," uses for various operations. Lastly, the ",(0,n.jsx)(o.code,{children:"[general]"})," section contains settings for the general operation of ",(0,n.jsx)(o.code,{children:"eopkg"}),"."]}),"\n",(0,n.jsx)(o.h2,{id:"copying-the-default-configuration",children:"Copying the default configuration"}),"\n",(0,n.jsxs)(o.p,{children:["Solus aims to be a stateless operating system, so the default configuration file for ",(0,n.jsx)(o.code,{children:"eopkg"})," is saved to ",(0,n.jsx)(o.code,{children:"/usr/share/defaults/eopkg/eopkg.conf"}),". To modify the configuration, you'll have to start by copying the default configuration file into ",(0,n.jsx)(o.code,{children:"/etc/eopkg"})," so it will override the default file:"]}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"sudo mkdir -p /etc/eopkg && sudo cp /usr/share/defaults/eopkg/eopkg.conf /etc/eopkg/eopkg.conf\n"})}),"\n",(0,n.jsx)(o.p,{children:"Once the file has been copied, you can edit it with your text editor of choice."}),"\n",(0,n.jsx)(o.h2,{id:"notable-keys",children:"Notable keys"}),"\n",(0,n.jsx)(o.p,{children:"Most keys in the config you'll probably want to leave untouched. However, some are useful to know about:"}),"\n",(0,n.jsxs)(o.table,{children:[(0,n.jsx)(o.thead,{children:(0,n.jsxs)(o.tr,{children:[(0,n.jsx)(o.th,{children:"Key"}),(0,n.jsx)(o.th,{children:"Description"}),(0,n.jsx)(o.th,{children:"Values"})]})}),(0,n.jsxs)(o.tbody,{children:[(0,n.jsxs)(o.tr,{children:[(0,n.jsx)(o.td,{children:"generateDebug"}),(0,n.jsx)(o.td,{children:"Whether or not debug symbol subpackages will be generated"}),(0,n.jsx)(o.td,{children:"True / False"})]}),(0,n.jsxs)(o.tr,{children:[(0,n.jsx)(o.td,{children:"jobs"}),(0,n.jsx)(o.td,{children:"How many building jobs to use when compiling the source"}),(0,n.jsx)(o.td,{children:"auto / number"})]}),(0,n.jsxs)(o.tr,{children:[(0,n.jsx)(o.td,{children:"retry_attempts"}),(0,n.jsx)(o.td,{children:"How many times to retry downloading a package during install"}),(0,n.jsx)(o.td,{children:"number"})]})]})]}),"\n",(0,n.jsx)(o.h2,{id:"restoring-defaults",children:"Restoring defaults"}),"\n",(0,n.jsxs)(o.p,{children:["If at any time you want to go back to the default configuration, simply remove the config file in ",(0,n.jsx)(o.code,{children:"/etc/eopkg"}),"."]})]})}function g(e={}){const{wrapper:o}={...(0,i.a)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},11151:(e,o,t)=>{t.d(o,{Z:()=>a,a:()=>r});var n=t(67294);const i={},s=n.createContext(i);function r(e){const o=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ddc41e4a.a13163e3.js b/assets/js/ddc41e4a.575fe33b.js similarity index 93% rename from assets/js/ddc41e4a.a13163e3.js rename to assets/js/ddc41e4a.575fe33b.js index 47886957b..29bf03798 100644 --- a/assets/js/ddc41e4a.a13163e3.js +++ b/assets/js/ddc41e4a.575fe33b.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9451],{3619:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>i,contentTitle:()=>u,default:()=>l,frontMatter:()=>r,metadata:()=>d,toc:()=>a});var n=s(85893),o=s(11151);const r={title:"Sound",summary:"Configuration of sound systems on Solus"},u="Sound",d={id:"user/software/sound/index",title:"Sound",description:"Solus comes with PipeWire configured by default.",source:"@site/docs/user/software/sound/index.md",sourceDirName:"user/software/sound",slug:"/user/software/sound/",permalink:"/docs/user/software/sound/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/sound/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Sound",summary:"Configuration of sound systems on Solus"},sidebar:"userSidebar",previous:{title:"XRDP",permalink:"/docs/user/software/networking/xrdp"},next:{title:"Third Party",permalink:"/docs/user/software/third-party/"}},i={},a=[];function c(e){const t={h1:"h1",header:"header",p:"p",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"sound",children:"Sound"})}),"\n",(0,n.jsx)(t.p,{children:"Solus comes with PipeWire configured by default."})]})}function l(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>d,a:()=>u});var n=s(67294);const o={},r=n.createContext(o);function u(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:u(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9451],{3619:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>i,contentTitle:()=>u,default:()=>l,frontMatter:()=>r,metadata:()=>d,toc:()=>a});var n=s(85893),o=s(11151);const r={title:"Sound",summary:"Configuration of sound systems on Solus"},u="Sound",d={id:"user/software/sound/index",title:"Sound",description:"Solus comes with PipeWire configured by default.",source:"@site/docs/user/software/sound/index.md",sourceDirName:"user/software/sound",slug:"/user/software/sound/",permalink:"/docs/user/software/sound/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/sound/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Sound",summary:"Configuration of sound systems on Solus"},sidebar:"userSidebar",previous:{title:"XRDP",permalink:"/docs/user/software/networking/xrdp"},next:{title:"Third Party",permalink:"/docs/user/software/third-party/"}},i={},a=[];function c(e){const t={h1:"h1",header:"header",p:"p",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"sound",children:"Sound"})}),"\n",(0,n.jsx)(t.p,{children:"Solus comes with PipeWire configured by default."})]})}function l(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>d,a:()=>u});var n=s(67294);const o={},r=n.createContext(o);function u(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:u(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e083e94b.b47a651b.js b/assets/js/e083e94b.4c5e9658.js similarity index 98% rename from assets/js/e083e94b.b47a651b.js rename to assets/js/e083e94b.4c5e9658.js index ac7052156..261fd33a8 100644 --- a/assets/js/e083e94b.b47a651b.js +++ b/assets/js/e083e94b.4c5e9658.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3056],{83514:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>p,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var t=s(85893),a=s(11151);const i={title:"Snap",summary:"Working with snaps"},r="Snap",o={id:"user/software/third-party/snap",title:"Snap",description:"Note that snaps are going to be removed from Solus in the future,",source:"@site/docs/user/software/third-party/snap.md",sourceDirName:"user/software/third-party",slug:"/user/software/third-party/snap",permalink:"/docs/user/software/third-party/snap",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/third-party/snap.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Snap",summary:"Working with snaps"},sidebar:"userSidebar",previous:{title:"Third Party",permalink:"/docs/user/software/third-party/"},next:{title:"Utilities",permalink:"/docs/category/utilities"}},l={},c=[{value:"Confinement warning",id:"confinement-warning",level:2},{value:"Migrating to Flatpak",id:"migrating-to-flatpak",level:2}];function d(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"snap",children:"Snap"})}),"\n",(0,t.jsx)(n.admonition,{type:"warning",children:(0,t.jsxs)(n.p,{children:["Note that snaps are going to be ",(0,t.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues/325",children:"removed from Solus in the future"}),",\nand are not fully confined in Solus with Linux 6.9 and newer.\nSee the section on confinement below."]})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://snapcraft.io/",children:"Snaps"})," are a way of installing third-party packages.\nThe ",(0,t.jsx)(n.code,{children:"snapd"})," package installs the CLI client that can be used to install and run snaps."]}),"\n",(0,t.jsx)(n.h2,{id:"confinement-warning",children:"Confinement warning"}),"\n",(0,t.jsxs)(n.p,{children:["Snaps are usually protected using ",(0,t.jsx)(n.code,{children:"strict"})," confinement,\nensuring that snaps can't access more of your system than needed.\nThe ",(0,t.jsx)(n.code,{children:"snap"})," command provided by Solus shows a warning when strict confinement is not available.\nFor example:"]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["WARNING: snap is running with partial confinement. See ",(0,t.jsx)(n.a,{href:"https://help.getsol.us/docs/user/software/third-party/snap",children:"https://help.getsol.us/docs/user/software/third-party/snap"})," for details"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["We recommend ",(0,t.jsx)(n.a,{href:"#migrating-to-flatpak",children:"migrating to Flatpak"})," when possible.\nThe warning can be silenced by running ",(0,t.jsx)(n.code,{children:"sudo snap hide-confinement-warning"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"migrating-to-flatpak",children:"Migrating to Flatpak"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"unsnap"})," package can be used to migrate from snap to Flatpak.\nWhile it does not actively remove user data in ",(0,t.jsx)(n.code,{children:"~/snap"})," or ",(0,t.jsx)(n.code,{children:"/var/lib/snapd"}),",\nwe cannot guarantee that no data gets removed on accident.\nPlease ensure you have system backups that include snap data."]}),"\n",(0,t.jsxs)(n.p,{children:["Run ",(0,t.jsx)(n.code,{children:"sudo unsnap"})," before migrating to see if all your snaps have known equivalents.\nLook for lines containing ",(0,t.jsx)(n.code,{children:"No equivalent flatpak for found"}),".\nCheck out ",(0,t.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues/3282",children:"this issue"})," if you encounter such snaps."]}),"\n",(0,t.jsxs)(n.p,{children:["Running ",(0,t.jsx)(n.code,{children:"sudo unsnap auto"})," will migrate as many snaps to Flatpak as possible.\nIt will also uninstall ",(0,t.jsx)(n.code,{children:"snapd"})," if all snaps were migrated."]}),"\n",(0,t.jsxs)(n.p,{children:["If ",(0,t.jsx)(n.code,{children:"unsnap"})," is unable to find an equivalent Flatpak for a snap, you have the following options:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Search for an equivalent Flatpak manually, and ",(0,t.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues/3282",children:"report it"})," if possible."]}),"\n",(0,t.jsx)(n.li,{children:"Install an equivalent tool from the package manager if possible."}),"\n",(0,t.jsx)(n.li,{children:"Uninstall the snap manually if it is not needed."}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["It is possible to rerun ",(0,t.jsx)(n.code,{children:"sudo unsnap auto"})," to finish removing ",(0,t.jsx)(n.code,{children:"snapd"}),"."]})]})}function p(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},11151:(e,n,s)=>{s.d(n,{Z:()=>o,a:()=>r});var t=s(67294);const a={},i=t.createContext(a);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3056],{83514:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>p,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var t=s(85893),a=s(11151);const i={title:"Snap",summary:"Working with snaps"},r="Snap",o={id:"user/software/third-party/snap",title:"Snap",description:"Note that snaps are going to be removed from Solus in the future,",source:"@site/docs/user/software/third-party/snap.md",sourceDirName:"user/software/third-party",slug:"/user/software/third-party/snap",permalink:"/docs/user/software/third-party/snap",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/third-party/snap.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Snap",summary:"Working with snaps"},sidebar:"userSidebar",previous:{title:"Third Party",permalink:"/docs/user/software/third-party/"},next:{title:"Utilities",permalink:"/docs/category/utilities"}},l={},c=[{value:"Confinement warning",id:"confinement-warning",level:2},{value:"Migrating to Flatpak",id:"migrating-to-flatpak",level:2}];function d(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"snap",children:"Snap"})}),"\n",(0,t.jsx)(n.admonition,{type:"warning",children:(0,t.jsxs)(n.p,{children:["Note that snaps are going to be ",(0,t.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues/325",children:"removed from Solus in the future"}),",\nand are not fully confined in Solus with Linux 6.9 and newer.\nSee the section on confinement below."]})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://snapcraft.io/",children:"Snaps"})," are a way of installing third-party packages.\nThe ",(0,t.jsx)(n.code,{children:"snapd"})," package installs the CLI client that can be used to install and run snaps."]}),"\n",(0,t.jsx)(n.h2,{id:"confinement-warning",children:"Confinement warning"}),"\n",(0,t.jsxs)(n.p,{children:["Snaps are usually protected using ",(0,t.jsx)(n.code,{children:"strict"})," confinement,\nensuring that snaps can't access more of your system than needed.\nThe ",(0,t.jsx)(n.code,{children:"snap"})," command provided by Solus shows a warning when strict confinement is not available.\nFor example:"]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["WARNING: snap is running with partial confinement. See ",(0,t.jsx)(n.a,{href:"https://help.getsol.us/docs/user/software/third-party/snap",children:"https://help.getsol.us/docs/user/software/third-party/snap"})," for details"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["We recommend ",(0,t.jsx)(n.a,{href:"#migrating-to-flatpak",children:"migrating to Flatpak"})," when possible.\nThe warning can be silenced by running ",(0,t.jsx)(n.code,{children:"sudo snap hide-confinement-warning"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"migrating-to-flatpak",children:"Migrating to Flatpak"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"unsnap"})," package can be used to migrate from snap to Flatpak.\nWhile it does not actively remove user data in ",(0,t.jsx)(n.code,{children:"~/snap"})," or ",(0,t.jsx)(n.code,{children:"/var/lib/snapd"}),",\nwe cannot guarantee that no data gets removed on accident.\nPlease ensure you have system backups that include snap data."]}),"\n",(0,t.jsxs)(n.p,{children:["Run ",(0,t.jsx)(n.code,{children:"sudo unsnap"})," before migrating to see if all your snaps have known equivalents.\nLook for lines containing ",(0,t.jsx)(n.code,{children:"No equivalent flatpak for found"}),".\nCheck out ",(0,t.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues/3282",children:"this issue"})," if you encounter such snaps."]}),"\n",(0,t.jsxs)(n.p,{children:["Running ",(0,t.jsx)(n.code,{children:"sudo unsnap auto"})," will migrate as many snaps to Flatpak as possible.\nIt will also uninstall ",(0,t.jsx)(n.code,{children:"snapd"})," if all snaps were migrated."]}),"\n",(0,t.jsxs)(n.p,{children:["If ",(0,t.jsx)(n.code,{children:"unsnap"})," is unable to find an equivalent Flatpak for a snap, you have the following options:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Search for an equivalent Flatpak manually, and ",(0,t.jsx)(n.a,{href:"https://github.com/getsolus/packages/issues/3282",children:"report it"})," if possible."]}),"\n",(0,t.jsx)(n.li,{children:"Install an equivalent tool from the package manager if possible."}),"\n",(0,t.jsx)(n.li,{children:"Uninstall the snap manually if it is not needed."}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["It is possible to rerun ",(0,t.jsx)(n.code,{children:"sudo unsnap auto"})," to finish removing ",(0,t.jsx)(n.code,{children:"snapd"}),"."]})]})}function p(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},11151:(e,n,s)=>{s.d(n,{Z:()=>o,a:()=>r});var t=s(67294);const a={},i=t.createContext(a);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e4134e95.3396276f.js b/assets/js/e4134e95.e4a2ef15.js similarity index 55% rename from assets/js/e4134e95.3396276f.js rename to assets/js/e4134e95.e4a2ef15.js index 11573b77f..a5e047f21 100644 --- a/assets/js/e4134e95.3396276f.js +++ b/assets/js/e4134e95.e4a2ef15.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8621],{80700:e=>{e.exports=JSON.parse('{"tag":{"label":"devlog","permalink":"/blog/tags/devlog","allTagsPath":"/blog/tags","count":3,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/devlog","page":1,"postsPerPage":3,"totalPages":1,"totalCount":3,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8621],{80700:e=>{e.exports=JSON.parse('{"tag":{"label":"devlog","permalink":"/blog/tags/devlog","allTagsPath":"/blog/tags","count":4,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/devlog","page":1,"postsPerPage":4,"totalPages":1,"totalCount":4,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/e5595530.5122f73c.js b/assets/js/e5595530.7a048164.js similarity index 99% rename from assets/js/e5595530.5122f73c.js rename to assets/js/e5595530.7a048164.js index 81041179e..139797f06 100644 --- a/assets/js/e5595530.5122f73c.js +++ b/assets/js/e5595530.7a048164.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1648],{4183:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>h,frontMatter:()=>l,metadata:()=>d,toc:()=>a});var r=n(85893),o=n(11151);const l={title:"Boot Management",summary:"Guide to customizing the Solus boot process"},s="Boot Management",d={id:"user/quick-start/boot-management",title:"Boot Management",description:"clr-boot-manager",source:"@site/docs/user/quick-start/boot-management.md",sourceDirName:"user/quick-start",slug:"/user/quick-start/boot-management",permalink:"/docs/user/quick-start/boot-management",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/boot-management.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Boot Management",summary:"Guide to customizing the Solus boot process"},sidebar:"userSidebar",previous:{title:"Quick Start",permalink:"/docs/category/quick-start"},next:{title:"Default Applications",permalink:"/docs/user/quick-start/default-applications"}},i={},a=[{value:"clr-boot-manager",id:"clr-boot-manager",level:2},{value:"Open the boot menu",id:"open-the-boot-menu",level:3},{value:"Displaying the boot menu by default every boot",id:"displaying-the-boot-menu-by-default-every-boot",level:3},{value:"Adding kernel parameters",id:"adding-kernel-parameters",level:3},{value:"Kernels",id:"kernels",level:2},{value:"Installing a different kernel branch",id:"installing-a-different-kernel-branch",level:3},{value:"Change the default kernel branch to boot",id:"change-the-default-kernel-branch-to-boot",level:3}];function c(e){const t={br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"boot-management",children:"Boot Management"})}),"\n",(0,r.jsx)(t.h2,{id:"clr-boot-manager",children:"clr-boot-manager"}),"\n",(0,r.jsxs)(t.p,{children:["Solus leverages ",(0,r.jsx)(t.code,{children:"clr-boot-manager"})," from the Clear Linux* project to manage its boot process.\nOn legacy BIOS systems, ",(0,r.jsx)(t.code,{children:"clr-boot-manager"})," will configure ",(0,r.jsx)(t.code,{children:"GRUB2"})," to properly boot your system.",(0,r.jsx)(t.br,{}),"\n","On modern UEFI systems, ",(0,r.jsx)(t.code,{children:"clr-boot-manager"})," will configure ",(0,r.jsx)(t.code,{children:"systemd-boot"})," instead.",(0,r.jsx)(t.br,{}),"\n","This means that any time we want to modify the boot process, ",(0,r.jsx)(t.code,{children:"clr-boot-manager"})," will be involved.",(0,r.jsx)(t.br,{}),"\n","Trying to modify the configurations manually may work temporarily, but will be overwritten eventually."]}),"\n",(0,r.jsx)(t.h3,{id:"open-the-boot-menu",children:"Open the boot menu"}),"\n",(0,r.jsx)(t.p,{children:"By default, EFI installs will not show the boot menu and boot directly into Solus. By hitting space bar (repeatedly) during boot, the boot menu will appear (it may take a couple of goes to get the timing right)."}),"\n",(0,r.jsx)(t.h3,{id:"displaying-the-boot-menu-by-default-every-boot",children:"Displaying the boot menu by default every boot"}),"\n",(0,r.jsx)(t.p,{children:"The following command will set the timeout of the boot loader to five seconds so that it appears by default:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"sudo clr-boot-manager set-timeout 5 && sudo clr-boot-manager update\n"})}),"\n",(0,r.jsx)(t.h3,{id:"adding-kernel-parameters",children:"Adding kernel parameters"}),"\n",(0,r.jsxs)(t.p,{children:["Kernel parameters can be appended to boot via creating a file for ",(0,r.jsx)(t.code,{children:"clr-boot-manager"})," to use when updating kernels. For example, to add ",(0,r.jsx)(t.code,{children:"nomodeset"})," to boot options, you would create a file in ",(0,r.jsx)(t.code,{children:"/etc/kernel/cmdline.d"})," (as sudo):"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"sudo mkdir -p /etc/kernel/cmdline.d\necho 'nomodeset' | sudo tee /etc/kernel/cmdline.d/40_nomodeset.conf\n"})}),"\n",(0,r.jsxs)(t.p,{children:["The settings should be on one line with a space between them. You will need to run ",(0,r.jsx)(t.code,{children:"sudo clr-boot-manager update"})," for the options to be appended to boot."]}),"\n",(0,r.jsx)(t.h2,{id:"kernels",children:"Kernels"}),"\n",(0,r.jsx)(t.h3,{id:"installing-a-different-kernel-branch",children:"Installing a different kernel branch"}),"\n",(0,r.jsxs)(t.p,{children:["By default, Solus utilizes our linux-current kernel. The separate kernel branches can be added by installing the ",(0,r.jsx)(t.code,{children:"linux-lts"})," or ",(0,r.jsx)(t.code,{children:"linux-current"})," packages. Note that each kernel has separate module packages, so if you use these kernel modules, you'll need to install the one related to the kernel you are adding."]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"linux-lts"}),(0,r.jsx)(t.th,{children:"linux-current"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"bbswitch"}),(0,r.jsx)(t.td,{children:"bbswitch-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"broadcom-sta"}),(0,r.jsx)(t.td,{children:"broadcom-sta-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"linux-lts-headers"}),(0,r.jsx)(t.td,{children:"linux-current-headers"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"nvidia-470-glx-driver"}),(0,r.jsx)(t.td,{children:"nvidia-470-glx-driver-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"nvidia-beta-driver"}),(0,r.jsx)(t.td,{children:"nvidia-beta-driver-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"nvidia-developer-driver"}),(0,r.jsx)(t.td,{children:"nvidia-developer-driver-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"nvidia-glx-driver"}),(0,r.jsx)(t.td,{children:"nvidia-glx-driver-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"openrazer"}),(0,r.jsx)(t.td,{children:"openrazer-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"rtl8852bu"}),(0,r.jsx)(t.td,{children:"rtl8852bu-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"v4l2loopback"}),(0,r.jsx)(t.td,{children:"v4l2loopback-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"vhba-module"}),(0,r.jsx)(t.td,{children:"vhba-module-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"virtualbox"}),(0,r.jsx)(t.td,{children:"virtualbox-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"xone"}),(0,r.jsx)(t.td,{children:"xone-current"})]})]})]}),"\n",(0,r.jsx)(t.h3,{id:"change-the-default-kernel-branch-to-boot",children:"Change the default kernel branch to boot"}),"\n",(0,r.jsxs)(t.p,{children:["After successfully booting into a kernel from the ",(0,r.jsx)(t.code,{children:"current"})," or ",(0,r.jsx)(t.code,{children:"lts"})," branches running ",(0,r.jsx)(t.code,{children:"sudo clr-boot-manager update"})," will make the booted kernel branch the default boot option going forward."]})]})}function h(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>s});var r=n(67294);const o={},l=r.createContext(o);function s(e){const t=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),r.createElement(l.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1648],{4183:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>h,frontMatter:()=>l,metadata:()=>d,toc:()=>a});var r=n(85893),o=n(11151);const l={title:"Boot Management",summary:"Guide to customizing the Solus boot process"},s="Boot Management",d={id:"user/quick-start/boot-management",title:"Boot Management",description:"clr-boot-manager",source:"@site/docs/user/quick-start/boot-management.md",sourceDirName:"user/quick-start",slug:"/user/quick-start/boot-management",permalink:"/docs/user/quick-start/boot-management",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/boot-management.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Boot Management",summary:"Guide to customizing the Solus boot process"},sidebar:"userSidebar",previous:{title:"Quick Start",permalink:"/docs/category/quick-start"},next:{title:"Default Applications",permalink:"/docs/user/quick-start/default-applications"}},i={},a=[{value:"clr-boot-manager",id:"clr-boot-manager",level:2},{value:"Open the boot menu",id:"open-the-boot-menu",level:3},{value:"Displaying the boot menu by default every boot",id:"displaying-the-boot-menu-by-default-every-boot",level:3},{value:"Adding kernel parameters",id:"adding-kernel-parameters",level:3},{value:"Kernels",id:"kernels",level:2},{value:"Installing a different kernel branch",id:"installing-a-different-kernel-branch",level:3},{value:"Change the default kernel branch to boot",id:"change-the-default-kernel-branch-to-boot",level:3}];function c(e){const t={br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"boot-management",children:"Boot Management"})}),"\n",(0,r.jsx)(t.h2,{id:"clr-boot-manager",children:"clr-boot-manager"}),"\n",(0,r.jsxs)(t.p,{children:["Solus leverages ",(0,r.jsx)(t.code,{children:"clr-boot-manager"})," from the Clear Linux* project to manage its boot process.\nOn legacy BIOS systems, ",(0,r.jsx)(t.code,{children:"clr-boot-manager"})," will configure ",(0,r.jsx)(t.code,{children:"GRUB2"})," to properly boot your system.",(0,r.jsx)(t.br,{}),"\n","On modern UEFI systems, ",(0,r.jsx)(t.code,{children:"clr-boot-manager"})," will configure ",(0,r.jsx)(t.code,{children:"systemd-boot"})," instead.",(0,r.jsx)(t.br,{}),"\n","This means that any time we want to modify the boot process, ",(0,r.jsx)(t.code,{children:"clr-boot-manager"})," will be involved.",(0,r.jsx)(t.br,{}),"\n","Trying to modify the configurations manually may work temporarily, but will be overwritten eventually."]}),"\n",(0,r.jsx)(t.h3,{id:"open-the-boot-menu",children:"Open the boot menu"}),"\n",(0,r.jsx)(t.p,{children:"By default, EFI installs will not show the boot menu and boot directly into Solus. By hitting space bar (repeatedly) during boot, the boot menu will appear (it may take a couple of goes to get the timing right)."}),"\n",(0,r.jsx)(t.h3,{id:"displaying-the-boot-menu-by-default-every-boot",children:"Displaying the boot menu by default every boot"}),"\n",(0,r.jsx)(t.p,{children:"The following command will set the timeout of the boot loader to five seconds so that it appears by default:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"sudo clr-boot-manager set-timeout 5 && sudo clr-boot-manager update\n"})}),"\n",(0,r.jsx)(t.h3,{id:"adding-kernel-parameters",children:"Adding kernel parameters"}),"\n",(0,r.jsxs)(t.p,{children:["Kernel parameters can be appended to boot via creating a file for ",(0,r.jsx)(t.code,{children:"clr-boot-manager"})," to use when updating kernels. For example, to add ",(0,r.jsx)(t.code,{children:"nomodeset"})," to boot options, you would create a file in ",(0,r.jsx)(t.code,{children:"/etc/kernel/cmdline.d"})," (as sudo):"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"sudo mkdir -p /etc/kernel/cmdline.d\necho 'nomodeset' | sudo tee /etc/kernel/cmdline.d/40_nomodeset.conf\n"})}),"\n",(0,r.jsxs)(t.p,{children:["The settings should be on one line with a space between them. You will need to run ",(0,r.jsx)(t.code,{children:"sudo clr-boot-manager update"})," for the options to be appended to boot."]}),"\n",(0,r.jsx)(t.h2,{id:"kernels",children:"Kernels"}),"\n",(0,r.jsx)(t.h3,{id:"installing-a-different-kernel-branch",children:"Installing a different kernel branch"}),"\n",(0,r.jsxs)(t.p,{children:["By default, Solus utilizes our linux-current kernel. The separate kernel branches can be added by installing the ",(0,r.jsx)(t.code,{children:"linux-lts"})," or ",(0,r.jsx)(t.code,{children:"linux-current"})," packages. Note that each kernel has separate module packages, so if you use these kernel modules, you'll need to install the one related to the kernel you are adding."]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"linux-lts"}),(0,r.jsx)(t.th,{children:"linux-current"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"bbswitch"}),(0,r.jsx)(t.td,{children:"bbswitch-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"broadcom-sta"}),(0,r.jsx)(t.td,{children:"broadcom-sta-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"linux-lts-headers"}),(0,r.jsx)(t.td,{children:"linux-current-headers"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"nvidia-470-glx-driver"}),(0,r.jsx)(t.td,{children:"nvidia-470-glx-driver-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"nvidia-beta-driver"}),(0,r.jsx)(t.td,{children:"nvidia-beta-driver-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"nvidia-developer-driver"}),(0,r.jsx)(t.td,{children:"nvidia-developer-driver-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"nvidia-glx-driver"}),(0,r.jsx)(t.td,{children:"nvidia-glx-driver-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"openrazer"}),(0,r.jsx)(t.td,{children:"openrazer-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"rtl8852bu"}),(0,r.jsx)(t.td,{children:"rtl8852bu-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"v4l2loopback"}),(0,r.jsx)(t.td,{children:"v4l2loopback-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"vhba-module"}),(0,r.jsx)(t.td,{children:"vhba-module-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"virtualbox"}),(0,r.jsx)(t.td,{children:"virtualbox-current"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"xone"}),(0,r.jsx)(t.td,{children:"xone-current"})]})]})]}),"\n",(0,r.jsx)(t.h3,{id:"change-the-default-kernel-branch-to-boot",children:"Change the default kernel branch to boot"}),"\n",(0,r.jsxs)(t.p,{children:["After successfully booting into a kernel from the ",(0,r.jsx)(t.code,{children:"current"})," or ",(0,r.jsx)(t.code,{children:"lts"})," branches running ",(0,r.jsx)(t.code,{children:"sudo clr-boot-manager update"})," will make the booted kernel branch the default boot option going forward."]})]})}function h(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>d,a:()=>s});var r=n(67294);const o={},l=r.createContext(o);function s(e){const t=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),r.createElement(l.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/eb074ba1.3fba08a5.js b/assets/js/eb074ba1.262484bb.js similarity index 99% rename from assets/js/eb074ba1.3fba08a5.js rename to assets/js/eb074ba1.262484bb.js index 97778bfaf..a6f7836d0 100644 --- a/assets/js/eb074ba1.3fba08a5.js +++ b/assets/js/eb074ba1.262484bb.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3705],{45247:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>a});var r=t(85893),n=t(11151);const i={title:"Configuration File Locations",summary:"Location of configuration files on Solus"},o="Configuration File Locations",d={id:"user/software/configuration_files",title:"Configuration File Locations",description:"These are the standard locations on a Solus installation for software configuration files.",source:"@site/docs/user/software/configuration_files.md",sourceDirName:"user/software",slug:"/user/software/configuration_files",permalink:"/docs/user/software/configuration_files",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/configuration_files.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Configuration File Locations",summary:"Location of configuration files on Solus"},sidebar:"userSidebar",previous:{title:"Command Line",permalink:"/docs/user/software/command-line/"},next:{title:"Desktops",permalink:"/docs/user/software/desktops/"}},c={},a=[];function l(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",header:"header",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"configuration-file-locations",children:"Configuration File Locations"})}),"\n",(0,r.jsx)(s.p,{children:"These are the standard locations on a Solus installation for software configuration files."}),"\n",(0,r.jsx)(s.admonition,{type:"note",children:(0,r.jsxs)(s.p,{children:['Solus uses a "stateless" system configuration. For what that means see the ',(0,r.jsx)(s.a,{href:"https://www.clearlinux.org/clear-linux-documentation/reference/manpages/stateless.7.html",children:"Clear Linux Guide to Stateless Configuration"}),"."]})}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Applies to"}),(0,r.jsx)(s.th,{children:"Location(s)"}),(0,r.jsx)(s.th,{children:"Priority"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.strong,{children:"User"}),(0,r.jsx)("br",{}),"- preserved during package updates"]}),(0,r.jsx)(s.td,{children:"Per-user"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"~/.config/"}),(0,r.jsx)("br",{}),(0,r.jsx)(s.code,{children:"~/"}),(0,r.jsx)("br",{}),"others"]}),(0,r.jsx)(s.td,{children:"Highest"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.strong,{children:"System"}),(0,r.jsx)("br",{}),"- preserved during package updates"]}),(0,r.jsx)(s.td,{children:"All users on the system"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"/etc/"})}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.strong,{children:"OS provided"})," (aka defaults)",(0,r.jsx)("br",{}),"- ",(0,r.jsx)(s.strong,{children:"overridden"})," by package updates"]}),(0,r.jsx)(s.td,{children:"All users on the system"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"/usr/share/defaults/"})}),(0,r.jsx)(s.td,{children:"Lowest"})]})]})]}),"\n",(0,r.jsx)(s.p,{children:"A user configuration file overrides the system configuration, and the system configuration overrides the OS provided configuration. If no user configuration is provided, then the system configuration is used, and if no system configuration is provided, then the OS provided configuration is used."}),"\n",(0,r.jsxs)(s.p,{children:["Different software expects user configuration files in different places. Many software packages store these under the ",(0,r.jsx)(s.code,{children:"XDG_CONFIG_HOME"})," directory: ",(0,r.jsx)(s.code,{children:"~/.config"}),". Some applications insist on placing them straight into the home directory. For example the ",(0,r.jsx)(s.code,{children:"fish"})," shell uses the ",(0,r.jsx)(s.code,{children:"~/.config/fish"})," directory to store user configurations, while the ",(0,r.jsx)(s.code,{children:"bash"})," shell uses the ",(0,r.jsx)(s.code,{children:"~/.bashrc"})," configuration file straight from the home directory. Consult documentation before customizing software to ensure you put things in the right place."]}),"\n",(0,r.jsx)(s.p,{children:"Some common configuration files:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Software"}),(0,r.jsx)(s.th,{children:"Configuration files"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"apcupsd"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"/etc/changeme"})})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"cups"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"/etc/cups/"})})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"/docs/user/software/networking/samba",children:"samba"})}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"/etc/samba/smb.conf"}),(0,r.jsx)("br",{}),(0,r.jsx)(s.code,{children:"/usr/share/defaults/samba/"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"pam"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"/etc/pam.d/"}),(0,r.jsx)("br",{}),(0,r.jsx)(s.code,{children:"/usr/share/defaults/etc/pam.d/"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ssh"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"$HOME/.ssh/"}),(0,r.jsx)("br",{}),(0,r.jsx)(s.code,{children:"/usr/share/defaults/etc/ssh/"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ssl"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"/etc/ssl/"}),(0,r.jsx)("br",{}),(0,r.jsx)(s.code,{children:"/usr/share/defaults/etc/ssl/"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"/docs/user/software/networking/tigervnc",children:"tigervnc"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"$HOME/.vnc/xstartup"})})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"/docs/user/software/networking/xrdp",children:"xrdp"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"/etc/X11/Xwrapper.config"})})]})]})]})]})}function h(e={}){const{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>d,a:()=>o});var r=t(67294);const n={},i=r.createContext(n);function o(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function d(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3705],{45247:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>a});var r=t(85893),n=t(11151);const i={title:"Configuration File Locations",summary:"Location of configuration files on Solus"},o="Configuration File Locations",d={id:"user/software/configuration_files",title:"Configuration File Locations",description:"These are the standard locations on a Solus installation for software configuration files.",source:"@site/docs/user/software/configuration_files.md",sourceDirName:"user/software",slug:"/user/software/configuration_files",permalink:"/docs/user/software/configuration_files",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/configuration_files.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Configuration File Locations",summary:"Location of configuration files on Solus"},sidebar:"userSidebar",previous:{title:"Command Line",permalink:"/docs/user/software/command-line/"},next:{title:"Desktops",permalink:"/docs/user/software/desktops/"}},c={},a=[];function l(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",header:"header",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"configuration-file-locations",children:"Configuration File Locations"})}),"\n",(0,r.jsx)(s.p,{children:"These are the standard locations on a Solus installation for software configuration files."}),"\n",(0,r.jsx)(s.admonition,{type:"note",children:(0,r.jsxs)(s.p,{children:['Solus uses a "stateless" system configuration. For what that means see the ',(0,r.jsx)(s.a,{href:"https://www.clearlinux.org/clear-linux-documentation/reference/manpages/stateless.7.html",children:"Clear Linux Guide to Stateless Configuration"}),"."]})}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Type"}),(0,r.jsx)(s.th,{children:"Applies to"}),(0,r.jsx)(s.th,{children:"Location(s)"}),(0,r.jsx)(s.th,{children:"Priority"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.strong,{children:"User"}),(0,r.jsx)("br",{}),"- preserved during package updates"]}),(0,r.jsx)(s.td,{children:"Per-user"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"~/.config/"}),(0,r.jsx)("br",{}),(0,r.jsx)(s.code,{children:"~/"}),(0,r.jsx)("br",{}),"others"]}),(0,r.jsx)(s.td,{children:"Highest"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.strong,{children:"System"}),(0,r.jsx)("br",{}),"- preserved during package updates"]}),(0,r.jsx)(s.td,{children:"All users on the system"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"/etc/"})}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.strong,{children:"OS provided"})," (aka defaults)",(0,r.jsx)("br",{}),"- ",(0,r.jsx)(s.strong,{children:"overridden"})," by package updates"]}),(0,r.jsx)(s.td,{children:"All users on the system"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"/usr/share/defaults/"})}),(0,r.jsx)(s.td,{children:"Lowest"})]})]})]}),"\n",(0,r.jsx)(s.p,{children:"A user configuration file overrides the system configuration, and the system configuration overrides the OS provided configuration. If no user configuration is provided, then the system configuration is used, and if no system configuration is provided, then the OS provided configuration is used."}),"\n",(0,r.jsxs)(s.p,{children:["Different software expects user configuration files in different places. Many software packages store these under the ",(0,r.jsx)(s.code,{children:"XDG_CONFIG_HOME"})," directory: ",(0,r.jsx)(s.code,{children:"~/.config"}),". Some applications insist on placing them straight into the home directory. For example the ",(0,r.jsx)(s.code,{children:"fish"})," shell uses the ",(0,r.jsx)(s.code,{children:"~/.config/fish"})," directory to store user configurations, while the ",(0,r.jsx)(s.code,{children:"bash"})," shell uses the ",(0,r.jsx)(s.code,{children:"~/.bashrc"})," configuration file straight from the home directory. Consult documentation before customizing software to ensure you put things in the right place."]}),"\n",(0,r.jsx)(s.p,{children:"Some common configuration files:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Software"}),(0,r.jsx)(s.th,{children:"Configuration files"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"apcupsd"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"/etc/changeme"})})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"cups"}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"/etc/cups/"})})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"/docs/user/software/networking/samba",children:"samba"})}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"/etc/samba/smb.conf"}),(0,r.jsx)("br",{}),(0,r.jsx)(s.code,{children:"/usr/share/defaults/samba/"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"pam"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"/etc/pam.d/"}),(0,r.jsx)("br",{}),(0,r.jsx)(s.code,{children:"/usr/share/defaults/etc/pam.d/"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ssh"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"$HOME/.ssh/"}),(0,r.jsx)("br",{}),(0,r.jsx)(s.code,{children:"/usr/share/defaults/etc/ssh/"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"ssl"}),(0,r.jsxs)(s.td,{children:[(0,r.jsx)(s.code,{children:"/etc/ssl/"}),(0,r.jsx)("br",{}),(0,r.jsx)(s.code,{children:"/usr/share/defaults/etc/ssl/"})]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"/docs/user/software/networking/tigervnc",children:"tigervnc"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"$HOME/.vnc/xstartup"})})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:(0,r.jsx)(s.a,{href:"/docs/user/software/networking/xrdp",children:"xrdp"})}),(0,r.jsx)(s.td,{children:(0,r.jsx)(s.code,{children:"/etc/X11/Xwrapper.config"})})]})]})]})]})}function h(e={}){const{wrapper:s}={...(0,n.a)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>d,a:()=>o});var r=t(67294);const n={},i=r.createContext(n);function o(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function d(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ec4e4367.046451b6.js b/assets/js/ec4e4367.94c4bdbd.js similarity index 97% rename from assets/js/ec4e4367.046451b6.js rename to assets/js/ec4e4367.94c4bdbd.js index 8cf672ddb..0e8a793d2 100644 --- a/assets/js/ec4e4367.046451b6.js +++ b/assets/js/ec4e4367.94c4bdbd.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4529],{76130:(e,o,r)=>{r.r(o),r.d(o,{assets:()=>a,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var n=r(85893),t=r(11151);const i={title:"Android",summary:"Quick guide to working with Android devices on Solus"},s="Android",d={id:"user/hardware/mobile/android",title:"Android",description:"For the most part, Android devices will work out of the box on Solus. The experience is similar to other operating systems.",source:"@site/docs/user/hardware/mobile/android.md",sourceDirName:"user/hardware/mobile",slug:"/user/hardware/mobile/android",permalink:"/docs/user/hardware/mobile/android",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/mobile/android.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Android",summary:"Quick guide to working with Android devices on Solus"},sidebar:"userSidebar",previous:{title:"Mobile",permalink:"/docs/category/mobile"},next:{title:"Apple",permalink:"/docs/user/hardware/mobile/apple"}},a={},l=[{value:"File management",id:"file-management",level:2},{value:"Developer tools",id:"developer-tools",level:2}];function c(e){const o={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.header,{children:(0,n.jsx)(o.h1,{id:"android",children:"Android"})}),"\n",(0,n.jsx)(o.p,{children:"For the most part, Android devices will work out of the box on Solus. The experience is similar to other operating systems."}),"\n",(0,n.jsx)(o.h2,{id:"file-management",children:"File management"}),"\n",(0,n.jsx)(o.p,{children:"TODO: Tutorial on accessing files from a file browser. Android screenshots would be nice to have."}),"\n",(0,n.jsx)(o.h2,{id:"developer-tools",children:"Developer tools"}),"\n",(0,n.jsxs)(o.p,{children:["Whether you are an Android developer or just need ",(0,n.jsx)(o.code,{children:"adb"})," or ",(0,n.jsx)(o.code,{children:"fastboot"})," for installing a ROM, we've got you covered! We just need to install ",(0,n.jsx)(o.code,{children:"android-tools"})," from the Software Center or command-line:"]}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"sudo eopkg install android-tools\n"})})]})}function u(e={}){const{wrapper:o}={...(0,t.a)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},11151:(e,o,r)=>{r.d(o,{Z:()=>d,a:()=>s});var n=r(67294);const t={},i=n.createContext(t);function s(e){const o=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function d(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),n.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4529],{76130:(e,o,r)=>{r.r(o),r.d(o,{assets:()=>a,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var n=r(85893),t=r(11151);const i={title:"Android",summary:"Quick guide to working with Android devices on Solus"},s="Android",d={id:"user/hardware/mobile/android",title:"Android",description:"For the most part, Android devices will work out of the box on Solus. The experience is similar to other operating systems.",source:"@site/docs/user/hardware/mobile/android.md",sourceDirName:"user/hardware/mobile",slug:"/user/hardware/mobile/android",permalink:"/docs/user/hardware/mobile/android",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/mobile/android.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Android",summary:"Quick guide to working with Android devices on Solus"},sidebar:"userSidebar",previous:{title:"Mobile",permalink:"/docs/category/mobile"},next:{title:"Apple",permalink:"/docs/user/hardware/mobile/apple"}},a={},l=[{value:"File management",id:"file-management",level:2},{value:"Developer tools",id:"developer-tools",level:2}];function c(e){const o={code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.header,{children:(0,n.jsx)(o.h1,{id:"android",children:"Android"})}),"\n",(0,n.jsx)(o.p,{children:"For the most part, Android devices will work out of the box on Solus. The experience is similar to other operating systems."}),"\n",(0,n.jsx)(o.h2,{id:"file-management",children:"File management"}),"\n",(0,n.jsx)(o.p,{children:"TODO: Tutorial on accessing files from a file browser. Android screenshots would be nice to have."}),"\n",(0,n.jsx)(o.h2,{id:"developer-tools",children:"Developer tools"}),"\n",(0,n.jsxs)(o.p,{children:["Whether you are an Android developer or just need ",(0,n.jsx)(o.code,{children:"adb"})," or ",(0,n.jsx)(o.code,{children:"fastboot"})," for installing a ROM, we've got you covered! We just need to install ",(0,n.jsx)(o.code,{children:"android-tools"})," from the Software Center or command-line:"]}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{className:"language-bash",children:"sudo eopkg install android-tools\n"})})]})}function u(e={}){const{wrapper:o}={...(0,t.a)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},11151:(e,o,r)=>{r.d(o,{Z:()=>d,a:()=>s});var n=r(67294);const t={},i=n.createContext(t);function s(e){const o=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function d(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),n.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ecdeb26c.7d2b7ea3.js b/assets/js/ecdeb26c.7d2b7ea3.js deleted file mode 100644 index c5c4d5e22..000000000 --- a/assets/js/ecdeb26c.7d2b7ea3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1971],{35247:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>r,contentTitle:()=>l,default:()=>p,frontMatter:()=>s,metadata:()=>i,toc:()=>d});var n=o(85893),a=o(11151);const s={title:"Don't call me MATE, pal!",slug:"don't-call-me-mate-pal",authors:"david",tags:["MATE","devlog","solus"],hide_table_of_contents:!1},l=void 0,i={permalink:"/blog/don't-call-me-mate-pal",source:"@site/devlog/2024-01-29-dont-call-me-mate.md",title:"Don't call me MATE, pal!",description:"Back in our 4.4 release post we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we're getting ready to ship the Solus MATE Transition Tool to move existing users off of MATE.",date:"2024-01-29T00:00:00.000Z",tags:[{inline:!0,label:"MATE",permalink:"/blog/tags/mate"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:2.645,hasTruncateMarker:!0,authors:[{name:"David Harder",title:"Solus Staff",page:{permalink:"/blog/authors/david"},socials:{github:"https://github.com/davidjharder"},imageURL:"https://avatars.githubusercontent.com/u/23007135?v=4",key:"david"}],frontMatter:{title:"Don't call me MATE, pal!",slug:"don't-call-me-mate-pal",authors:"david",tags:["MATE","devlog","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Intro to Optimizing Packages on Solus",permalink:"/blog/solus-optimizing-packages"},nextItem:{title:"eopkg is dead, long live eopkg",permalink:"/blog/eopkg-is-dead-long-live-eopkg"}},r={authorsImageUrls:[void 0]},d=[];function u(e){const t={a:"a",em:"em",p:"p",...(0,a.a)(),...e.components};return(0,n.jsxs)(t.p,{children:["Back in our ",(0,n.jsx)(t.a,{href:"https://getsol.us/2023/07/08/solus-4-4-released/",children:"4.4 release post"})," we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we're getting ready to ship the ",(0,n.jsx)(t.em,{children:"Solus MATE Transition Tool"})," to move existing users off of MATE."]})}function p(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},11151:(e,t,o)=>{o.d(t,{Z:()=>i,a:()=>l});var n=o(67294);const a={},s=n.createContext(a);function l(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:l(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ecdeb26c.df2e94ce.js b/assets/js/ecdeb26c.df2e94ce.js new file mode 100644 index 000000000..962854046 --- /dev/null +++ b/assets/js/ecdeb26c.df2e94ce.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1971],{35247:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>r,contentTitle:()=>l,default:()=>p,frontMatter:()=>s,metadata:()=>i,toc:()=>d});var n=o(85893),a=o(11151);const s={title:"Don't call me MATE, pal!",slug:"don't-call-me-mate-pal",authors:"david",tags:["MATE","devlog","solus"],hide_table_of_contents:!1},l=void 0,i={permalink:"/blog/don't-call-me-mate-pal",source:"@site/devlog/2024-01-29-dont-call-me-mate.md",title:"Don't call me MATE, pal!",description:"Back in our 4.4 release post we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we're getting ready to ship the Solus MATE Transition Tool to move existing users off of MATE.",date:"2024-01-29T00:00:00.000Z",tags:[{inline:!0,label:"MATE",permalink:"/blog/tags/mate"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:2.645,hasTruncateMarker:!0,authors:[{name:"David Harder",title:"Solus Staff",page:{permalink:"/blog/authors/david"},socials:{github:"https://github.com/davidjharder"},imageURL:"https://avatars.githubusercontent.com/u/23007135",key:"david"}],frontMatter:{title:"Don't call me MATE, pal!",slug:"don't-call-me-mate-pal",authors:"david",tags:["MATE","devlog","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Intro to Optimizing Packages on Solus",permalink:"/blog/solus-optimizing-packages"},nextItem:{title:"eopkg is dead, long live eopkg",permalink:"/blog/eopkg-is-dead-long-live-eopkg"}},r={authorsImageUrls:[void 0]},d=[];function u(e){const t={a:"a",em:"em",p:"p",...(0,a.a)(),...e.components};return(0,n.jsxs)(t.p,{children:["Back in our ",(0,n.jsx)(t.a,{href:"https://getsol.us/2023/07/08/solus-4-4-released/",children:"4.4 release post"})," we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we're getting ready to ship the ",(0,n.jsx)(t.em,{children:"Solus MATE Transition Tool"})," to move existing users off of MATE."]})}function p(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},11151:(e,t,o)=>{o.d(t,{Z:()=>i,a:()=>l});var n=o(67294);const a={},s=n.createContext(a);function l(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:l(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ed2a5927.28def90f.js b/assets/js/ed2a5927.0861dec6.js similarity index 97% rename from assets/js/ed2a5927.28def90f.js rename to assets/js/ed2a5927.0861dec6.js index a580df8c6..444c817f2 100644 --- a/assets/js/ed2a5927.28def90f.js +++ b/assets/js/ed2a5927.0861dec6.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4560],{18653:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=r(85893),s=r(11151);const o={title:"Software Center",summary:"Introduction to the Solus Software Center"},a="Software Center",i={id:"user/quick-start/software-center/index",title:"Software Center",description:"You can install software ranging from Google Chrome to LibreOffice, as well as update software, via our Software Center.",source:"@site/docs/user/quick-start/software-center/index.md",sourceDirName:"user/quick-start/software-center",slug:"/user/quick-start/software-center/",permalink:"/docs/user/quick-start/software-center/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/software-center/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Software Center",summary:"Introduction to the Solus Software Center"},sidebar:"userSidebar",previous:{title:"System Requirements",permalink:"/docs/user/quick-start/installation/system-requirements"},next:{title:"Contributing",permalink:"/docs/category/contributing"}},c={},u=[];function d(e){const t={a:"a",code:"code",h1:"h1",header:"header",img:"img",p:"p",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"software-center",children:"Software Center"})}),"\n",(0,n.jsx)(t.p,{children:"You can install software ranging from Google Chrome to LibreOffice, as well as update software, via our Software Center."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Software Center",src:r(34830).Z+"",width:"949",height:"698"})}),"\n",(0,n.jsxs)(t.p,{children:["Solus uses the ",(0,n.jsx)(t.code,{children:"eopkg"})," package manager, which is not compatible with either ",(0,n.jsx)(t.code,{children:"deb"})," or ",(0,n.jsx)(t.code,{children:"rpm"})," packages offered by other Linux-based operating systems.\nFor information on how to use eopkg directly, see the ",(0,n.jsx)(t.a,{href:"/docs/category/package-management/",children:"Package Management section"})]}),"\n",(0,n.jsx)(t.p,{children:'You can also use a number of distribution-agnostic (or "universal") package managers to install applications, including Snap, Flatpak, and AppImage.'})]})}function l(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},34830:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/solus-sc-563436dafaad570539db7231fc5ed77e.jpg"},11151:(e,t,r)=>{r.d(t,{Z:()=>i,a:()=>a});var n=r(67294);const s={},o=n.createContext(s);function a(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4560],{18653:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=r(85893),s=r(11151);const o={title:"Software Center",summary:"Introduction to the Solus Software Center"},a="Software Center",i={id:"user/quick-start/software-center/index",title:"Software Center",description:"You can install software ranging from Google Chrome to LibreOffice, as well as update software, via our Software Center.",source:"@site/docs/user/quick-start/software-center/index.md",sourceDirName:"user/quick-start/software-center",slug:"/user/quick-start/software-center/",permalink:"/docs/user/quick-start/software-center/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/software-center/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Software Center",summary:"Introduction to the Solus Software Center"},sidebar:"userSidebar",previous:{title:"System Requirements",permalink:"/docs/user/quick-start/installation/system-requirements"},next:{title:"Contributing",permalink:"/docs/category/contributing"}},c={},u=[];function d(e){const t={a:"a",code:"code",h1:"h1",header:"header",img:"img",p:"p",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"software-center",children:"Software Center"})}),"\n",(0,n.jsx)(t.p,{children:"You can install software ranging from Google Chrome to LibreOffice, as well as update software, via our Software Center."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Software Center",src:r(34830).Z+"",width:"949",height:"698"})}),"\n",(0,n.jsxs)(t.p,{children:["Solus uses the ",(0,n.jsx)(t.code,{children:"eopkg"})," package manager, which is not compatible with either ",(0,n.jsx)(t.code,{children:"deb"})," or ",(0,n.jsx)(t.code,{children:"rpm"})," packages offered by other Linux-based operating systems.\nFor information on how to use eopkg directly, see the ",(0,n.jsx)(t.a,{href:"/docs/category/package-management/",children:"Package Management section"})]}),"\n",(0,n.jsx)(t.p,{children:'You can also use a number of distribution-agnostic (or "universal") package managers to install applications, including Snap, Flatpak, and AppImage.'})]})}function l(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},34830:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/solus-sc-563436dafaad570539db7231fc5ed77e.jpg"},11151:(e,t,r)=>{r.d(t,{Z:()=>i,a:()=>a});var n=r(67294);const s={},o=n.createContext(s);function a(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ef8b811a.5c57c19d.js b/assets/js/ef8b811a.5c57c19d.js new file mode 100644 index 000000000..6d4ea9a72 --- /dev/null +++ b/assets/js/ef8b811a.5c57c19d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2644],{89441:t=>{t.exports=JSON.parse('{"authors":[{"name":"Joey Riches","title":"Solus Staff","page":{"permalink":"/blog/authors/joey"},"socials":{"github":"https://github.com/joebonrichie"},"imageURL":"https://avatars.githubusercontent.com/u/5338090","key":"joey","count":2},{"name":"David Harder","title":"Solus Staff","page":{"permalink":"/blog/authors/david"},"socials":{"github":"https://github.com/davidjharder"},"imageURL":"https://avatars.githubusercontent.com/u/23007135","key":"david","count":2},{"name":"Muhammad Alfi Syahrin","title":"Solus Staff","page":{"permalink":"/blog/authors/alfi"},"socials":{"github":"https://github.com/malfisya"},"imageURL":"https://avatars.githubusercontent.com/u/101771435","key":"alfi","count":1}]}')}}]); \ No newline at end of file diff --git a/assets/js/ef8b811a.ab1b8ff6.js b/assets/js/ef8b811a.ab1b8ff6.js deleted file mode 100644 index fe5a6453c..000000000 --- a/assets/js/ef8b811a.ab1b8ff6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2644],{89441:e=>{e.exports=JSON.parse('{"authors":[{"name":"Joey Riches","title":"Solus Staff","page":{"permalink":"/blog/authors/joey"},"socials":{"github":"https://github.com/joebonrichie"},"imageURL":"https://avatars.githubusercontent.com/u/5338090?s=400&u=f77ed45c7e83814ce3e8bd199fc293bd5b53682b&v=4","key":"joey","count":2},{"name":"David Harder","title":"Solus Staff","page":{"permalink":"/blog/authors/david"},"socials":{"github":"https://github.com/davidjharder"},"imageURL":"https://avatars.githubusercontent.com/u/23007135?v=4","key":"david","count":2}]}')}}]); \ No newline at end of file diff --git a/assets/js/f0629c21.6441b410.js b/assets/js/f0629c21.1ae44bab.js similarity index 99% rename from assets/js/f0629c21.6441b410.js rename to assets/js/f0629c21.1ae44bab.js index d7cf3b959..3f123e566 100644 --- a/assets/js/f0629c21.6441b410.js +++ b/assets/js/f0629c21.1ae44bab.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3375],{53126:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>u,frontMatter:()=>t,metadata:()=>r,toc:()=>d});var s=o(85893),i=o(11151);const t={title:"Open Broadcaster Software (OBS)",summary:"A quick start guide to OBS on Solus"},l="Open Broadcaster Software (OBS)",r={id:"user/software/web/obs",title:"Open Broadcaster Software (OBS)",description:"This article covers the installation of OBS Studio as well as the use of third-party plugins.",source:"@site/docs/user/software/web/obs.md",sourceDirName:"user/software/web",slug:"/user/software/web/obs",permalink:"/docs/user/software/web/obs",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/web/obs.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Open Broadcaster Software (OBS)",summary:"A quick start guide to OBS on Solus"},sidebar:"userSidebar",previous:{title:"Web",permalink:"/docs/category/web"},next:{title:"Troubleshooting",permalink:"/docs/user/troubleshooting/"}},a={},d=[{value:"Installation",id:"installation",level:2},{value:"Virtual camera",id:"virtual-camera",level:2},{value:"Plugins",id:"plugins",level:2},{value:"Known working plugins",id:"known-working-plugins",level:3},{value:"Input Overlay",id:"input-overlay",level:4}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"open-broadcaster-software-obs",children:"Open Broadcaster Software (OBS)"})}),"\n",(0,s.jsx)(n.p,{children:"This article covers the installation of OBS Studio as well as the use of third-party plugins."}),"\n",(0,s.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsxs)(n.p,{children:["To install OBS Studio, either open up the Software Center and type ",(0,s.jsx)(n.code,{children:"obs-studio"})," into the Search section or run the following command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install obs-studio\n"})}),"\n",(0,s.jsx)(n.h2,{id:"virtual-camera",children:"Virtual camera"}),"\n",(0,s.jsx)(n.p,{children:'OBS includes a virtual webcam device which can be used to send your OBS stream to video conferencing programs. In order to use this on Solus, you must first install from our repository a separate kernel module that is responsible for creating the necessary "loopback" device. There are two versions of this software available in the repository, you must choose the version that corresponds to the kernel you have installed.'}),"\n",(0,s.jsx)(n.p,{children:"To find out which kernel is installed, run:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"uname -r\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This should return a version which ends in ",(0,s.jsx)(n.code,{children:".current"})," or ",(0,s.jsx)(n.code,{children:".lts"}),"."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:['If you are running the "current" kernel, install ',(0,s.jsx)(n.code,{children:"v4l2loopback-current"}),": ",(0,s.jsx)(n.code,{children:"sudo eopkg install v4l2loopback-current"})]}),"\n",(0,s.jsxs)(n.li,{children:['If you are running the "lts" kernel, install ',(0,s.jsx)(n.code,{children:"v4l2loopback"}),": ",(0,s.jsx)(n.code,{children:"sudo eopkg install v4l2loopback"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Once v4l2loopback is installed, reboot your computer. Next time you start OBS, it will prompt you for your password to set up v4l2loopback. After that, the virtual camera should be available as a webcam in other programs."}),"\n",(0,s.jsx)(n.h2,{id:"plugins",children:"Plugins"}),"\n",(0,s.jsxs)(n.p,{children:["All OBS Studio plugins should be installed into their own respective folders inside the ",(0,s.jsx)(n.code,{children:"~/.config/obs-studio/plugins"})," folder. If this folder does not exist for you, you'll need to create it before copying plugins into it."]}),"\n",(0,s.jsx)(n.p,{children:"When installing a plugin, the directory tree should look something like the following:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"plugins\n\u2514\u2500\u2500 plugin-name\n \u251c\u2500\u2500 bin\n \u2502\xa0\xa0 \u2514\u2500\u2500 64bit\n \u2502\xa0\xa0 \u2514\u2500\u2500 filename.so\n \u251c\u2500\u2500 data\n \u2502\xa0\xa0 \u2514\u2500\u2500 locale\n \u2502\xa0\xa0 \u2514\u2500\u2500 en-US.ini\n"})}),"\n",(0,s.jsxs)(n.p,{children:["In essence, you should have ",(0,s.jsx)(n.code,{children:"bin/64bit"})," folders inside the plugin folder, with any shared object plugin files inside that. As OBS Studio for Solus only supports 64-bit, the plugin ",(0,s.jsx)(n.strong,{children:"must"})," support 64-bit as well."]}),"\n",(0,s.jsxs)(n.p,{children:["Additionally, the plugin may come with additional files or folders, such as locale information. That locale information should be located in ",(0,s.jsx)(n.code,{children:"data/locale"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Most Linux-supporting plugins should provide pre-compiled tarballs or zip files that you can extract to get a pre-made / ready folder structure that you can simply copy / paste into ",(0,s.jsx)(n.code,{children:"~/.config/obs-studio/plugins"})]}),"\n",(0,s.jsx)(n.h3,{id:"known-working-plugins",children:"Known working plugins"}),"\n",(0,s.jsx)(n.h4,{id:"input-overlay",children:"Input Overlay"}),"\n",(0,s.jsxs)(n.p,{children:["The Input Overlay plugin enables you to show an input overlay of your gamepad, mouse, or keyboard. Pre-compiled release files are available on the Releases section of the ",(0,s.jsx)(n.a,{href:"https://github.com/univrsal/input-overlay",children:"developer's website"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"To install Input Overlay, download the input-overlay-vNUM.zip file from their releases page, where NUM is the latest release number, such as 4.4."}),"\n",(0,s.jsx)(n.p,{children:"Next, we'll install a library necessary to use the Input Overlay plugin, as well as an unzip tool to make the installation process easier. Run the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install libuiohook unzip\n"})}),"\n",(0,s.jsx)(n.p,{children:"Next, click on the zip file in your File Manager to open up the Extract tool (such as File Roller). You will be presented with contents like the following."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Input Overlay Zip",src:o(45594).Z+"",width:"770",height:"348"})}),"\n",(0,s.jsxs)(n.p,{children:["Let's extract this to our Downloads folder to make the process of copying the contents we need more easily. Click the Extract button in the image indicated above. This will present you with a file dialog. Navigate to the Downloads folder and click Extract. This will create a folder, likely called something similar to ",(0,s.jsx)(n.code,{children:"input-overlay.v4.4"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"Next let's run the following commands in the Terminal. The commands below will:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Remove our zip file to make our directory renaming more reliable."}),"\n",(0,s.jsx)(n.li,{children:"Move our extracted input overlay in our Downloads directory to one which is without a version number, to make it easier for future commands."}),"\n",(0,s.jsx)(n.li,{children:"Extract all the preset zips and remove their zip files"}),"\n",(0,s.jsxs)(n.li,{children:["Create an ",(0,s.jsx)(n.code,{children:"input-overlay"})," folder in ",(0,s.jsx)(n.code,{children:"~/.config/obs-studio/plugins"})," as well as creating the ",(0,s.jsx)(n.code,{children:"plugins"})," folder if needed."]}),"\n",(0,s.jsx)(n.li,{children:"Copy over the necessary and recommended folders and files to our input-overlay plugin folder."}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'rm ~/Downloads/input-overlay*.zip\nmv ~/Downloads/input-overlay.v* ~/Downloads/input-overlay\ncd ~/Downloads/input-overlay/presets\nfor file in `ls *.zip`; do unzip "${file}" -d "${file:0:-4}"; done\nrm *.zip\nmkdir -p ~/.config/obs-studio/plugins/input-overlay\ncp -R ~/Downloads/input-overlay/plugin-linux/* ~/.config/obs-studio/plugins/input-overlay/\ncp -R ~/Downloads/input-overlay/presets ~/.config/obs-studio/plugins/input-overlay/\n'})}),"\n",(0,s.jsx)(n.p,{children:"Now the Input Overlay source is available to us as a source (if you have OBS Studio already open, restart it), as shown in the below screenshot."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Input Overlay: Source Menu",src:o(27549).Z+"",width:"1000",height:"600"})}),"\n",(0,s.jsx)(n.p,{children:"Upon clicking on this source, we'll be presented with the usual add / use existing source dialog."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Input Overlay: Add Existing Source",src:o(52985).Z+"",width:"791",height:"540"})}),"\n",(0,s.jsx)(n.p,{children:"After naming a source, such as \"Mouse\", click OK and you'll be presented with a dialog that looks similar to below. Do note that yours will be empty by default, as you've not yet selected an Overlay image file and Layout config file yet."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Input Overlay: Main Source",src:o(1515).Z+"",width:"1032",height:"783"})}),"\n",(0,s.jsxs)(n.p,{children:["This is where the presets come in handy. Click the Browse button for Overlay image file and navigate to ",(0,s.jsx)(n.code,{children:".config/obs-studio/plugins/presets"})," and then the respective preset you want, such as mouse, and then the PNG within it. ",(0,s.jsx)(n.strong,{children:"You will need to enable hidden files"})," in the file dialog by using the keyboard combination ",(0,s.jsx)(n.code,{children:"Ctrl+H"})," to see ",(0,s.jsx)(n.code,{children:".config"})]}),"\n",(0,s.jsxs)(n.p,{children:["Next, do the same for Layout config overlay, but instead go to the same folder as your PNG and select the ",(0,s.jsx)(n.code,{children:"ini"})," file."]}),"\n",(0,s.jsx)(n.p,{children:'If you\'re using a mouse or gamepad, be sure to check the "Mouse overlay" or "Gamepad overlay" boxes respectively and tweak settings as you see fit.'})]})}function u(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},52985:(e,n,o)=>{o.d(n,{Z:()=>s});const s=o.p+"assets/images/input-overlay-source-add-existing-d472cc90ae7590dd14f41fa8e7a249d5.jpg"},1515:(e,n,o)=>{o.d(n,{Z:()=>s});const s=o.p+"assets/images/input-overlay-source-main-8fdfb8ec5ad7ba5006f03737eebcc8c8.jpg"},27549:(e,n,o)=>{o.d(n,{Z:()=>s});const s=o.p+"assets/images/input-overlay-source-menu-ef421b6d9afa2c80e8f2c84e15adb843.jpg"},45594:(e,n,o)=>{o.d(n,{Z:()=>s});const s=o.p+"assets/images/input-overlay-zip-12cbf3b807ebdf130723291e940f425d.jpg"},11151:(e,n,o)=>{o.d(n,{Z:()=>r,a:()=>l});var s=o(67294);const i={},t=s.createContext(i);function l(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[3375],{53126:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>u,frontMatter:()=>t,metadata:()=>r,toc:()=>d});var s=o(85893),i=o(11151);const t={title:"Open Broadcaster Software (OBS)",summary:"A quick start guide to OBS on Solus"},l="Open Broadcaster Software (OBS)",r={id:"user/software/web/obs",title:"Open Broadcaster Software (OBS)",description:"This article covers the installation of OBS Studio as well as the use of third-party plugins.",source:"@site/docs/user/software/web/obs.md",sourceDirName:"user/software/web",slug:"/user/software/web/obs",permalink:"/docs/user/software/web/obs",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/web/obs.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Open Broadcaster Software (OBS)",summary:"A quick start guide to OBS on Solus"},sidebar:"userSidebar",previous:{title:"Web",permalink:"/docs/category/web"},next:{title:"Troubleshooting",permalink:"/docs/user/troubleshooting/"}},a={},d=[{value:"Installation",id:"installation",level:2},{value:"Virtual camera",id:"virtual-camera",level:2},{value:"Plugins",id:"plugins",level:2},{value:"Known working plugins",id:"known-working-plugins",level:3},{value:"Input Overlay",id:"input-overlay",level:4}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"open-broadcaster-software-obs",children:"Open Broadcaster Software (OBS)"})}),"\n",(0,s.jsx)(n.p,{children:"This article covers the installation of OBS Studio as well as the use of third-party plugins."}),"\n",(0,s.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,s.jsxs)(n.p,{children:["To install OBS Studio, either open up the Software Center and type ",(0,s.jsx)(n.code,{children:"obs-studio"})," into the Search section or run the following command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install obs-studio\n"})}),"\n",(0,s.jsx)(n.h2,{id:"virtual-camera",children:"Virtual camera"}),"\n",(0,s.jsx)(n.p,{children:'OBS includes a virtual webcam device which can be used to send your OBS stream to video conferencing programs. In order to use this on Solus, you must first install from our repository a separate kernel module that is responsible for creating the necessary "loopback" device. There are two versions of this software available in the repository, you must choose the version that corresponds to the kernel you have installed.'}),"\n",(0,s.jsx)(n.p,{children:"To find out which kernel is installed, run:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"uname -r\n"})}),"\n",(0,s.jsxs)(n.p,{children:["This should return a version which ends in ",(0,s.jsx)(n.code,{children:".current"})," or ",(0,s.jsx)(n.code,{children:".lts"}),"."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:['If you are running the "current" kernel, install ',(0,s.jsx)(n.code,{children:"v4l2loopback-current"}),": ",(0,s.jsx)(n.code,{children:"sudo eopkg install v4l2loopback-current"})]}),"\n",(0,s.jsxs)(n.li,{children:['If you are running the "lts" kernel, install ',(0,s.jsx)(n.code,{children:"v4l2loopback"}),": ",(0,s.jsx)(n.code,{children:"sudo eopkg install v4l2loopback"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Once v4l2loopback is installed, reboot your computer. Next time you start OBS, it will prompt you for your password to set up v4l2loopback. After that, the virtual camera should be available as a webcam in other programs."}),"\n",(0,s.jsx)(n.h2,{id:"plugins",children:"Plugins"}),"\n",(0,s.jsxs)(n.p,{children:["All OBS Studio plugins should be installed into their own respective folders inside the ",(0,s.jsx)(n.code,{children:"~/.config/obs-studio/plugins"})," folder. If this folder does not exist for you, you'll need to create it before copying plugins into it."]}),"\n",(0,s.jsx)(n.p,{children:"When installing a plugin, the directory tree should look something like the following:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"plugins\n\u2514\u2500\u2500 plugin-name\n \u251c\u2500\u2500 bin\n \u2502\xa0\xa0 \u2514\u2500\u2500 64bit\n \u2502\xa0\xa0 \u2514\u2500\u2500 filename.so\n \u251c\u2500\u2500 data\n \u2502\xa0\xa0 \u2514\u2500\u2500 locale\n \u2502\xa0\xa0 \u2514\u2500\u2500 en-US.ini\n"})}),"\n",(0,s.jsxs)(n.p,{children:["In essence, you should have ",(0,s.jsx)(n.code,{children:"bin/64bit"})," folders inside the plugin folder, with any shared object plugin files inside that. As OBS Studio for Solus only supports 64-bit, the plugin ",(0,s.jsx)(n.strong,{children:"must"})," support 64-bit as well."]}),"\n",(0,s.jsxs)(n.p,{children:["Additionally, the plugin may come with additional files or folders, such as locale information. That locale information should be located in ",(0,s.jsx)(n.code,{children:"data/locale"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Most Linux-supporting plugins should provide pre-compiled tarballs or zip files that you can extract to get a pre-made / ready folder structure that you can simply copy / paste into ",(0,s.jsx)(n.code,{children:"~/.config/obs-studio/plugins"})]}),"\n",(0,s.jsx)(n.h3,{id:"known-working-plugins",children:"Known working plugins"}),"\n",(0,s.jsx)(n.h4,{id:"input-overlay",children:"Input Overlay"}),"\n",(0,s.jsxs)(n.p,{children:["The Input Overlay plugin enables you to show an input overlay of your gamepad, mouse, or keyboard. Pre-compiled release files are available on the Releases section of the ",(0,s.jsx)(n.a,{href:"https://github.com/univrsal/input-overlay",children:"developer's website"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"To install Input Overlay, download the input-overlay-vNUM.zip file from their releases page, where NUM is the latest release number, such as 4.4."}),"\n",(0,s.jsx)(n.p,{children:"Next, we'll install a library necessary to use the Input Overlay plugin, as well as an unzip tool to make the installation process easier. Run the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo eopkg install libuiohook unzip\n"})}),"\n",(0,s.jsx)(n.p,{children:"Next, click on the zip file in your File Manager to open up the Extract tool (such as File Roller). You will be presented with contents like the following."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Input Overlay Zip",src:o(45594).Z+"",width:"770",height:"348"})}),"\n",(0,s.jsxs)(n.p,{children:["Let's extract this to our Downloads folder to make the process of copying the contents we need more easily. Click the Extract button in the image indicated above. This will present you with a file dialog. Navigate to the Downloads folder and click Extract. This will create a folder, likely called something similar to ",(0,s.jsx)(n.code,{children:"input-overlay.v4.4"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"Next let's run the following commands in the Terminal. The commands below will:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Remove our zip file to make our directory renaming more reliable."}),"\n",(0,s.jsx)(n.li,{children:"Move our extracted input overlay in our Downloads directory to one which is without a version number, to make it easier for future commands."}),"\n",(0,s.jsx)(n.li,{children:"Extract all the preset zips and remove their zip files"}),"\n",(0,s.jsxs)(n.li,{children:["Create an ",(0,s.jsx)(n.code,{children:"input-overlay"})," folder in ",(0,s.jsx)(n.code,{children:"~/.config/obs-studio/plugins"})," as well as creating the ",(0,s.jsx)(n.code,{children:"plugins"})," folder if needed."]}),"\n",(0,s.jsx)(n.li,{children:"Copy over the necessary and recommended folders and files to our input-overlay plugin folder."}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'rm ~/Downloads/input-overlay*.zip\nmv ~/Downloads/input-overlay.v* ~/Downloads/input-overlay\ncd ~/Downloads/input-overlay/presets\nfor file in `ls *.zip`; do unzip "${file}" -d "${file:0:-4}"; done\nrm *.zip\nmkdir -p ~/.config/obs-studio/plugins/input-overlay\ncp -R ~/Downloads/input-overlay/plugin-linux/* ~/.config/obs-studio/plugins/input-overlay/\ncp -R ~/Downloads/input-overlay/presets ~/.config/obs-studio/plugins/input-overlay/\n'})}),"\n",(0,s.jsx)(n.p,{children:"Now the Input Overlay source is available to us as a source (if you have OBS Studio already open, restart it), as shown in the below screenshot."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Input Overlay: Source Menu",src:o(27549).Z+"",width:"1000",height:"600"})}),"\n",(0,s.jsx)(n.p,{children:"Upon clicking on this source, we'll be presented with the usual add / use existing source dialog."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Input Overlay: Add Existing Source",src:o(52985).Z+"",width:"791",height:"540"})}),"\n",(0,s.jsx)(n.p,{children:"After naming a source, such as \"Mouse\", click OK and you'll be presented with a dialog that looks similar to below. Do note that yours will be empty by default, as you've not yet selected an Overlay image file and Layout config file yet."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Input Overlay: Main Source",src:o(1515).Z+"",width:"1032",height:"783"})}),"\n",(0,s.jsxs)(n.p,{children:["This is where the presets come in handy. Click the Browse button for Overlay image file and navigate to ",(0,s.jsx)(n.code,{children:".config/obs-studio/plugins/presets"})," and then the respective preset you want, such as mouse, and then the PNG within it. ",(0,s.jsx)(n.strong,{children:"You will need to enable hidden files"})," in the file dialog by using the keyboard combination ",(0,s.jsx)(n.code,{children:"Ctrl+H"})," to see ",(0,s.jsx)(n.code,{children:".config"})]}),"\n",(0,s.jsxs)(n.p,{children:["Next, do the same for Layout config overlay, but instead go to the same folder as your PNG and select the ",(0,s.jsx)(n.code,{children:"ini"})," file."]}),"\n",(0,s.jsx)(n.p,{children:'If you\'re using a mouse or gamepad, be sure to check the "Mouse overlay" or "Gamepad overlay" boxes respectively and tweak settings as you see fit.'})]})}function u(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},52985:(e,n,o)=>{o.d(n,{Z:()=>s});const s=o.p+"assets/images/input-overlay-source-add-existing-d472cc90ae7590dd14f41fa8e7a249d5.jpg"},1515:(e,n,o)=>{o.d(n,{Z:()=>s});const s=o.p+"assets/images/input-overlay-source-main-8fdfb8ec5ad7ba5006f03737eebcc8c8.jpg"},27549:(e,n,o)=>{o.d(n,{Z:()=>s});const s=o.p+"assets/images/input-overlay-source-menu-ef421b6d9afa2c80e8f2c84e15adb843.jpg"},45594:(e,n,o)=>{o.d(n,{Z:()=>s});const s=o.p+"assets/images/input-overlay-zip-12cbf3b807ebdf130723291e940f425d.jpg"},11151:(e,n,o)=>{o.d(n,{Z:()=>r,a:()=>l});var s=o(67294);const i={},t=s.createContext(i);function l(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f1d13e1b.d545ae72.js b/assets/js/f1d13e1b.673f76b1.js similarity index 94% rename from assets/js/f1d13e1b.d545ae72.js rename to assets/js/f1d13e1b.673f76b1.js index 2b39e38c3..d07dcfa15 100644 --- a/assets/js/f1d13e1b.d545ae72.js +++ b/assets/js/f1d13e1b.673f76b1.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[5462],{16467:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var r=s(85893),n=s(11151);const i={title:"Tips and Tricks",summary:"Helpful tips and tricks for using MATE on Solus"},o="Tips and Tricks",a={id:"user/editions/mate/tips-and-tricks",title:"Tips and Tricks",description:"MATE Keyboard Shortcuts",source:"@site/docs/user/editions/mate/tips-and-tricks.md",sourceDirName:"user/editions/mate",slug:"/user/editions/mate/tips-and-tricks",permalink:"/docs/user/editions/mate/tips-and-tricks",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/mate/tips-and-tricks.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Tips and Tricks",summary:"Helpful tips and tricks for using MATE on Solus"},sidebar:"userSidebar",previous:{title:"Configuration",permalink:"/docs/user/editions/mate/configuration"},next:{title:"Plasma",permalink:"/docs/user/editions/plasma/"}},d={},c=[{value:"MATE Keyboard Shortcuts",id:"mate-keyboard-shortcuts",level:2}];function u(e){const t={h1:"h1",h2:"h2",header:"header",p:"p",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,r.jsx)(t.h2,{id:"mate-keyboard-shortcuts",children:"MATE Keyboard Shortcuts"}),"\n",(0,r.jsx)(t.p,{children:"TODO: Provide a table of short-cuts like we did for Budgie"}),"\n",(0,r.jsx)(t.p,{children:"TODO: Add a few other tips and tricks useful to MATE users"})]})}function l(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>a,a:()=>o});var r=s(67294);const n={},i=r.createContext(n);function o(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[5462],{16467:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var r=s(85893),n=s(11151);const i={title:"Tips and Tricks",summary:"Helpful tips and tricks for using MATE on Solus"},o="Tips and Tricks",a={id:"user/editions/mate/tips-and-tricks",title:"Tips and Tricks",description:"MATE Keyboard Shortcuts",source:"@site/docs/user/editions/mate/tips-and-tricks.md",sourceDirName:"user/editions/mate",slug:"/user/editions/mate/tips-and-tricks",permalink:"/docs/user/editions/mate/tips-and-tricks",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/mate/tips-and-tricks.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Tips and Tricks",summary:"Helpful tips and tricks for using MATE on Solus"},sidebar:"userSidebar",previous:{title:"Configuration",permalink:"/docs/user/editions/mate/configuration"},next:{title:"Plasma",permalink:"/docs/user/editions/plasma/"}},d={},c=[{value:"MATE Keyboard Shortcuts",id:"mate-keyboard-shortcuts",level:2}];function u(e){const t={h1:"h1",h2:"h2",header:"header",p:"p",...(0,n.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"tips-and-tricks",children:"Tips and Tricks"})}),"\n",(0,r.jsx)(t.h2,{id:"mate-keyboard-shortcuts",children:"MATE Keyboard Shortcuts"}),"\n",(0,r.jsx)(t.p,{children:"TODO: Provide a table of short-cuts like we did for Budgie"}),"\n",(0,r.jsx)(t.p,{children:"TODO: Add a few other tips and tricks useful to MATE users"})]})}function l(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},11151:(e,t,s)=>{s.d(t,{Z:()=>a,a:()=>o});var r=s(67294);const n={},i=r.createContext(n);function o(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f35b91b6.0a1e43f9.js b/assets/js/f35b91b6.0a1e43f9.js deleted file mode 100644 index 2da45b525..000000000 --- a/assets/js/f35b91b6.0a1e43f9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9749],{78677:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>r,contentTitle:()=>i,default:()=>h,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var s=t(85893),l=t(11151);const n={title:"Welcome to the Solus Devlog",description:"Welcome to the Solus Development Log.",slug:"welcome-solus-devlog-v1",authors:"joey",tags:["hello","devlog","firstpost","solus"],hide_table_of_contents:!1},i=void 0,a={permalink:"/blog/welcome-solus-devlog-v1",source:"@site/devlog/2024-01-13-welcome-devlog.md",title:"Welcome to the Solus Devlog",description:"Welcome to the Solus Development Log.",date:"2024-01-13T00:00:00.000Z",tags:[{inline:!0,label:"hello",permalink:"/blog/tags/hello"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"firstpost",permalink:"/blog/tags/firstpost"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:.9,hasTruncateMarker:!0,authors:[{name:"Joey Riches",title:"Solus Staff",page:{permalink:"/blog/authors/joey"},socials:{github:"https://github.com/joebonrichie"},imageURL:"https://avatars.githubusercontent.com/u/5338090?s=400&u=f77ed45c7e83814ce3e8bd199fc293bd5b53682b&v=4",key:"joey"}],frontMatter:{title:"Welcome to the Solus Devlog",description:"Welcome to the Solus Development Log.",slug:"welcome-solus-devlog-v1",authors:"joey",tags:["hello","devlog","firstpost","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"eopkg is dead, long live eopkg",permalink:"/blog/eopkg-is-dead-long-live-eopkg"}},r={authorsImageUrls:[void 0]},c=[];function u(e){const o={a:"a",p:"p",...(0,l.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.p,{children:"Welcome to the Solus Development Log."}),"\n",(0,s.jsx)(o.p,{children:"The Solus Development Log will be used by Solus Staff and outside contributors to highlight wins and changes in Solus. Keep an eye on this space."}),"\n",(0,s.jsx)(o.p,{children:"The Solus DevLog has been setup to facilitate improved communication with the outside world; wins, significant changes, as well as challenges, within Solus. Solus Staff and contributors are encouraged to use this space."}),"\n",(0,s.jsxs)(o.p,{children:["The DevLog has been setup as a separate entity to the ",(0,s.jsx)(o.a,{href:"https://getsol.us/blog/",children:"Solus Blog"})," to encourage more short form development content that doesn't require the same level of polish as an official blog post."]}),"\n",(0,s.jsx)(o.p,{children:"It is hoped that this will be used to help communicate what's going on in Solus such that our short-term and medium-term progress, goals, and ambitions are less of a black box to the outside world."}),"\n",(0,s.jsxs)(o.p,{children:["Additionally, we believe it will help provide context to any of our murmurings for any users who keep an eye on the ",(0,s.jsx)(o.a,{href:"https://github.com/getsolus/",children:"getsolus"})," GitHub organization page and the ",(0,s.jsx)(o.a,{href:"https://matrix.to/#/#solus:matrix.org",children:"Solus"})," Matrix channels."]}),"\n",(0,s.jsx)(o.p,{children:"Hope to see you back at this space soon with more content!"})]})}function h(e={}){const{wrapper:o}={...(0,l.a)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},11151:(e,o,t)=>{t.d(o,{Z:()=>a,a:()=>i});var s=t(67294);const l={},n=s.createContext(l);function i(e){const o=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),s.createElement(n.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f35b91b6.239937fe.js b/assets/js/f35b91b6.239937fe.js new file mode 100644 index 000000000..2f81052b4 --- /dev/null +++ b/assets/js/f35b91b6.239937fe.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9749],{78677:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>r,contentTitle:()=>i,default:()=>h,frontMatter:()=>n,metadata:()=>a,toc:()=>u});var s=t(85893),l=t(11151);const n={title:"Welcome to the Solus Devlog",description:"Welcome to the Solus Development Log.",slug:"welcome-solus-devlog-v1",authors:"joey",tags:["hello","devlog","firstpost","solus"],hide_table_of_contents:!1},i=void 0,a={permalink:"/blog/welcome-solus-devlog-v1",source:"@site/devlog/2024-01-13-welcome-devlog.md",title:"Welcome to the Solus Devlog",description:"Welcome to the Solus Development Log.",date:"2024-01-13T00:00:00.000Z",tags:[{inline:!0,label:"hello",permalink:"/blog/tags/hello"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"firstpost",permalink:"/blog/tags/firstpost"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:.9,hasTruncateMarker:!0,authors:[{name:"Joey Riches",title:"Solus Staff",page:{permalink:"/blog/authors/joey"},socials:{github:"https://github.com/joebonrichie"},imageURL:"https://avatars.githubusercontent.com/u/5338090",key:"joey"}],frontMatter:{title:"Welcome to the Solus Devlog",description:"Welcome to the Solus Development Log.",slug:"welcome-solus-devlog-v1",authors:"joey",tags:["hello","devlog","firstpost","solus"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"eopkg is dead, long live eopkg",permalink:"/blog/eopkg-is-dead-long-live-eopkg"}},r={authorsImageUrls:[void 0]},u=[];function c(e){const o={a:"a",p:"p",...(0,l.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(o.p,{children:"Welcome to the Solus Development Log."}),"\n",(0,s.jsx)(o.p,{children:"The Solus Development Log will be used by Solus Staff and outside contributors to highlight wins and changes in Solus. Keep an eye on this space."}),"\n",(0,s.jsx)(o.p,{children:"The Solus DevLog has been setup to facilitate improved communication with the outside world; wins, significant changes, as well as challenges, within Solus. Solus Staff and contributors are encouraged to use this space."}),"\n",(0,s.jsxs)(o.p,{children:["The DevLog has been setup as a separate entity to the ",(0,s.jsx)(o.a,{href:"https://getsol.us/blog/",children:"Solus Blog"})," to encourage more short form development content that doesn't require the same level of polish as an official blog post."]}),"\n",(0,s.jsx)(o.p,{children:"It is hoped that this will be used to help communicate what's going on in Solus such that our short-term and medium-term progress, goals, and ambitions are less of a black box to the outside world."}),"\n",(0,s.jsxs)(o.p,{children:["Additionally, we believe it will help provide context to any of our murmurings for any users who keep an eye on the ",(0,s.jsx)(o.a,{href:"https://github.com/getsolus/",children:"getsolus"})," GitHub organization page and the ",(0,s.jsx)(o.a,{href:"https://matrix.to/#/#solus:matrix.org",children:"Solus"})," Matrix channels."]}),"\n",(0,s.jsx)(o.p,{children:"Hope to see you back at this space soon with more content!"})]})}function h(e={}){const{wrapper:o}={...(0,l.a)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,o,t)=>{t.d(o,{Z:()=>a,a:()=>i});var s=t(67294);const l={},n=s.createContext(l);function i(e){const o=s.useContext(n);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),s.createElement(n.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f3d58343.c7693eda.js b/assets/js/f3d58343.c90fcc92.js similarity index 56% rename from assets/js/f3d58343.c7693eda.js rename to assets/js/f3d58343.c90fcc92.js index 88e16a82f..870b5c5e7 100644 --- a/assets/js/f3d58343.c7693eda.js +++ b/assets/js/f3d58343.c90fcc92.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8812],{11741:e=>{e.exports=JSON.parse('{"author":{"name":"David Harder","title":"Solus Staff","page":{"permalink":"/blog/authors/david"},"socials":{"github":"https://github.com/davidjharder"},"imageURL":"https://avatars.githubusercontent.com/u/23007135?v=4","key":"david","count":2},"listMetadata":{"permalink":"/blog/authors/david","page":1,"postsPerPage":2,"totalPages":1,"totalCount":2,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8812],{11741:e=>{e.exports=JSON.parse('{"author":{"name":"David Harder","title":"Solus Staff","page":{"permalink":"/blog/authors/david"},"socials":{"github":"https://github.com/davidjharder"},"imageURL":"https://avatars.githubusercontent.com/u/23007135","key":"david","count":2},"listMetadata":{"permalink":"/blog/authors/david","page":1,"postsPerPage":2,"totalPages":1,"totalCount":2,"blogDescription":"The Solus Development (b)log!","blogTitle":"Solus DevLog"}}')}}]); \ No newline at end of file diff --git a/assets/js/f4aa4739.ac558a14.js b/assets/js/f4aa4739.beb02c05.js similarity index 97% rename from assets/js/f4aa4739.ac558a14.js rename to assets/js/f4aa4739.beb02c05.js index f51ccc2cb..1921b2389 100644 --- a/assets/js/f4aa4739.ac558a14.js +++ b/assets/js/f4aa4739.beb02c05.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9170],{75340:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>u,contentTitle:()=>d,default:()=>a,frontMatter:()=>o,metadata:()=>r,toc:()=>c});var n=t(85893),s=t(11151);const o={title:"Budgie",summary:"A quick introduction to the Budgie Edition of Solus"},d="Budgie Desktop",r={id:"user/editions/budgie/index",title:"Budgie",description:"TODO: Add Budgie branding image",source:"@site/docs/user/editions/budgie/index.md",sourceDirName:"user/editions/budgie",slug:"/user/editions/budgie/",permalink:"/docs/user/editions/budgie/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/budgie/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Budgie",summary:"A quick introduction to the Budgie Edition of Solus"},sidebar:"userSidebar",previous:{title:"Editions",permalink:"/docs/user/editions/"},next:{title:"Configuration",permalink:"/docs/user/editions/budgie/configuration"}},u={},c=[];function l(e){const i={a:"a",blockquote:"blockquote",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"budgie-desktop",children:"Budgie Desktop"})}),"\n",(0,n.jsxs)(i.blockquote,{children:["\n",(0,n.jsx)(i.p,{children:"TODO: Add Budgie branding image"}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"Budgie is the flagship Edition of Solus. It was originally started by Solus and has now been spun off into its own distro-agnostic project. They describe it as:"}),"\n",(0,n.jsxs)(i.blockquote,{children:["\n",(0,n.jsx)(i.p,{children:"The Budgie Desktop is a feature-rich, modern desktop designed to keep out the way of the user."}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"Here are some links related to this project that you may find helpful:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://github.com/BuddiesOfBudgie",children:"Homepage"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://blog.buddiesofbudgie.org/",children:"News"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://github.com/BuddiesOfBudgie/budgie-desktop/issues",children:"Support"})}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.a,{href:"configuration",children:"Go to Budgie Configuration"})}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.a,{href:"tips-and-tricks",children:"Go to Budgie Tips and Tricks"})})]})}function a(e={}){const{wrapper:i}={...(0,s.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},11151:(e,i,t)=>{t.d(i,{Z:()=>r,a:()=>d});var n=t(67294);const s={},o=n.createContext(s);function d(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[9170],{75340:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>u,contentTitle:()=>d,default:()=>a,frontMatter:()=>o,metadata:()=>r,toc:()=>c});var n=t(85893),s=t(11151);const o={title:"Budgie",summary:"A quick introduction to the Budgie Edition of Solus"},d="Budgie Desktop",r={id:"user/editions/budgie/index",title:"Budgie",description:"TODO: Add Budgie branding image",source:"@site/docs/user/editions/budgie/index.md",sourceDirName:"user/editions/budgie",slug:"/user/editions/budgie/",permalink:"/docs/user/editions/budgie/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/budgie/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Budgie",summary:"A quick introduction to the Budgie Edition of Solus"},sidebar:"userSidebar",previous:{title:"Editions",permalink:"/docs/user/editions/"},next:{title:"Configuration",permalink:"/docs/user/editions/budgie/configuration"}},u={},c=[];function l(e){const i={a:"a",blockquote:"blockquote",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"budgie-desktop",children:"Budgie Desktop"})}),"\n",(0,n.jsxs)(i.blockquote,{children:["\n",(0,n.jsx)(i.p,{children:"TODO: Add Budgie branding image"}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"Budgie is the flagship Edition of Solus. It was originally started by Solus and has now been spun off into its own distro-agnostic project. They describe it as:"}),"\n",(0,n.jsxs)(i.blockquote,{children:["\n",(0,n.jsx)(i.p,{children:"The Budgie Desktop is a feature-rich, modern desktop designed to keep out the way of the user."}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"Here are some links related to this project that you may find helpful:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://github.com/BuddiesOfBudgie",children:"Homepage"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://blog.buddiesofbudgie.org/",children:"News"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://github.com/BuddiesOfBudgie/budgie-desktop/issues",children:"Support"})}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.a,{href:"configuration",children:"Go to Budgie Configuration"})}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.a,{href:"tips-and-tricks",children:"Go to Budgie Tips and Tricks"})})]})}function a(e={}){const{wrapper:i}={...(0,s.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},11151:(e,i,t)=>{t.d(i,{Z:()=>r,a:()=>d});var n=t(67294);const s={},o=n.createContext(s);function d(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function r(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f4c9601b.91426ff9.js b/assets/js/f4c9601b.262d90be.js similarity index 99% rename from assets/js/f4c9601b.91426ff9.js rename to assets/js/f4c9601b.262d90be.js index 17036b2ba..1120ee38a 100644 --- a/assets/js/f4c9601b.91426ff9.js +++ b/assets/js/f4c9601b.262d90be.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2595],{39910:(A,g,C)=>{C.r(g),C.d(g,{assets:()=>r,contentTitle:()=>n,default:()=>s,frontMatter:()=>I,metadata:()=>t,toc:()=>i});var e=C(85893),o=C(11151);const I={title:"Booting with Secure Boot Enabled",summary:"Instructions for enrolling the Solus Certificate when Secure Boot is enabled"},n="Booting with Secure Boot Enabled",t={id:"user/quick-start/installation/secure-boot",title:"Booting with Secure Boot Enabled",description:"Since Solus 4.4 Secure Boot is now supported. When you first boot the ISO, and, if you have Secure Boot enabled in your UEFI firmware; you will have to perform the one-time-step of manually enrolling the Solus certificate. The following guide will walk you through this. If you already have Solus installed and wish to enable Secure Boot, skip ahead here.",source:"@site/docs/user/quick-start/installation/secure-boot.md",sourceDirName:"user/quick-start/installation",slug:"/user/quick-start/installation/secure-boot",permalink:"/docs/user/quick-start/installation/secure-boot",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/installation/secure-boot.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Booting with Secure Boot Enabled",summary:"Instructions for enrolling the Solus Certificate when Secure Boot is enabled"},sidebar:"userSidebar",previous:{title:"Disk Partitioning",permalink:"/docs/user/quick-start/installation/disks"},next:{title:"System Requirements",permalink:"/docs/user/quick-start/installation/system-requirements"}},r={},i=[{value:"Enrolling the Solus certificate",id:"enrolling-the-solus-certificate",level:2},{value:"Enabling Secure Boot on an existing install",id:"enabling-secure-boot-on-an-existing-install",level:2},{value:"Final tips",id:"final-tips",level:3},{value:"Useful links for additional reading",id:"useful-links-for-additional-reading",level:2}];function a(A){const g={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,o.a)(),...A.components};return(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(g.header,{children:(0,e.jsx)(g.h1,{id:"booting-with-secure-boot-enabled",children:"Booting with Secure Boot Enabled"})}),"\n",(0,e.jsxs)(g.p,{children:["Since Solus 4.4 Secure Boot is now supported. When you first boot the ISO, and, if you have Secure Boot enabled in your UEFI firmware; you will have to perform the one-time-step of manually enrolling the Solus certificate. The following guide will walk you through this. If you already have Solus installed and wish to enable Secure Boot, skip ahead ",(0,e.jsx)(g.a,{href:"#enabling-secure-boot-on-an-existing-install",children:"here"}),"."]}),"\n",(0,e.jsx)("em",{children:"Note that this only applies to machines with UEFI firmware, if your machine uses the older BIOS firmware you can safely ignore this article. If you wish to avoid having to do this step then you may disable Secure Boot in your machine's UEFI firmware interface."}),"\n",(0,e.jsx)(g.h2,{id:"enrolling-the-solus-certificate",children:"Enrolling the Solus certificate"}),"\n",(0,e.jsxs)(g.p,{children:["After ",(0,e.jsx)(g.a,{href:"/docs/user/quick-start/installation/#boot-the-media",children:"booting"})," the ISO from USB/DVD and, if Secure Boot is enabled in your device's UEFI firmware. A warning will appear concerning a Secure Boot violation, press ",(0,e.jsx)(g.code,{children:"Enter"})," on your keyboard to continue."]}),"\n",(0,e.jsx)(g.p,{children:(0,e.jsx)(g.img,{alt:"Secure Boot violation",src:C(95762).Z+"",width:"807",height:"577"})}),"\n",(0,e.jsxs)(g.p,{children:["Now, it will provide 10 seconds in order to continue to MOK (Machine Owner Key) Management, press ",(0,e.jsx)(g.code,{children:"Enter"})," again within the timeframe to do so."]}),"\n",(0,e.jsx)(g.p,{children:(0,e.jsx)(g.img,{alt:"Continue to MOK Management",src:C(48979).Z+"",width:"811",height:"581"})}),"\n",(0,e.jsxs)(g.p,{children:["Use the down ",(0,e.jsx)(g.code,{children:"\u2193"})," arrow key on your keyboard to select ",(0,e.jsx)(g.code,{children:"Enroll Key from Disk"})," and press ",(0,e.jsx)(g.code,{children:"Enter"})," to continue."]}),"\n",(0,e.jsx)(g.p,{children:(0,e.jsx)(g.img,{alt:"Enroll Key from Disk",src:C(35529).Z+"",width:"809",height:"581"})}),"\n",(0,e.jsxs)(g.p,{children:["Here you'll need to find the ",(0,e.jsx)(g.code,{children:"solus-enroll-me.cer"})," certificate, it should normally be located in the ",(0,e.jsx)(g.code,{children:"SOLUSESP"})," directory. Use the arrow keys to select a directory, ",(0,e.jsx)(g.code,{children:"Enter"})," to enter it and ",(0,e.jsx)(g.code,{children:"Esc"})," to go back."]}),"\n",(0,e.jsx)(g.p,{children:(0,e.jsx)(g.img,{alt:"Enroll the Solus Certificate",src:C(91370).Z+"",width:"804",height:"577"})}),"\n",(0,e.jsxs)(g.p,{children:["Once you found the ",(0,e.jsx)(g.code,{children:"solus-enroll-me.cer"})," certificate, press ",(0,e.jsx)(g.code,{children:"Enter"})," to enroll it, and press the ",(0,e.jsx)(g.code,{children:"\u2193"})," and ",(0,e.jsx)(g.code,{children:"Enter"})," key to continue. Finally, when confirming you wish to Enroll the key(s) press the ",(0,e.jsx)(g.code,{children:"\u2193"}),' key to select "Yes" and ',(0,e.jsx)(g.code,{children:"Enter"})," again."]}),"\n",(0,e.jsxs)(g.p,{children:["Now, with the Solus certificate enrolled, press ",(0,e.jsx)(g.code,{children:"Enter"})," to reboot the machine, boot the ISO from USB/DVD again and it should continue booting to the installer."]}),"\n",(0,e.jsx)(g.p,{children:(0,e.jsx)(g.img,{alt:"Confirm Key Enrollment",src:C(51754).Z+"",width:"816",height:"586"})}),"\n",(0,e.jsx)("em",{children:"Once Solus is installed you will not have to enroll the certificate again as it will stay enrolled."}),"\n",(0,e.jsx)(g.h2,{id:"enabling-secure-boot-on-an-existing-install",children:"Enabling Secure Boot on an existing install"}),"\n",(0,e.jsxs)(g.p,{children:["If you already have Solus installed and wish to enable Secure Boot then there is one extra step you must perform BEFORE continuing with ",(0,e.jsx)(g.a,{href:"#enrolling-the-solus-certificate",children:"Enrolling the Solus Certificate"})," as normal."]}),"\n",(0,e.jsxs)(g.p,{children:["Firstly, you must confirm you have ",(0,e.jsx)(g.code,{children:"clr-boot-manager, version: 3.2.12, release: 29"})," (or later) installed, run ",(0,e.jsx)(g.code,{children:"eopkg info clr-boot-manager"})," to confirm this. This version of ",(0,e.jsx)(g.code,{children:"clr-boot-manager"})," will have created a new UEFI boot entry on your machine called ",(0,e.jsx)(g.code,{children:"Solus Linux Bootloader"})," that can be booted from with Secure Boot enabled."]}),"\n",(0,e.jsx)(g.admonition,{title:"Before continuing, it is important to note the screenshots provided here are for example only, your UEFI firmware interface will almost certainly look different.",type:"note"}),"\n",(0,e.jsxs)(g.p,{children:["Reboot your machine and select the appropriate keyboard button during startup to choose a boot device. The correct key will vary from machine to machine but some common keys are ",(0,e.jsx)(g.code,{children:"F2"}),", ",(0,e.jsx)(g.code,{children:"F11"}),", ",(0,e.jsx)(g.code,{children:"F12"}),", or ",(0,e.jsx)(g.code,{children:"Esc"}),". From the boot selection interface, select the ",(0,e.jsx)(g.code,{children:"Solus Linux Bootloader"})," entry and boot from it. If you've manage to successfully boot then you can continue with enabling Secure Boot."]}),"\n",(0,e.jsxs)("em",{children:["If there is no entry called ",(0,e.jsx)(g.code,{children:"Solus Linux Bootloader"}),", reboot, log back in, open a terminal and run ",(0,e.jsx)(g.code,{children:"sudo clr-boot-manager update"}),"."]}),"\n",(0,e.jsx)(g.p,{children:(0,e.jsx)(g.img,{alt:"UEFI Choose Boot Device",src:C(23506).Z+"",width:"645",height:"463"})}),"\n",(0,e.jsxs)(g.p,{children:["After successfully booting from the new ",(0,e.jsx)(g.code,{children:"Solus Linux Bootloader"})," UEFI entry, open a terminal, input ",(0,e.jsx)(g.code,{children:"systemctl reboot --firmware-setup"})," and press ",(0,e.jsx)(g.code,{children:"Enter"}),". This will reboot you into your machine's UEFI firmware interface. Once there, you will have to find and enable the Secure Boot setting. Where this is located varies from machine to machine. Some common places it can be located under are ",(0,e.jsx)(g.code,{children:"Windows OS Configuration"}),", ",(0,e.jsx)(g.code,{children:"Security"})," or ",(0,e.jsx)(g.code,{children:"Device Manager"}),"."]}),"\n",(0,e.jsx)(g.p,{children:(0,e.jsx)(g.img,{alt:"UEFI Secure Boot Configuration",src:C(61857).Z+"",width:"645",height:"460"})}),"\n",(0,e.jsxs)(g.p,{children:["Once you've found and enabled the Secure Boot setting then reboot once again from the ",(0,e.jsx)(g.code,{children:"Solus Linux Bootloader"})," UEFI entry. From there you can continue with the instructions: ",(0,e.jsx)(g.a,{href:"#enrolling-the-solus-certificate",children:"Enrolling the Solus Certificate"}),", bearing in mind you are booting from a disk rather than from a USB/DVD."]}),"\n",(0,e.jsxs)("em",{children:[" Remember to save settings after enabling Secure Boot! (usually ",(0,e.jsx)(g.code,{children:"F10"}),")"]}),"\n",(0,e.jsx)(g.h3,{id:"final-tips",children:"Final tips"}),"\n",(0,e.jsxs)(g.p,{children:["Once you've successfully enabled and booted your Solus install with Secure Boot enabled. Go back into your machine's UEFI firmware interface and change the default boot device to ",(0,e.jsx)(g.code,{children:"Solus Linux Bootloader"}),"."]}),"\n",(0,e.jsxs)(g.p,{children:["You can run ",(0,e.jsx)(g.code,{children:'bootctl status | grep "Secure Boot"'})," in a terminal to verify Secure Boot is enabled."]}),"\n",(0,e.jsxs)(g.p,{children:["It is possible to delete the old Solus UEFI boot entry with ",(0,e.jsx)(g.code,{children:"efibootmgr"})," once Secure Boot is enabled successfully, However, caution is required and as such, instructions to do so are not provided here."]}),"\n",(0,e.jsx)(g.h1,{id:"why-is-enrolling-the-solus-certificate-necessary",children:"Why is enrolling the Solus certificate necessary?"}),"\n",(0,e.jsxs)(g.p,{children:["In order to avoid the one time step of enrolling the Solus certificate, Solus would have to get it's own ",(0,e.jsx)(g.code,{children:"shim"})," EFI executable signed by Microsoft. Currently, the following actions must be completed to do this:"]}),"\n",(0,e.jsxs)(g.ul,{children:["\n",(0,e.jsx)(g.li,{children:"Obtain an EV Certificate (expensive!)"}),"\n",(0,e.jsx)(g.li,{children:"Register for the Microsoft Windows Hardware Developer Program."}),"\n",(0,e.jsxs)(g.li,{children:["Implement any additional security requirements as required by the ",(0,e.jsx)(g.a,{href:"https://github.com/rhboot/shim-review/",children:"shim-review"})," process."]}),"\n"]}),"\n",(0,e.jsxs)(g.p,{children:["Currently, we are using a third-party ",(0,e.jsx)(g.code,{children:"shim"})," that is already signed by Microsoft, the downside is the Solus (vendor) certificate is not already embedded and trusted in the ",(0,e.jsx)(g.code,{children:"shim"})," executable, and as such, requires the user to enroll the Solus certificate manually on first boot."]}),"\n",(0,e.jsx)(g.p,{children:"We appreciate that having the enroll the certificate may be confusing to users and, the process to do so may not be self-explanatory. Especially, as Secure Boot is generally enabled by default for the majority of machines."}),"\n",(0,e.jsx)(g.p,{children:"However, it is also important to consider the following:"}),"\n",(0,e.jsxs)(g.ul,{children:["\n",(0,e.jsx)(g.li,{children:"Obtaining an EV certificate is an expensive investment."}),"\n",(0,e.jsx)(g.li,{children:"Enrolling the Solus certificate is only required once, and, only if Secure Boot is enabled."}),"\n"]}),"\n",(0,e.jsxs)(g.p,{children:["As such, we are not currently looking to our get our own ",(0,e.jsx)(g.code,{children:"shim"})," signed by Microsoft. However, thanks to our supporters on ",(0,e.jsx)(g.a,{href:"https://opencollective.com/getsolus",children:"OpenCollective"}),", it is indeed within our budget to obtain an EV certificate in the future which would unblock the additional requirements."]}),"\n",(0,e.jsx)(g.h2,{id:"useful-links-for-additional-reading",children:"Useful links for additional reading"}),"\n",(0,e.jsxs)(g.ul,{children:["\n",(0,e.jsx)(g.li,{children:(0,e.jsx)(g.a,{href:"https://learn.microsoft.com/windows-hardware/drivers/dashboard/file-signing-reqs",children:"https://learn.microsoft.com/windows-hardware/drivers/dashboard/file-signing-reqs"})}),"\n",(0,e.jsx)(g.li,{children:(0,e.jsx)(g.a,{href:"https://github.com/rhboot/shim-review/",children:"https://github.com/rhboot/shim-review/"})}),"\n",(0,e.jsx)(g.li,{children:(0,e.jsx)(g.a,{href:"https://github.com/rhboot/shim/",children:"https://github.com/rhboot/shim/"})}),"\n"]})]})}function s(A={}){const{wrapper:g}={...(0,o.a)(),...A.components};return g?(0,e.jsx)(g,{...A,children:(0,e.jsx)(a,{...A})}):a(A)}},95762:(A,g,C)=>{C.d(g,{Z:()=>e});const e="data:image/png;base64,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6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKPxeDvznfF6OAADwab+GZZ0FAPBY02XJO4wAAAXVBQBQUF0AAAXVBQBQUF0AAAXVBQBQUF0AAAXVBQAAAAAAANzu/9RxiIRrIM4UAAAAAElFTkSuQmCC"},48979:(A,g,C)=>{C.d(g,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAysAAAJFCAIAAABSvP+VAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAQEklEQVR4Xu3d227iyAJAUfpoPpZP4nPPgyPH7VsgwMbQa2k0gsIUhXPxlp1OTicAAAAAAAAAAADe2Z/5wJfLfAAAgLucx1v/m4wCAFBQYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAAtf/mA3+7+M2sAAB3OH//HtZvPxTYYPWZAADs2DmT5SokAEBNgQEA1BQYAEBNgQEA1BQYAEBNgQEA1BQYAEBNgQEA1BQYAEBNgQEA1BQYAEDtqr8LCbzW7C+LDX+qdRx80l9uHeYfJx/vrv6Zs5vG9xf87Pf18S4Xuw7egHNgcHRj+gz/TUf2XS4r9XO/8XXH9fw4vvXQqh83YMczPuLAMygw4C5bwbQ1DsDJVUj4YFkDbb3Q1vhNrjzhB/BeFBgc3fn8dT1xqJBli6z+4NRycDryqKzZ+ZGjnYeuN1vn7BLbML66zc5L7+yH6fzLCXd26XRwOj57iZ31D3d31jOOb61nuvGPOwF4OVch4Q2Mh9jZIXm0PAZfc/Tdmu1KW0/fWedNVnPkvPh5uPtNU2Y5+Xh39aHl4HSd07dw/fqH8a3tt9Yz3p3dBo5JgcF72Dls33qsXc7wO1uv+8DD/6PmWfWo/fAoR1sP8FSuQsI7Of99RfIXhhmG/99vZxk7D11v+U4fsuzTxn64dfJbtz9tP2V1Paft7YF3p8CAg1rNzYeE3aqhdYb5r+meW7cf3Lr+W7cH3oWrkHB0Q4Uc2cGXB3BACgy4y1Pza+cM0/HDdN+t63/29kDMVUg4uvFi3HTktNElo/HRy+JHqa704+vOFrD1itPNhtv769l6X1vrWY7/znSe8fbOUre231rPcnxn8tPt2w9mqwIO68984MvXF70vY+C9HOq71qEWA/QW3wS+b7kKCXyOxTe7F1g9AQYw4yok8N5mufPa/Dotrh6+fD3AMSkw4L0dMHEOuCTgaFyFBACoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgNp/8wH4OJfLfOR8no98kvH9PvttXi5Pf4mbTD/QwcKGlxtfaHp39ik3G5zeDdZ5WEf7/IGYc2B8vvG7/Pk8PxZ+pOaodrR9OAZN/CEeXmj6ctOViK0t2QcIDss5MODTHL91NBngHBh8uMvF+YbnsnuBX3AOjH/XeB5iPIKO5yRmx9Rfj2+Zbj+bZLme2fmSm06frD539Lv5p5OsPne0M8lp+/2OD41m61xuv+WmeaZ3f9wJ97hy8p31TN/XbHD5vsaHZoPT8dlL7Oy34e7OesbxrfVMN75yV8BHcg6Mf9d4PDj//fM641HhzvEdqxtvrefXZoe3X6xz1fj02e1b5996v1vzbG2/emO8fdM8M1vjU8MMw/+vd+v2g3E9yzc1DA53Vx9aDk73z2zPbD1lZhjf2n5rPePd2W341zgHxj9kdqyaWR3csbX91vhLHGoxjzV9a+fFWZnrLZ+yFRxbljP8aOiSK926nmc72nrgTSkw/iHXH/NOa4eZ4TA/HR8m3BrfsZz8SZZH+uyl7/SqdQ4fzTHpnmH8hPnx8+S0sZ5b13br9qftp6yu57S9PbBFgcG61aPjdHB6EN0aXzUcq4YNnnrcWj3S7yzsUN5lnb1bP39u3X5w6/6/dXvAz4EB1G7tIeDzKDD4wXAaaXpjZmv8CHaO9I9a9qPm2fLs+dl36/5/9vbwMRQYn2/8/j77Rr81PlbLeGyYXmq8fnzLdPudQhot59+3tc1ynq31X2O68q159vfD6Mf1zPbScpGrD/1inof48XXvNJ3/mpm3tp+OT22tf8ut2w+WK4F/zZ/5wJevr0hfHnA0z/6qfPb8U+VrscMHAp5k8cX1fcs5MHgniy/mB3v2/BzHeMoKeAn/FhKObnaYfHgePXv+LePrXnb/6ShPcv77t6j4EEBMgcHRPfvQ+Oz5t7zqdRn5EMALuQoJAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFD7bz7wK5fLfOR8no/c5HK5d4ZXme2Kg7+LcbUHXycAfJjHnAMbj9/n89ftZZNdb+e5l8veo/e7c/7hucNOuH8/BIQXALzEYwoMAIDrPeYqZObZ52yePT8AwCkosK2fi1odnw6OV/RmI9PBcZuth6aP/lhXW5Oszv8oq/vhUeP76589ZbA6DwDwWH/mA1++jsNXtstp48g9e/osCJbjq3enlg9NR1bnXz5lx3LjW6ea7YfT7vZbb/xR49fcXh0cXPN+AYAtiyPp960HnwMbD+SXt/3HjHeavuthv1/v1j126/ajxSfEuh83AAB+58EFxk2GU1DTULsn4O63vx4A4FEU2IvNkmt67vAl9bOzHgDgUfw2CgCA2qELbHZF7L1c87NWV77Brc22xn/t4RMCAKse828hl4ft8Smzh34cH4yPbv1c1Gye4e7y9ujHt3C6cf4tq5Ps2FrnY8eX659tvzV+zVsAAFYtyuH71mMK7Mg+4C0AAO9oESHftw59FfLXLq6mAQAH9pkFNl5QW7QnAMDrfexvo1BdAMBhfeY5MACAI1NgAAA1BQYAUFNgAAA1BQYAUFNgAAA1BQYAUFNgAAA1BQYAULvqd+L7G4sAAA/0Zz7wRXMBADzW999MdBUSAKCmwAAAagoMAKCmwAAAagoMAKCmwAAAagoMAKCmwAAAAAAAAAAAAAAAAAAAAAAAAOB1/g8woPo/FVU5nQAAAABJRU5ErkJggg=="},35529:(A,g,C)=>{C.d(g,{Z:()=>e});const e="data:image/png;base64,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z79/vcB7cs8RDuXqmftyOZ3/+yGnrfH52WH8FdY1s17pnu3ZGh8Mc06ePw5b47N5qrX14JfrvTEb8Clc94JDOS8u4ezXn8sfW+P6VeuRLfORufGSG08Ndh7kL9d429UXXh0EPoj2gqP50HPz1ZqZgml9pepnTVv1WObetmd/p1UDn8s9R+DnLe+1DabB+alvz513c3t/rw4Cn0V7wTE5PQO8J+0FB3SY8BpuwB3env116Qs+nfaCI5jPxHtO3qf/Lr80n9fneZY3AbdetTW+trXAcr3Lttjanq15bri6kVcHT9vrvddynsnttW+t94H9Bd7Wr8XjP2/uZ77RAN/L+5Fn+PcDvdX7bnwHuu4FANDRXgAAHe0FANDRXgAAHe0FANDRXgAAHe0FANDRXgAAHe0FANDRXgAAHe0FANDRXgAAnd/jAPB+pt/MCsABaC94a+fzOALAR3PPEQCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCg83sc+MflMo4AAPCkX4vHagsA4Hudh6/dcwQA6GgvAICO9gIA6GgvAICO9gIA6GgvAICO9gIA6GgvAAAAAAAAAAAAAAAAAAAAgOP7P/7OB7w235xvAAAAAElFTkSuQmCC"},91370:(A,g,C)=>{C.d(g,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyQAAAJBCAIAAAA4JuYOAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAX2ElEQVR4Xu3d4ZaiOrcFUPqO87A+ko97f1BfOk1IBGQpWnOOHudgjDsBFVcBVU4TAAAAAAAAwD/+TNM0TfdFKwAAz7nN//u/f1sBADiTsAUAECRsAQAECVsAAEHCFgBAkLAFABAkbAEABAlbAABB/9U37v64KQDAE24/f8r0r3/C1qztBADAWO+gldOIAABBwhYAQJCwBQAQJGwBAAQJWwAAQcIWAECQsAUAECRsAQAECVsAAEHCFgBAkLAFABC08t2IAFssvgVsy9eqlods6Tx2v28qshhxvrnlgQBncWQLOKKklvlfaRk7K+VsGWt21ogAhwlbwG/hsBbwFsIWAECQa7aAI2636X7/e+FUfbho77Vcvf6r7XXjriNVbedB/cUcNg4BsMqRLeCgkk5WA9D8r7T09Pr32svNxfIWdedefYDTCVvAcS9LKntz1ar0JAFWOY0IPOv27ynFaX+s2dv/gHaS00vGBRC2gPPtPQq1t/9Z3jUu8Ks4jQgcMR8l+iyvOeMJsCBsAUF7M1mv/972vc6qA9D6M03TNP3sY+Z9jePqwBaLdNK7YKt3jdTD/r32Wbl3vMtadKv3cr36beoaDwEwa3LUz5KwBdBlrwhs1+wxfpacRgRY1+w3AY7w24gAf/XOLQIcJmwB/CVdAadzGhEAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAj6b9nAr3e/L1tut3/a55svduLo9/u+IhuH3tjtxXqz6rW3tve8gt5se+0DBx6yy97XYc+izlnTnuuUIvXNMsRs0Vjf3DKHvRPeuN32loUoR7bY6r37rLNGX3xObLFx6I3dcu73lbXrzarX3tre8wp6s+21D+x9yOr279nec6yts3faY3P9epSSouZ/dcsxux7Yrm/PrrKQJmyxouyn7LCAvZ6MX/B9nEZkabGLtMc85vWfN68ci9a3bv/tB5OAHmGL3dqLIRa744efOr3+vfaeXv/V9tVTIfXNoh732CfNlvqrfQarPO7fPimna4dYXa+B1f5lRRb1e+3lruLhuD2DOou7HupNsp1/Xbn3JM7G6zWoUzfW7bvqH7Y6mZ7V7Vw3rk5+sN3accfbYfCkr/av22E7pxE5ov7YKDu++V9p6en177X39Pr32svNxXKvf33XLotHDeqfaO8kD1jMf+969fqX5Y3tvTp7DeosnsEt2s69+Zebi+XBfFb16tTqOnvrz+aeq8UHNvbvbefVSQ7Wd7X/4t76rtX+ve3Ta4ddHNlit3o397xzq7UO1+99Emxx7FEMvGyTPvO8X8pZq3Cgzn3DLwxefDtfdmJ8KGGLc2z/ae92m+7//t5WvV/bXme2t3/PWXVm7YfNifXb4m+0d7329k+72nzSXrC+5Q1++FW6d5Kn9D93vwQLwhbn2LVjXezF6v3yrjrT/v49Z9WZOh82J9a/lL3rtbd/2tXmk3b99Z1jzTzPLRHnxP4n7pdgwTVb8Enmj4ctHyrwLqtRBn4zYYuTzT8RDjzsMNvYrej1P6t9l8GHzfP1r/lD9t712ts/7V3zOWvcvXX29r+a0+e/seDGbrDwZ5qmafp57cyvoWvuynmlem9SXg+lsU4Sq6ni4Uuo17/XPj2a0sb22WJF6pZx+9SUqh3YPrvqT1XNunh91+yZ9lUb5/9kncV2G8ywV2fqr9dqe6/O3udlGtZfrFdRHtIb9+Ggs0Wd1ZuLu2bj+osJP6wzGLent53rUm2dwXZb9F+dZ92+t/+iHVrNK/ZnSdiCS/DuA/h0zZ78Z8lpRHi/5v0JwPfw24jwHs5NAPwSwha8h3QF8Es4jQgAECRsAQAECVsAAEGu2Xq/xYXSU/NHX1zccwrbMyS9Ye//fvHR6cMt6p+rN9tee2t7zw/10c/viT5lnhzjyNZ1PXzj3f0t4z3evj3T9XvS4z7csButzrNtOTzcxvqHrdbvzbbX3tre8+JWt0/bcu76tvWvaTDP1e3GxxG2LqHsX87d0QAAb+c04vstAtb2vLW9J1ukt2e6fs+7xt0rPc9Pr//pbJ9jbLfvIGx9gHIMuX7XjRtn43dpXWFeLv17der2RWMp0t5VjOcz7ay/OueHQ0yPNl1bsHfXauNq/3Jvr3G2Wr9u7xn0H49bZtsuzMuzLfUfKvUHN1dbyvJiO7QPGWg7P6y/sDrhttq4yDPaIQbPS6tMeFGnXpHV5XbcVasbpJ1q21KWF/XHDyntq3Muy7PV+gu99e21l7uKxbjlIeM643n2Bm3rlLvqe8erzCs5jfgZ2rdl+y4q7675X2nZbu4/qNNrnG8u7hrU6Vnt3Kt/2GqduaU2GPfAPNv6ve3Ta+8Z9x+PW5bLf9v5D+rXD39SW6QMt1iuLeYz0D58S/3tnnz4FovtP3heVpU+of5j7fapt3m9XHtyfR/Wr/XWt9e+fT7jOuN5Lm6WlrZOXa0ekYtwZOsDHHvPbH9Ubx9xru3z+Q5nre/eOnv7H/b2Hfobh/4C199615zh9lm9Zr/KpxC2vsf8A039Dt+yX5gfVX4YKlb3FKuNPQfms6v+G504z7bU3u22t/8x7TwPm19vn+tS8z/xeTnLpbbPu/T2q/xawtZXqfdx8wfw4b1e+8B5rzG3b9yD7JrPgfpvce48VzfIru027e9/wOkFOYXnBT6Ca7aA15nj6fMh9V0+ff5ptg+sEra+x3xI43SHyx5+4O9UNtfe7ba3/5OeH+7YwZjnxx3bXv/Y/NO2zz/t2PZJzz9d/yyfMk/2ErYuoby76rfZ+C3XPqSc2Cpv12N7vV6dun3LSbRenZ7n62+0Op9S4WGp3jzHFdp72/m327mdZ2vcfzzuFr36bZ1xwXYtxvOc1Vu4Xt5re/2e9t4t89/bPlA2dbv9t8y/N2Jd55kt3I6+Zfu02783em99x/Nv6z+0qP9w5ov+D632782zN3qrng8X9Geapmn6eXLaZxo+hVfvATYaFOm3Q7p+8bKBaDUb/2fJkS2+QfP6psvPvvB9vK8vzpEtPtViz+J1u1296Ww3mPJvinT96SVD8FCTo36WhC0AgBM0OcppRACAPGELACBI2AIACPJ1Pd+j/VWU11x+V8ZND3cPfAvNwMvW611evD1/m/Tr53D9F19G3e6XpsC4va3Ra38j77vfyZGt71HewLfbz/Lqbu50r9lxvGZdaq9Zrxe4r/1OeNvy0GqdLxBar/Tr51j9eU1fuYto90sJvcq99in2vBer9dsWfglhC+A3iqafntePCFfgNCJsUg4JfJyz5nxWnat5zXp97uvndBfZCOlppOvzWYStX2Fx7HreC5TG2235SbC3/6zusGip28tj2/6r6iJb5tkzmH9dZ7XIoH/d3rPav665utxun9U6Y+Mii/UaaOvUjbOHdR5u54V60HYTFePt1j5wdRUW26etU+4qtqzCbDHuap3VPluGeH6eq/1D26FdwUX9Xnu5q9g+bqtXfDxuuffh0IMiZflhEb6J04hf6L72Raq328+/0tKa2/f2Lxb9e3XK8sP6s9Jtsdyrv13pPy5ST7u+OXhIbW//0mfRf2+dWZl23VIa6+WxttuB+ezqXNevn4LeuGV5+xDT2nr16vTGfaieXn1zb52e7fNsF8py278sb68/tujWq99rPzzuqrlC2zIet57hWNunlF0s80s4svW1tr+Z9+6z9vYf2z7PsxyY/4mT3Ftqb/93+ZR5vsVFNs6uuLBw4CELZfRdnh8XrkDY+kLzTm3+Ea3o7ebmzu1+cG//no3dXmZ1/g8nudiYc8tG5emoWw7bPm7agfU6cfInltrl2LjPvH6OuWb9h68Q+FbC1m+xdze3t3/PWXVy5o+NeZ6rHyElVdTrsmu96s5tqV0OPzBh13o93M67DAaKOjDu86+fAz69PnwZ12x9p7M+0gDOZb/ELyRs/TrzD9nb7e3fc7U6uwzC68P5POxwzFllD9c5/MBzvWsau8Z95vXzpKvV39X5i+3dbny6P9M0TdPPcz4/944Pf6jy1q337Kt7+UWHe3UN04n9e+11464X22IF65ZF+6ot86/bF8Ot9p+Nx536/cfjzjdrvToDW6odrrN3PqvrO9CrP24fPF/tuIP1GtSZbZz89jqL9mnzELNendX2uvJq/17nqdO/p12pqb9Nbkdf/71H7WpfnU9ZLsbrO1utPyt3banDx6lfOdM0TdPPkrAFXN0v3DX9wlW+Pk8KDzUvkp8lpxGBK7r/4vMszf6at/nNr0NO5LcRgSu6/funJb4+eRw4V8UL/LbXISHCFnBRv+qD7Vet7Gfx1PA8pxEBAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACDov2UDcG33+7IFbrdlC3AdwhZ8JB+uzIRvuD6nEQEAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgyHcjAu+0+tV+t9uO9tWviZy7rd4F8GKObAHvVPLQ7fZPNhq09+4CuCZhC7iQXnjqta9yWAu4FGELuJZeSOq1A1ycsAVcRXs9VjG4a8FhLeBqXCAPXEIvTvXaAT6FI1vAJfSORe26Ct5hLeCChC3gKgYhaXAXwMUJW8CXcFgLuCZhC7gWF2kBX0bYAi7kcNJyWAu4LL+NCLxTSVeLmFW31xGq7iZgAR9B2ALeqReVzmoHeDunEQEAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIH/6AXid8leynv9LDSeWmvzJLiDJkS3gdU5MMyeWAogStoDfzmEtIErYAgAIcs0W8GaLb0UsR5jq9sVhp9Xvq16tU45a9a7xclgLSHNkC3inknXmf6Wl11iWe5lp8ZCyvFoK4AUc2QI+yWrS2q4X0QByhC3gog4cgjrwEIA0YQu4osVJwI12HaNyWAt4DddsAQAECVvAF7rfHxwPc1gLeBlhC3idEoDKQjlRWOLR3FK3r/524aJUr047IsCLuWYLeJ3VI0mrjdO/7b3l2mr7auPUbwc4nSNbAABBwhYAQJCwBQAQ5Jot+BTlIqP5Sm/XHDFbvB78IgBcjiNbAABBwhYAQJDTiMBf9//9NarbZ/5phN78e+0AL+DIFvDXp2eR3vx77QAvIGwBAAQJWwAAQa7Zgq9VLlSalVNpvfZVc+e5T71cbhbjOlOnf6m5uKyq117uKh6Ou0s9XGJ9e+2D9QU+nSNb8J3Kh/estPTa99pbp9e/LG9s79XJOTZur3+vvSwv2oEv4MgW/Arz53dOXb9NCc+P/nyF1nie7b3P2Dv/vf2BKxO24Dvdbrf7/V4nhnM/vwf1BwOdm2CeNJjnvHbzf+v2s+Z/Vh3gIwhb8LUWx2nm9FDd/6wD9R92uLiz5n9WHeAjuGYL4ARz3Fy2Aghb8K3Sn/1P1n/y4W+3d/69/r124Jv8maZp+t+3xM9veYe34ZJ+3pnzZ/OW81CLT/HykF779O9dbf9yDdN816DOql7/tmYZaNFz1qszdeY/aG/VE4iu76J9+wwX6hnODdWdwEvN7+PqHfyzJGzBp1iJJtC8HoQteJsmR/0sOY0IABAkbAEABAlbAABB/s4WfIrFtTguzaHm9QDX5cgWAECQsAUAECRsAQAECVsAAEHCFgBAkLAFABAkbAEABAlbAABB/qgpfKT5604BuD5hCz5M9X3yAHwApxEBAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACC/ls2TNP9vmwBAOCYP9M0TZN4BQBwrtv8P6cRAQCChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAAAAAAAAAAAADgK/w/O572RyDxlzcAAAAASUVORK5CYII="},51754:(A,g,C)=>{C.d(g,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAzAAAAJKCAIAAAB8pDdfAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAM3ElEQVR4Xu3d0VLiygJAUeaWH5tP4nPvA8eYaQiiMu4krFXzgE1sMloFu7ojnE4AAAAAAAAAAAAAAEDizzjw4TwOAADwI9M4cDqdTqf/jQMAAPwuQQYAEBNkAAAxQQYAEBNkAAAxQQYAEBNkAAAxQQYAEHsbB66cvUEsAMAPTLffDvbD50F28elEAAAMHlzYsmUJABATZAAAMUEGABATZAAAMUEGABATZAAAMUEGABATZAAAMUEGABATZAAAMUEGABB79LMsgQO4+ZFqT/+k2vlRhpnXxu84n/86+Bsz3PSseQaXae/MeeeA4Vdz8xjgwKyQwQuZX+an6R++5K/NvDa+5jofvzrDmmfNs3QntmaXe6//X/P3zr+X62OAYxNk8Lru1wMAv0aQwUvTZKfT6Xz+6YrUI8tjFzcXwJYLlo9PBRyJa8jgRS0vz5ojYLi4am18vmv23IBYTn4zUJ54PsP8N+e5ecz9h7g5D8AaK2Twim7mwiXRrhPkeny+dxh/lnna4fbSU85nrbS+Os/g2/MM5wO8Ditk8IqmxaLX47YTCk88kydOteYXHgLYO0EGL+p4lfCNxDy9r/8NIz906d3lPMf7aQPPJciAg/hG9MzltPzeb8xzbTnJ9UOseeQY4JBcQwYv7eerQZzeQ+qRH6arxICbBBm8rkcCYguG7b9Pfen4Oy31pXmWfv8bgb0TZPBC5hf7B1/4l8cvzREzzzPs0A037o+vWabSnWw6fXY+1746z/X4tZtnO8zzyLkBr+nPOPDhv2cdzyAAS54VgcddPWPcfu6wQgbwBVfPrQBP4K8sAT4xbFOqMeDpBBnAJxQY8K/ZsgQAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAIDY2zgA8OvO53FkC6ZpHAH4RwQZsBXbCaBtBiJwYLYsAQBiggwAICbIAABiggwAICbIAABiggwAICbIAABiggwAICbIAABiggwAICbIAABiggzYjfP5r0+ZHL4E2C9BBuyMCAOOR5AB+6PJgIMRZAAAsbdxAGCHhjWzafrrS4CNs0IG7Mwltoar+y/jl3/DvQDbJ8iA/bEABhyMIAMAiAkyYJcskgFHIsgAAGKCDAAg5m0vgN2bpvFjlGxoAvsiyIDdGDJr+aUCA3bNliUAQEyQAQDEBBkAQMw1ZEBovvLrckH+di4EG87HJzEB/5YVMgCAmCADAIgJMmA3zufz+f3dxpa3AfZOkAEAxAQZAEBMkAEAxLztBXAEw/Vk0/tHKa2NA2yKFTJgNy45NV/OP1TX9G4eWRsH2BpBBuzJHGHzjcfNWQawNbYsgYO4Xv2apml4dwxBBmyTIAMO4mZsLQcvcXbzMICWLUsAgJggA45m3qYc9isBNsuWJbAnc2AtNx/XrhVbGwfYGkEG7MlaUX11HGBTbFkCAMQEGQBATJABAMRcQwaEhj+B3NpfRG7tfIDDskIGABATZAAAMUEGABATZAAAMUEGABATZAAAMUEGABATZAAAMW8MC2zF2fuwAq9KkAG9aRpHAF6KLUsAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgNjbOLDifB5HAAB4ij/jwAcJBgDwXNM4cDqdbFkCAOQEGQBATJABAMQEGQBATJABAMQEGQBATJABAMQEGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDr+D+VT1dp1SpSzAAAAABJRU5ErkJggg=="},23506:(A,g,C)=>{C.d(g,{Z:()=>e});const e=C.p+"assets/images/uefi-choosing-boot-device-62df6cbf7123313a863cc3e6199c5eae.png"},61857:(A,g,C)=>{C.d(g,{Z:()=>e});const e="data:image/png;base64,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Zc/4568jAHMX5nFXd46uAqCMhG7/E316/avtGv/kdQRg7trfr07T8fZrrCtUF21M3OH1AviZrs3jiRyTG/Ny1G3Uvteozqh9r7Pq7HXWfp/WedoBgInzf786T8rlxVb3wivvcW97Uu1oYlTncPta/Dpx2Xk0wmQ+zjbM2v1ubE82Hp+qW35e5aqyQ9u+POsPwESaPM/PY36UMr8BOCBNpGH3q/kGhDHAWd79+9V8OjelAa4gj9lHAANcwf1qAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiPdVLK/FMgDwHo/F9TEA3IE8BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiPe/umFZfv/+p24CAE719fWrfNjJ46TqBwCconvd6341AMSTxwAQTx4DQDx5DADx5DEAxJPHABBPHgNAPHkMAPGG3wdSeNQNAMBua91QcH0MAPHkMQDE23K/Gs63rp37No/HY2lWpcaRts68/2Hruu6qvLd/ZddBKJUbbt+qkou0FV58XlHa82T5+9mlDtVTmxyH1uGXDBLXx8TIs9Xj8ehOi7m9O5NmbZ15/2P21tzbv1U+r2VzwfLo5YcH5L1XDhcM154npe7zKhO626G097yFljzmFtopkuzY/N4NHpLyyHQPbBnGx44/7CWPuQvhwTvl880PLtyEz4+5hfWCTyWrC5pcf1d72VheM41M+nfrH7C3Ttm/Gkz5HOd13vC83un08+3xeKzrmsuWxfce/088npxCHhOsnX3SvFY2Lk23pDvrjea4NFfube9Wmxj1H9XPHTaa1Emr0kJZudt5r6uf19vko7RR9XS6m6cOj+LUPXz8P+54ciJ5TLAqS3JLkts3Tkkbu2V7+99ZyoO0UK97l8Bdb9Seb7vMn2AuLkQ5QB5zC69PXimNqnmwnXZzt7IlL7f972nXOHd13mt+PG9r+yC398yqU/HA8T+wCd+APOYzdGeop3Nlt0MVwHnerFbd2fZxpuN2OBi2mBzP76d7DCfP99jxnxTkG5PHfIYtM1R1XQKnG51aZe7CMf7eifs6cY5LOV0uzI26jdpH9vbvShW6x+GU+gfk/UYN4GrlFe3k+B+W68+Lf9fDS9dXsfzvq/779z/Lsnx9/frT3j9R4BXlLFNNRpNVrdy5nEC7twdzqb3tSbWjp9r+8/qVSefRqtFxK0fSPT5Ve7mqbExefF5RtjyjrH1qW57U6Dg8Pc7z8WzZNZ/j3xe3m7PyGADeY5az7lcDQDx5DADx5DEAxJPHABBPHgNAPHkMAPFO+H6u7p/QTdorW/4g7wpn7Xf+F4rztVs8rbD6Oip4pvqj3uTEN87p9b2vf6BXr4/zWdg9HbdLm79Y5Fzrum4Zz/w9M1l7Sv0tFYD8Pno8HvP31DGH63fngbaFn+ClPK5OGucQ8BF2ReYBV9fnW3rpfnU651IMv37+3S3OX39Gc1fXByaufgNurL+xGz/BS3l8tSqh2/ivfhTo9j8mlyqLlI3tTyHdTUa6nXfVL59s2xkYWaf/SPbr80lZvztHtbtoW/Ly9v3y6d6Xx9XJneRTLSVQzqGlORfXda3eRZW9/ZPuqJYiEbOyfrWvLG21Zb+v15/3BLom77v0ML2/5u2V8g1YdSjfs1XNvPa/3s9mAL639+Xx03PraYcrlO+3v9fsdvX4r64PP0EbgaXRuyy3jzpkbf0cyWm5XAWl9+Xxe0zeaQBL7wq1nDdej8zXK/AzXZLH5cmdfyrsJuXpJ+7pBYHvrZw0UjZPppED81g5B86L88NdksdV+qbzz1kI3MexaNy+ybH6/GQv/f3xRD4RTz8jU8H0k2Z+2Modfoif9nzhFfnNsvGNs7FbVtZf/r4m2VtnV38+2lex/O+r/vv3P8uyfH39+tPeD7yzlOdr9bA6EcvorbYqG7NRVCeT/eaHSbcxt+fG8mF3k3b8VfuB+m0HoFW9uZL5PDNq7xrV704I3V1U9b2vv6l/X9Zuzsbn8SdqQ/FcV9cHIMIsZ6+6X/39rOva/RH4LFfXB+DOXB/vMLm5dIqr6wMQapazl/x+9Xd1dUZeXR+A29qSx26iAsC1fH4MAPHkMQDEk8cAEE8eA0A8eQwA8eQxAMSTxwAQTx4DQLzh94Gkb/MCAN6gk8fFN2oCAO/gfjUAxJPHABBPHgNAPHkMAPHkMQDEk8cAEE8eA0A8eQwAAAAAwB38PyZrkDdbrqQ1AAAAAElFTkSuQmCC"},11151:(A,g,C)=>{C.d(g,{Z:()=>t,a:()=>n});var e=C(67294);const o={},I=e.createContext(o);function n(A){const g=e.useContext(I);return e.useMemo((function(){return"function"==typeof A?A(g):{...g,...A}}),[g,A])}function t(A){let g;return g=A.disableParentContext?"function"==typeof A.components?A.components(o):A.components||o:n(A.components),e.createElement(I.Provider,{value:g},A.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[2595],{39910:(A,g,C)=>{C.r(g),C.d(g,{assets:()=>r,contentTitle:()=>n,default:()=>s,frontMatter:()=>I,metadata:()=>t,toc:()=>i});var e=C(85893),o=C(11151);const I={title:"Booting with Secure Boot Enabled",summary:"Instructions for enrolling the Solus Certificate when Secure Boot is enabled"},n="Booting with Secure Boot Enabled",t={id:"user/quick-start/installation/secure-boot",title:"Booting with Secure Boot Enabled",description:"Since Solus 4.4 Secure Boot is now supported. When you first boot the ISO, and, if you have Secure Boot enabled in your UEFI firmware; you will have to perform the one-time-step of manually enrolling the Solus certificate. The following guide will walk you through this. If you already have Solus installed and wish to enable Secure Boot, skip ahead here.",source:"@site/docs/user/quick-start/installation/secure-boot.md",sourceDirName:"user/quick-start/installation",slug:"/user/quick-start/installation/secure-boot",permalink:"/docs/user/quick-start/installation/secure-boot",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/quick-start/installation/secure-boot.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Booting with Secure Boot Enabled",summary:"Instructions for enrolling the Solus Certificate when Secure Boot is enabled"},sidebar:"userSidebar",previous:{title:"Disk Partitioning",permalink:"/docs/user/quick-start/installation/disks"},next:{title:"System Requirements",permalink:"/docs/user/quick-start/installation/system-requirements"}},r={},i=[{value:"Enrolling the Solus certificate",id:"enrolling-the-solus-certificate",level:2},{value:"Enabling Secure Boot on an existing install",id:"enabling-secure-boot-on-an-existing-install",level:2},{value:"Final tips",id:"final-tips",level:3},{value:"Useful links for additional reading",id:"useful-links-for-additional-reading",level:2}];function a(A){const g={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,o.a)(),...A.components};return(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(g.header,{children:(0,e.jsx)(g.h1,{id:"booting-with-secure-boot-enabled",children:"Booting with Secure Boot Enabled"})}),"\n",(0,e.jsxs)(g.p,{children:["Since Solus 4.4 Secure Boot is now supported. When you first boot the ISO, and, if you have Secure Boot enabled in your UEFI firmware; you will have to perform the one-time-step of manually enrolling the Solus certificate. The following guide will walk you through this. If you already have Solus installed and wish to enable Secure Boot, skip ahead ",(0,e.jsx)(g.a,{href:"#enabling-secure-boot-on-an-existing-install",children:"here"}),"."]}),"\n",(0,e.jsx)("em",{children:"Note that this only applies to machines with UEFI firmware, if your machine uses the older BIOS firmware you can safely ignore this article. If you wish to avoid having to do this step then you may disable Secure Boot in your machine's UEFI firmware interface."}),"\n",(0,e.jsx)(g.h2,{id:"enrolling-the-solus-certificate",children:"Enrolling the Solus certificate"}),"\n",(0,e.jsxs)(g.p,{children:["After ",(0,e.jsx)(g.a,{href:"/docs/user/quick-start/installation/#boot-the-media",children:"booting"})," the ISO from USB/DVD and, if Secure Boot is enabled in your device's UEFI firmware. A warning will appear concerning a Secure Boot violation, press ",(0,e.jsx)(g.code,{children:"Enter"})," on your keyboard to continue."]}),"\n",(0,e.jsx)(g.p,{children:(0,e.jsx)(g.img,{alt:"Secure Boot violation",src:C(95762).Z+"",width:"807",height:"577"})}),"\n",(0,e.jsxs)(g.p,{children:["Now, it will provide 10 seconds in order to continue to MOK (Machine Owner Key) Management, press ",(0,e.jsx)(g.code,{children:"Enter"})," again within the timeframe to do so."]}),"\n",(0,e.jsx)(g.p,{children:(0,e.jsx)(g.img,{alt:"Continue to MOK Management",src:C(48979).Z+"",width:"811",height:"581"})}),"\n",(0,e.jsxs)(g.p,{children:["Use the down ",(0,e.jsx)(g.code,{children:"\u2193"})," arrow key on your keyboard to select ",(0,e.jsx)(g.code,{children:"Enroll Key from Disk"})," and press ",(0,e.jsx)(g.code,{children:"Enter"})," to continue."]}),"\n",(0,e.jsx)(g.p,{children:(0,e.jsx)(g.img,{alt:"Enroll Key from Disk",src:C(35529).Z+"",width:"809",height:"581"})}),"\n",(0,e.jsxs)(g.p,{children:["Here you'll need to find the ",(0,e.jsx)(g.code,{children:"solus-enroll-me.cer"})," certificate, it should normally be located in the ",(0,e.jsx)(g.code,{children:"SOLUSESP"})," directory. Use the arrow keys to select a directory, ",(0,e.jsx)(g.code,{children:"Enter"})," to enter it and ",(0,e.jsx)(g.code,{children:"Esc"})," to go back."]}),"\n",(0,e.jsx)(g.p,{children:(0,e.jsx)(g.img,{alt:"Enroll the Solus Certificate",src:C(91370).Z+"",width:"804",height:"577"})}),"\n",(0,e.jsxs)(g.p,{children:["Once you found the ",(0,e.jsx)(g.code,{children:"solus-enroll-me.cer"})," certificate, press ",(0,e.jsx)(g.code,{children:"Enter"})," to enroll it, and press the ",(0,e.jsx)(g.code,{children:"\u2193"})," and ",(0,e.jsx)(g.code,{children:"Enter"})," key to continue. Finally, when confirming you wish to Enroll the key(s) press the ",(0,e.jsx)(g.code,{children:"\u2193"}),' key to select "Yes" and ',(0,e.jsx)(g.code,{children:"Enter"})," again."]}),"\n",(0,e.jsxs)(g.p,{children:["Now, with the Solus certificate enrolled, press ",(0,e.jsx)(g.code,{children:"Enter"})," to reboot the machine, boot the ISO from USB/DVD again and it should continue booting to the installer."]}),"\n",(0,e.jsx)(g.p,{children:(0,e.jsx)(g.img,{alt:"Confirm Key Enrollment",src:C(51754).Z+"",width:"816",height:"586"})}),"\n",(0,e.jsx)("em",{children:"Once Solus is installed you will not have to enroll the certificate again as it will stay enrolled."}),"\n",(0,e.jsx)(g.h2,{id:"enabling-secure-boot-on-an-existing-install",children:"Enabling Secure Boot on an existing install"}),"\n",(0,e.jsxs)(g.p,{children:["If you already have Solus installed and wish to enable Secure Boot then there is one extra step you must perform BEFORE continuing with ",(0,e.jsx)(g.a,{href:"#enrolling-the-solus-certificate",children:"Enrolling the Solus Certificate"})," as normal."]}),"\n",(0,e.jsxs)(g.p,{children:["Firstly, you must confirm you have ",(0,e.jsx)(g.code,{children:"clr-boot-manager, version: 3.2.12, release: 29"})," (or later) installed, run ",(0,e.jsx)(g.code,{children:"eopkg info clr-boot-manager"})," to confirm this. This version of ",(0,e.jsx)(g.code,{children:"clr-boot-manager"})," will have created a new UEFI boot entry on your machine called ",(0,e.jsx)(g.code,{children:"Solus Linux Bootloader"})," that can be booted from with Secure Boot enabled."]}),"\n",(0,e.jsx)(g.admonition,{title:"Before continuing, it is important to note the screenshots provided here are for example only, your UEFI firmware interface will almost certainly look different.",type:"note"}),"\n",(0,e.jsxs)(g.p,{children:["Reboot your machine and select the appropriate keyboard button during startup to choose a boot device. The correct key will vary from machine to machine but some common keys are ",(0,e.jsx)(g.code,{children:"F2"}),", ",(0,e.jsx)(g.code,{children:"F11"}),", ",(0,e.jsx)(g.code,{children:"F12"}),", or ",(0,e.jsx)(g.code,{children:"Esc"}),". From the boot selection interface, select the ",(0,e.jsx)(g.code,{children:"Solus Linux Bootloader"})," entry and boot from it. If you've manage to successfully boot then you can continue with enabling Secure Boot."]}),"\n",(0,e.jsxs)("em",{children:["If there is no entry called ",(0,e.jsx)(g.code,{children:"Solus Linux Bootloader"}),", reboot, log back in, open a terminal and run ",(0,e.jsx)(g.code,{children:"sudo clr-boot-manager update"}),"."]}),"\n",(0,e.jsx)(g.p,{children:(0,e.jsx)(g.img,{alt:"UEFI Choose Boot Device",src:C(23506).Z+"",width:"645",height:"463"})}),"\n",(0,e.jsxs)(g.p,{children:["After successfully booting from the new ",(0,e.jsx)(g.code,{children:"Solus Linux Bootloader"})," UEFI entry, open a terminal, input ",(0,e.jsx)(g.code,{children:"systemctl reboot --firmware-setup"})," and press ",(0,e.jsx)(g.code,{children:"Enter"}),". This will reboot you into your machine's UEFI firmware interface. Once there, you will have to find and enable the Secure Boot setting. Where this is located varies from machine to machine. Some common places it can be located under are ",(0,e.jsx)(g.code,{children:"Windows OS Configuration"}),", ",(0,e.jsx)(g.code,{children:"Security"})," or ",(0,e.jsx)(g.code,{children:"Device Manager"}),"."]}),"\n",(0,e.jsx)(g.p,{children:(0,e.jsx)(g.img,{alt:"UEFI Secure Boot Configuration",src:C(61857).Z+"",width:"645",height:"460"})}),"\n",(0,e.jsxs)(g.p,{children:["Once you've found and enabled the Secure Boot setting then reboot once again from the ",(0,e.jsx)(g.code,{children:"Solus Linux Bootloader"})," UEFI entry. From there you can continue with the instructions: ",(0,e.jsx)(g.a,{href:"#enrolling-the-solus-certificate",children:"Enrolling the Solus Certificate"}),", bearing in mind you are booting from a disk rather than from a USB/DVD."]}),"\n",(0,e.jsxs)("em",{children:[" Remember to save settings after enabling Secure Boot! (usually ",(0,e.jsx)(g.code,{children:"F10"}),")"]}),"\n",(0,e.jsx)(g.h3,{id:"final-tips",children:"Final tips"}),"\n",(0,e.jsxs)(g.p,{children:["Once you've successfully enabled and booted your Solus install with Secure Boot enabled. Go back into your machine's UEFI firmware interface and change the default boot device to ",(0,e.jsx)(g.code,{children:"Solus Linux Bootloader"}),"."]}),"\n",(0,e.jsxs)(g.p,{children:["You can run ",(0,e.jsx)(g.code,{children:'bootctl status | grep "Secure Boot"'})," in a terminal to verify Secure Boot is enabled."]}),"\n",(0,e.jsxs)(g.p,{children:["It is possible to delete the old Solus UEFI boot entry with ",(0,e.jsx)(g.code,{children:"efibootmgr"})," once Secure Boot is enabled successfully, However, caution is required and as such, instructions to do so are not provided here."]}),"\n",(0,e.jsx)(g.h1,{id:"why-is-enrolling-the-solus-certificate-necessary",children:"Why is enrolling the Solus certificate necessary?"}),"\n",(0,e.jsxs)(g.p,{children:["In order to avoid the one time step of enrolling the Solus certificate, Solus would have to get it's own ",(0,e.jsx)(g.code,{children:"shim"})," EFI executable signed by Microsoft. Currently, the following actions must be completed to do this:"]}),"\n",(0,e.jsxs)(g.ul,{children:["\n",(0,e.jsx)(g.li,{children:"Obtain an EV Certificate (expensive!)"}),"\n",(0,e.jsx)(g.li,{children:"Register for the Microsoft Windows Hardware Developer Program."}),"\n",(0,e.jsxs)(g.li,{children:["Implement any additional security requirements as required by the ",(0,e.jsx)(g.a,{href:"https://github.com/rhboot/shim-review/",children:"shim-review"})," process."]}),"\n"]}),"\n",(0,e.jsxs)(g.p,{children:["Currently, we are using a third-party ",(0,e.jsx)(g.code,{children:"shim"})," that is already signed by Microsoft, the downside is the Solus (vendor) certificate is not already embedded and trusted in the ",(0,e.jsx)(g.code,{children:"shim"})," executable, and as such, requires the user to enroll the Solus certificate manually on first boot."]}),"\n",(0,e.jsx)(g.p,{children:"We appreciate that having the enroll the certificate may be confusing to users and, the process to do so may not be self-explanatory. Especially, as Secure Boot is generally enabled by default for the majority of machines."}),"\n",(0,e.jsx)(g.p,{children:"However, it is also important to consider the following:"}),"\n",(0,e.jsxs)(g.ul,{children:["\n",(0,e.jsx)(g.li,{children:"Obtaining an EV certificate is an expensive investment."}),"\n",(0,e.jsx)(g.li,{children:"Enrolling the Solus certificate is only required once, and, only if Secure Boot is enabled."}),"\n"]}),"\n",(0,e.jsxs)(g.p,{children:["As such, we are not currently looking to our get our own ",(0,e.jsx)(g.code,{children:"shim"})," signed by Microsoft. However, thanks to our supporters on ",(0,e.jsx)(g.a,{href:"https://opencollective.com/getsolus",children:"OpenCollective"}),", it is indeed within our budget to obtain an EV certificate in the future which would unblock the additional requirements."]}),"\n",(0,e.jsx)(g.h2,{id:"useful-links-for-additional-reading",children:"Useful links for additional reading"}),"\n",(0,e.jsxs)(g.ul,{children:["\n",(0,e.jsx)(g.li,{children:(0,e.jsx)(g.a,{href:"https://learn.microsoft.com/windows-hardware/drivers/dashboard/file-signing-reqs",children:"https://learn.microsoft.com/windows-hardware/drivers/dashboard/file-signing-reqs"})}),"\n",(0,e.jsx)(g.li,{children:(0,e.jsx)(g.a,{href:"https://github.com/rhboot/shim-review/",children:"https://github.com/rhboot/shim-review/"})}),"\n",(0,e.jsx)(g.li,{children:(0,e.jsx)(g.a,{href:"https://github.com/rhboot/shim/",children:"https://github.com/rhboot/shim/"})}),"\n"]})]})}function s(A={}){const{wrapper:g}={...(0,o.a)(),...A.components};return g?(0,e.jsx)(g,{...A,children:(0,e.jsx)(a,{...A})}):a(A)}},95762:(A,g,C)=>{C.d(g,{Z:()=>e});const e="data:image/png;base64,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6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKKguAICC6gIAKPxeDvznfF6OAADwab+GZZ0FAPBY02XJO4wAAAXVBQBQUF0AAAXVBQBQUF0AAAXVBQBQUF0AAAXVBQAAAAAAANzu/9RxiIRrIM4UAAAAAElFTkSuQmCC"},48979:(A,g,C)=>{C.d(g,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAysAAAJFCAIAAABSvP+VAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAQEklEQVR4Xu3d227iyAJAUfpoPpZP4nPPgyPH7VsgwMbQa2k0gsIUhXPxlp1OTicAAAAAAAAAAADe2Z/5wJfLfAAAgLucx1v/m4wCAFBQYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAAtf/mA3+7+M2sAAB3OH//HtZvPxTYYPWZAADs2DmT5SokAEBNgQEA1BQYAEBNgQEA1BQYAEBNgQEA1BQYAEBNgQEA1BQYAEBNgQEA1BQYAEDtqr8LCbzW7C+LDX+qdRx80l9uHeYfJx/vrv6Zs5vG9xf87Pf18S4Xuw7egHNgcHRj+gz/TUf2XS4r9XO/8XXH9fw4vvXQqh83YMczPuLAMygw4C5bwbQ1DsDJVUj4YFkDbb3Q1vhNrjzhB/BeFBgc3fn8dT1xqJBli6z+4NRycDryqKzZ+ZGjnYeuN1vn7BLbML66zc5L7+yH6fzLCXd26XRwOj57iZ31D3d31jOOb61nuvGPOwF4OVch4Q2Mh9jZIXm0PAZfc/Tdmu1KW0/fWedNVnPkvPh5uPtNU2Y5+Xh39aHl4HSd07dw/fqH8a3tt9Yz3p3dBo5JgcF72Dls33qsXc7wO1uv+8DD/6PmWfWo/fAoR1sP8FSuQsI7Of99RfIXhhmG/99vZxk7D11v+U4fsuzTxn64dfJbtz9tP2V1Paft7YF3p8CAg1rNzYeE3aqhdYb5r+meW7cf3Lr+W7cH3oWrkHB0Q4Uc2cGXB3BACgy4y1Pza+cM0/HDdN+t63/29kDMVUg4uvFi3HTktNElo/HRy+JHqa704+vOFrD1itPNhtv769l6X1vrWY7/znSe8fbOUre231rPcnxn8tPt2w9mqwIO68984MvXF70vY+C9HOq71qEWA/QW3wS+b7kKCXyOxTe7F1g9AQYw4yok8N5mufPa/Dotrh6+fD3AMSkw4L0dMHEOuCTgaFyFBACoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgJoCAwCoKTAAgNp/8wH4OJfLfOR8no98kvH9PvttXi5Pf4mbTD/QwcKGlxtfaHp39ik3G5zeDdZ5WEf7/IGYc2B8vvG7/Pk8PxZ+pOaodrR9OAZN/CEeXmj6ctOViK0t2QcIDss5MODTHL91NBngHBh8uMvF+YbnsnuBX3AOjH/XeB5iPIKO5yRmx9Rfj2+Zbj+bZLme2fmSm06frD539Lv5p5OsPne0M8lp+/2OD41m61xuv+WmeaZ3f9wJ97hy8p31TN/XbHD5vsaHZoPT8dlL7Oy34e7OesbxrfVMN75yV8BHcg6Mf9d4PDj//fM641HhzvEdqxtvrefXZoe3X6xz1fj02e1b5996v1vzbG2/emO8fdM8M1vjU8MMw/+vd+v2g3E9yzc1DA53Vx9aDk73z2zPbD1lZhjf2n5rPePd2W341zgHxj9kdqyaWR3csbX91vhLHGoxjzV9a+fFWZnrLZ+yFRxbljP8aOiSK926nmc72nrgTSkw/iHXH/NOa4eZ4TA/HR8m3BrfsZz8SZZH+uyl7/SqdQ4fzTHpnmH8hPnx8+S0sZ5b13br9qftp6yu57S9PbBFgcG61aPjdHB6EN0aXzUcq4YNnnrcWj3S7yzsUN5lnb1bP39u3X5w6/6/dXvAz4EB1G7tIeDzKDD4wXAaaXpjZmv8CHaO9I9a9qPm2fLs+dl36/5/9vbwMRQYn2/8/j77Rr81PlbLeGyYXmq8fnzLdPudQhot59+3tc1ynq31X2O68q159vfD6Mf1zPbScpGrD/1inof48XXvNJ3/mpm3tp+OT22tf8ut2w+WK4F/zZ/5wJevr0hfHnA0z/6qfPb8U+VrscMHAp5k8cX1fcs5MHgniy/mB3v2/BzHeMoKeAn/FhKObnaYfHgePXv+LePrXnb/6ShPcv77t6j4EEBMgcHRPfvQ+Oz5t7zqdRn5EMALuQoJAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFBTYAAANQUGAFD7bz7wK5fLfOR8no/c5HK5d4ZXme2Kg7+LcbUHXycAfJjHnAMbj9/n89ftZZNdb+e5l8veo/e7c/7hucNOuH8/BIQXALzEYwoMAIDrPeYqZObZ52yePT8AwCkosK2fi1odnw6OV/RmI9PBcZuth6aP/lhXW5Oszv8oq/vhUeP76589ZbA6DwDwWH/mA1++jsNXtstp48g9e/osCJbjq3enlg9NR1bnXz5lx3LjW6ea7YfT7vZbb/xR49fcXh0cXPN+AYAtiyPp960HnwMbD+SXt/3HjHeavuthv1/v1j126/ajxSfEuh83AAB+58EFxk2GU1DTULsn4O63vx4A4FEU2IvNkmt67vAl9bOzHgDgUfw2CgCA2qELbHZF7L1c87NWV77Brc22xn/t4RMCAKse828hl4ft8Smzh34cH4yPbv1c1Gye4e7y9ujHt3C6cf4tq5Ps2FrnY8eX659tvzV+zVsAAFYtyuH71mMK7Mg+4C0AAO9oESHftw59FfLXLq6mAQAH9pkFNl5QW7QnAMDrfexvo1BdAMBhfeY5MACAI1NgAAA1BQYAUFNgAAA1BQYAUFNgAAA1BQYAUFNgAAA1BQYAULvqd+L7G4sAAA/0Zz7wRXMBADzW999MdBUSAKCmwAAAagoMAKCmwAAAagoMAKCmwAAAagoMAKCmwAAAAAAAAAAAAAAAAAAAAAAAAOB1/g8woPo/FVU5nQAAAABJRU5ErkJggg=="},35529:(A,g,C)=>{C.d(g,{Z:()=>e});const e="data:image/png;base64,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z79/vcB7cs8RDuXqmftyOZ3/+yGnrfH52WH8FdY1s17pnu3ZGh8Mc06ePw5b47N5qrX14JfrvTEb8Clc94JDOS8u4ezXn8sfW+P6VeuRLfORufGSG08Ndh7kL9d429UXXh0EPoj2gqP50HPz1ZqZgml9pepnTVv1WObetmd/p1UDn8s9R+DnLe+1DabB+alvz513c3t/rw4Cn0V7wTE5PQO8J+0FB3SY8BpuwB3env116Qs+nfaCI5jPxHtO3qf/Lr80n9fneZY3AbdetTW+trXAcr3Lttjanq15bri6kVcHT9vrvddynsnttW+t94H9Bd7Wr8XjP2/uZ77RAN/L+5Fn+PcDvdX7bnwHuu4FANDRXgAAHe0FANDRXgAAHe0FANDRXgAAHe0FANDRXgAAHe0FANDRXgAAHe0FANDRXgAAnd/jAPB+pt/MCsABaC94a+fzOALAR3PPEQCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCgo70AADraCwCg83sc+MflMo4AAPCkX4vHagsA4Hudh6/dcwQA6GgvAICO9gIA6GgvAICO9gIA6GgvAICO9gIA6GgvAAAAAAAAAAAAAAAAAAAAgOP7P/7OB7w235xvAAAAAElFTkSuQmCC"},91370:(A,g,C)=>{C.d(g,{Z:()=>e});const e="data:image/png;base64,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AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAIErYAAIKELQCAIGELACBI2AIACBK2AACC/ls2TNP9vmwBAOCYP9M0TZN4BQBwrtv8P6cRAQCChC0AgCBhCwAgSNgCAAgStgAAgoQtAIAgYQsAIEjYAgAAAAAAAAAAAADgK/w/O572RyDxlzcAAAAASUVORK5CYII="},51754:(A,g,C)=>{C.d(g,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAzAAAAJKCAIAAAB8pDdfAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAM3ElEQVR4Xu3d0VLiygJAUeaWH5tP4nPvA8eYaQiiMu4krFXzgE1sMloFu7ojnE4AAAAAAAAAAAAAAEDizzjw4TwOAADwI9M4cDqdTqf/jQMAAPwuQQYAEBNkAAAxQQYAEBNkAAAxQQYAEBNkAAAxQQYAEHsbB66cvUEsAMAPTLffDvbD50F28elEAAAMHlzYsmUJABATZAAAMUEGABATZAAAMUEGABATZAAAMUEGABATZAAAMUEGABATZAAAMUEGABB79LMsgQO4+ZFqT/+k2vlRhpnXxu84n/86+Bsz3PSseQaXae/MeeeA4Vdz8xjgwKyQwQuZX+an6R++5K/NvDa+5jofvzrDmmfNs3QntmaXe6//X/P3zr+X62OAYxNk8Lru1wMAv0aQwUvTZKfT6Xz+6YrUI8tjFzcXwJYLlo9PBRyJa8jgRS0vz5ojYLi4am18vmv23IBYTn4zUJ54PsP8N+e5ecz9h7g5D8AaK2Twim7mwiXRrhPkeny+dxh/lnna4fbSU85nrbS+Os/g2/MM5wO8Ditk8IqmxaLX47YTCk88kydOteYXHgLYO0EGL+p4lfCNxDy9r/8NIz906d3lPMf7aQPPJciAg/hG9MzltPzeb8xzbTnJ9UOseeQY4JBcQwYv7eerQZzeQ+qRH6arxICbBBm8rkcCYguG7b9Pfen4Oy31pXmWfv8bgb0TZPBC5hf7B1/4l8cvzREzzzPs0A037o+vWabSnWw6fXY+1746z/X4tZtnO8zzyLkBr+nPOPDhv2cdzyAAS54VgcddPWPcfu6wQgbwBVfPrQBP4K8sAT4xbFOqMeDpBBnAJxQY8K/ZsgQAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAICYIAMAiAkyAIDY2zgA8OvO53FkC6ZpHAH4RwQZsBXbCaBtBiJwYLYsAQBiggwAICbIAABiggwAICbIAABiggwAICbIAABiggwAICbIAABiggwAICbIAABiggzYjfP5r0+ZHL4E2C9BBuyMCAOOR5AB+6PJgIMRZAAAsbdxAGCHhjWzafrrS4CNs0IG7Mwltoar+y/jl3/DvQDbJ8iA/bEABhyMIAMAiAkyYJcskgFHIsgAAGKCDAAg5m0vgN2bpvFjlGxoAvsiyIDdGDJr+aUCA3bNliUAQEyQAQDEBBkAQMw1ZEBovvLrckH+di4EG87HJzEB/5YVMgCAmCADAIgJMmA3zufz+f3dxpa3AfZOkAEAxAQZAEBMkAEAxLztBXAEw/Vk0/tHKa2NA2yKFTJgNy45NV/OP1TX9G4eWRsH2BpBBuzJHGHzjcfNWQawNbYsgYO4Xv2apml4dwxBBmyTIAMO4mZsLQcvcXbzMICWLUsAgJggA45m3qYc9isBNsuWJbAnc2AtNx/XrhVbGwfYGkEG7MlaUX11HGBTbFkCAMQEGQBATJABAMRcQwaEhj+B3NpfRG7tfIDDskIGABATZAAAMUEGABATZAAAMUEGABATZAAAMUEGABATZAAAMW8MC2zF2fuwAq9KkAG9aRpHAF6KLUsAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgJggAwCICTIAgNjbOLDifB5HAAB4ij/jwAcJBgDwXNM4cDqdbFkCAOQEGQBATJABAMQEGQBATJABAMQEGQBATJABAMQEGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDr+D+VT1dp1SpSzAAAAABJRU5ErkJggg=="},23506:(A,g,C)=>{C.d(g,{Z:()=>e});const e=C.p+"assets/images/uefi-choosing-boot-device-62df6cbf7123313a863cc3e6199c5eae.png"},61857:(A,g,C)=>{C.d(g,{Z:()=>e});const e="data:image/png;base64,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Zc/4568jAHMX5nFXd46uAqCMhG7/E316/avtGv/kdQRg7trfr07T8fZrrCtUF21M3OH1AviZrs3jiRyTG/Ny1G3Uvteozqh9r7Pq7HXWfp/WedoBgInzf786T8rlxVb3wivvcW97Uu1oYlTncPta/Dpx2Xk0wmQ+zjbM2v1ubE82Hp+qW35e5aqyQ9u+POsPwESaPM/PY36UMr8BOCBNpGH3q/kGhDHAWd79+9V8OjelAa4gj9lHAANcwf1qAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA4sljAIgnjwEgnjwGgHjyGADiyWMAiCePASCePAaAePIYAOLJYwCIJ48BIJ48BoB48hgA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"},11151:(A,g,C)=>{C.d(g,{Z:()=>t,a:()=>n});var e=C(67294);const o={},I=e.createContext(o);function n(A){const g=e.useContext(I);return e.useMemo((function(){return"function"==typeof A?A(g):{...g,...A}}),[g,A])}function t(A){let g;return g=A.disableParentContext?"function"==typeof A.components?A.components(o):A.components||o:n(A.components),e.createElement(I.Provider,{value:g},A.children)}}}]); \ No newline at end of file diff --git a/assets/js/f6faa2b4.a6966a98.js b/assets/js/f6faa2b4.a11f6d9a.js similarity index 98% rename from assets/js/f6faa2b4.a6966a98.js rename to assets/js/f6faa2b4.a11f6d9a.js index 6e0adbb4b..54e54a64c 100644 --- a/assets/js/f6faa2b4.a6966a98.js +++ b/assets/js/f6faa2b4.a11f6d9a.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8143],{40396:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var o=t(85893),s=t(11151);const i={title:"MIDI Keyboards",summary:"Guide for installing and configuring MIDI keyboards on Solus"},r="MIDI Keyboards",d={id:"user/hardware/peripherals/midi-keyboard",title:"MIDI Keyboards",description:"These instructions will guide you through how to set up and use a USB-connected MIDI keyboard on Solus. This will easily let you use the keyboard to play music with a wide set of instruments.",source:"@site/docs/user/hardware/peripherals/midi-keyboard.md",sourceDirName:"user/hardware/peripherals",slug:"/user/hardware/peripherals/midi-keyboard",permalink:"/docs/user/hardware/peripherals/midi-keyboard",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/peripherals/midi-keyboard.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"MIDI Keyboards",summary:"Guide for installing and configuring MIDI keyboards on Solus"},sidebar:"userSidebar",previous:{title:"Mice and Touchpads",permalink:"/docs/user/hardware/peripherals/mice-and-touchpads"},next:{title:"Printers and Scanners",permalink:"/docs/user/hardware/peripherals/printers-and-scanners"}},a={},l=[{value:"Installing required software",id:"installing-required-software",level:2},{value:"Setting up the soundfont in qsynth",id:"setting-up-the-soundfont-in-qsynth",level:2},{value:"Connecting the keyboard",id:"connecting-the-keyboard",level:2},{value:"Keyboard compatibility",id:"keyboard-compatibility",level:2},{value:"M-audio",id:"m-audio",level:3}];function c(e){const n={code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"midi-keyboards",children:"MIDI Keyboards"})}),"\n",(0,o.jsx)(n.p,{children:"These instructions will guide you through how to set up and use a USB-connected MIDI keyboard on Solus. This will easily let you use the keyboard to play music with a wide set of instruments."}),"\n",(0,o.jsx)(n.h2,{id:"installing-required-software",children:"Installing required software"}),"\n",(0,o.jsx)(n.p,{children:"We will need to install three packages in order to use the keyboard:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"qsynth"})," - A frontend for ",(0,o.jsx)(n.code,{children:"fluidsynth"})]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"qjackctl"})," - A controller for the JACK audio server"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"fluid-soundfont"})," - An open source soundfont to use with ",(0,o.jsx)(n.code,{children:"fluidsynth"})]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it qsynth qjackctl fluid-soundfont\n"})}),"\n",(0,o.jsx)(n.h2,{id:"setting-up-the-soundfont-in-qsynth",children:"Setting up the soundfont in qsynth"}),"\n",(0,o.jsxs)(n.p,{children:["In order to use the soundfont, we need to open up ",(0,o.jsx)(n.code,{children:"qsynth"})," and set the soundfont. For the purposes of this article, it would be ",(0,o.jsx)(n.code,{children:"FluidR3.sf2"}),", however any other soundfont should work fine too. You set the soundfont by clicking on ",(0,o.jsx)(n.code,{children:"Setup..."})," and navigating to ",(0,o.jsx)(n.code,{children:"Soundfonts"}),". There you just need click ",(0,o.jsx)(n.code,{children:"Open..."})," and navigate to the soundfont of your liking. The soundfont that we will be using will be placed in ",(0,o.jsx)(n.code,{children:"/usr/share/sounds/sf2/"})," by default."]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"QSynth SoundFont",src:t(3815).Z+"",width:"1039",height:"517"})}),"\n",(0,o.jsx)(n.h2,{id:"connecting-the-keyboard",children:"Connecting the keyboard"}),"\n",(0,o.jsxs)(n.p,{children:["At this stage you need to first verify that the keyboard is plugged in and turned on. Now we just need to open up ",(0,o.jsx)(n.code,{children:"qjackctl"})," to connect the keyboard on a software level. In ",(0,o.jsx)(n.code,{children:"qjackctl"})," you press on ",(0,o.jsx)(n.code,{children:"Graph"})," and drag the keyboard's output to the input called ",(0,o.jsx)(n.code,{children:"FLUID Synth"})," (Your keyboard name will probably differ from the on in the image below). This step will need to be done every time you disconnect or turn off you keyboard."]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"QJackCtl Connect",src:t(68950).Z+"",width:"717",height:"629"})}),"\n",(0,o.jsxs)(n.p,{children:["You should now be ready to play on the keyboard using ",(0,o.jsx)(n.code,{children:"qsynth"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"keyboard-compatibility",children:"Keyboard compatibility"}),"\n",(0,o.jsx)(n.p,{children:"The following keyboards have been tested and/or suggested to function correctly by our users."}),"\n",(0,o.jsxs)(n.p,{children:["This list should not suggest that ",(0,o.jsx)(n.em,{children:"only"})," such devices listed below are compatible with Solus, as there may be devices not listed below that are in fact compatible."]}),"\n",(0,o.jsx)(n.h3,{id:"m-audio",children:"M-audio"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"KeyRig 49"}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},68950:(e,n,t)=>{t.d(n,{Z:()=>o});const o=t.p+"assets/images/qjackctl-connect-ec819e2ca49b8af3c5a395ebad0a2bba.jpg"},3815:(e,n,t)=>{t.d(n,{Z:()=>o});const o=t.p+"assets/images/qsynth-soundfont-3bfc213f843495358dedf524b6ed7fc6.jpg"},11151:(e,n,t)=>{t.d(n,{Z:()=>d,a:()=>r});var o=t(67294);const s={},i=o.createContext(s);function r(e){const n=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[8143],{40396:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var o=t(85893),s=t(11151);const i={title:"MIDI Keyboards",summary:"Guide for installing and configuring MIDI keyboards on Solus"},r="MIDI Keyboards",d={id:"user/hardware/peripherals/midi-keyboard",title:"MIDI Keyboards",description:"These instructions will guide you through how to set up and use a USB-connected MIDI keyboard on Solus. This will easily let you use the keyboard to play music with a wide set of instruments.",source:"@site/docs/user/hardware/peripherals/midi-keyboard.md",sourceDirName:"user/hardware/peripherals",slug:"/user/hardware/peripherals/midi-keyboard",permalink:"/docs/user/hardware/peripherals/midi-keyboard",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/hardware/peripherals/midi-keyboard.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"MIDI Keyboards",summary:"Guide for installing and configuring MIDI keyboards on Solus"},sidebar:"userSidebar",previous:{title:"Mice and Touchpads",permalink:"/docs/user/hardware/peripherals/mice-and-touchpads"},next:{title:"Printers and Scanners",permalink:"/docs/user/hardware/peripherals/printers-and-scanners"}},a={},l=[{value:"Installing required software",id:"installing-required-software",level:2},{value:"Setting up the soundfont in qsynth",id:"setting-up-the-soundfont-in-qsynth",level:2},{value:"Connecting the keyboard",id:"connecting-the-keyboard",level:2},{value:"Keyboard compatibility",id:"keyboard-compatibility",level:2},{value:"M-audio",id:"m-audio",level:3}];function c(e){const n={code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"midi-keyboards",children:"MIDI Keyboards"})}),"\n",(0,o.jsx)(n.p,{children:"These instructions will guide you through how to set up and use a USB-connected MIDI keyboard on Solus. This will easily let you use the keyboard to play music with a wide set of instruments."}),"\n",(0,o.jsx)(n.h2,{id:"installing-required-software",children:"Installing required software"}),"\n",(0,o.jsx)(n.p,{children:"We will need to install three packages in order to use the keyboard:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"qsynth"})," - A frontend for ",(0,o.jsx)(n.code,{children:"fluidsynth"})]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"qjackctl"})," - A controller for the JACK audio server"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"fluid-soundfont"})," - An open source soundfont to use with ",(0,o.jsx)(n.code,{children:"fluidsynth"})]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo eopkg it qsynth qjackctl fluid-soundfont\n"})}),"\n",(0,o.jsx)(n.h2,{id:"setting-up-the-soundfont-in-qsynth",children:"Setting up the soundfont in qsynth"}),"\n",(0,o.jsxs)(n.p,{children:["In order to use the soundfont, we need to open up ",(0,o.jsx)(n.code,{children:"qsynth"})," and set the soundfont. For the purposes of this article, it would be ",(0,o.jsx)(n.code,{children:"FluidR3.sf2"}),", however any other soundfont should work fine too. You set the soundfont by clicking on ",(0,o.jsx)(n.code,{children:"Setup..."})," and navigating to ",(0,o.jsx)(n.code,{children:"Soundfonts"}),". There you just need click ",(0,o.jsx)(n.code,{children:"Open..."})," and navigate to the soundfont of your liking. The soundfont that we will be using will be placed in ",(0,o.jsx)(n.code,{children:"/usr/share/sounds/sf2/"})," by default."]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"QSynth SoundFont",src:t(3815).Z+"",width:"1039",height:"517"})}),"\n",(0,o.jsx)(n.h2,{id:"connecting-the-keyboard",children:"Connecting the keyboard"}),"\n",(0,o.jsxs)(n.p,{children:["At this stage you need to first verify that the keyboard is plugged in and turned on. Now we just need to open up ",(0,o.jsx)(n.code,{children:"qjackctl"})," to connect the keyboard on a software level. In ",(0,o.jsx)(n.code,{children:"qjackctl"})," you press on ",(0,o.jsx)(n.code,{children:"Graph"})," and drag the keyboard's output to the input called ",(0,o.jsx)(n.code,{children:"FLUID Synth"})," (Your keyboard name will probably differ from the on in the image below). This step will need to be done every time you disconnect or turn off you keyboard."]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"QJackCtl Connect",src:t(68950).Z+"",width:"717",height:"629"})}),"\n",(0,o.jsxs)(n.p,{children:["You should now be ready to play on the keyboard using ",(0,o.jsx)(n.code,{children:"qsynth"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"keyboard-compatibility",children:"Keyboard compatibility"}),"\n",(0,o.jsx)(n.p,{children:"The following keyboards have been tested and/or suggested to function correctly by our users."}),"\n",(0,o.jsxs)(n.p,{children:["This list should not suggest that ",(0,o.jsx)(n.em,{children:"only"})," such devices listed below are compatible with Solus, as there may be devices not listed below that are in fact compatible."]}),"\n",(0,o.jsx)(n.h3,{id:"m-audio",children:"M-audio"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"KeyRig 49"}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},68950:(e,n,t)=>{t.d(n,{Z:()=>o});const o=t.p+"assets/images/qjackctl-connect-ec819e2ca49b8af3c5a395ebad0a2bba.jpg"},3815:(e,n,t)=>{t.d(n,{Z:()=>o});const o=t.p+"assets/images/qsynth-soundfont-3bfc213f843495358dedf524b6ed7fc6.jpg"},11151:(e,n,t)=>{t.d(n,{Z:()=>d,a:()=>r});var o=t(67294);const s={},i=o.createContext(s);function r(e){const n=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f81c1134.1a4cc4cb.js b/assets/js/f81c1134.1a4cc4cb.js deleted file mode 100644 index 6f1aa4975..000000000 --- a/assets/js/f81c1134.1a4cc4cb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4031],{4108:e=>{e.exports=JSON.parse('{"archive":{"blogPosts":[{"id":"solus-optimizing-packages","metadata":{"permalink":"/blog/solus-optimizing-packages","source":"@site/devlog/2024-02-09-Intro-to-optimizing-packages-on-solus.md","title":"Intro to Optimizing Packages on Solus","description":"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle","date":"2024-02-09T00:00:00.000Z","tags":[{"inline":true,"label":"pgo","permalink":"/blog/tags/pgo"},{"inline":true,"label":"lto","permalink":"/blog/tags/lto"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"},{"inline":true,"label":"packaging","permalink":"/blog/tags/packaging"},{"inline":true,"label":"optimization","permalink":"/blog/tags/optimization"},{"inline":true,"label":"3","permalink":"/blog/tags/3"},{"inline":true,"label":"clang","permalink":"/blog/tags/clang"},{"inline":true,"label":"gnu","permalink":"/blog/tags/gnu"},{"inline":true,"label":"llvm","permalink":"/blog/tags/llvm"},{"inline":true,"label":"glibc","permalink":"/blog/tags/glibc"},{"inline":true,"label":"hwcaps","permalink":"/blog/tags/hwcaps"},{"inline":true,"label":"x86_64-v3","permalink":"/blog/tags/x-86-64-v-3"}],"readingTime":22.32,"hasTruncateMarker":true,"authors":[{"name":"Joey Riches","title":"Solus Staff","page":{"permalink":"/blog/authors/joey"},"socials":{"github":"https://github.com/joebonrichie"},"imageURL":"https://avatars.githubusercontent.com/u/5338090?s=400&u=f77ed45c7e83814ce3e8bd199fc293bd5b53682b&v=4","key":"joey"}],"frontMatter":{"title":"Intro to Optimizing Packages on Solus","description":"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle","slug":"solus-optimizing-packages","authors":"joey","tags":["pgo","lto","solus","packaging","optimization","3","clang","gnu","llvm","glibc","hwcaps","x86_64-v3"],"hide_table_of_contents":false},"unlisted":false,"nextItem":{"title":"Don\'t call me MATE, pal!","permalink":"/blog/don\'t-call-me-mate-pal"}},"content":"We\'ll explore how to build packages with advanced compiler techniques in order to squeeze more performance out of the box for packages in Solus. We\'ll be using the story of how `libwebp` was optimized for and how it led to an unexpected side quest.\\n\\n\x3c!-- truncate --\x3e\\n\x3c!-- cspell:disable-next-line --\x3e\\n\\n# Cual es la causa\\n\\nLinux distributions have a lot of control over how a source-based package gets compiled and shipped to users as part of a binary repository. Aggressive and advanced compiler optimization techniques, as well as other methods can be used to provide greater out of the box performance for end users. This can greatly benefit users running on older hardware to provide a snappier end-user experience; reducing time waiting on a heavy workload to finish; or even improved battery life; amongst other improvements.\\n\\nPart of the problem is, a packager\'s time is limited. So how, as a distribution, do you choose to try provide faster compatible packages for an end user. A historic approach is to simply change the default compiler flags for _all_ packages, such as enabling [LTO](https://en.wikipedia.org/wiki/Interprocedural_optimization) by default. Whilst this approach can work well, at Solus the philosophy is slightly different where a packager can trivially enable several advanced compiler optimization techniques such as [PGO](https://en.wikipedia.org/wiki/Profile-guided_optimization) without too much faffing around on a _targeted_ package.\\n\\nThe benefits of such an approach are:\\n\\n- Can target the performance of a specific package to benefit _all_ users\\n- A compiler optimization may improve one package, but may not apply globally to all packages.\\n\\nThe downsides are such:\\n\\n- Requires additional packager time to benchmark and experiment with different optimization strategies.\\n- Requires the packager to _choose_ and invest time into improving performance of a package.\\n- Requires the packager to find an appropriate benchmark to test the package against.\\n- Experimenting with compiler optimizations may not bear fruit: no meaningful improvement in performance, or there may be some other bottleneck.\\n\\n# Optimization Techniques Available\\n\\n- speed:\\n - As simple as it gets really, build a package with `-O3` instead of `-O2` as well as any other flags deemed worthy to be included as part of the `speed` flags. The main drawback of this is that `-O3` is not guaranteed to produce faster results than building with `-O2` and typically will produce bigger binaries. The days of `-O3` outright breaking your program in weird unexpected ways is largely behind us.\\n- LTO:\\n - Compared to some other distributions `-flto` is not yet enabled by default on Solus. LTO is almost guaranteed to provide a %1 or slightly larger performance improvement as well as a smaller binary at the cost of increased compiling times and memory usage during build. When combined with other optimization techniques such as PGO the LTO optimization can really stretch its legs and provide even greater uplift!\\n- Clang:\\n - Not strictly an optimization, but, building a package with `clang` instead of `gcc` and `ld.ldd` to link instead of the infamous `ld.bfd` may provide a faster package out of the box. You\'ll have to be careful of subtle ABI differences if building with `clang`. If in doubt, and, `clang` is the obvious choice, perform safety rebuilds on all reverse dependencies of the package.\\n- PGO:\\n - Profile guided optimization. Build once with instrumentation in order to collect profile data when ran. Run the program using a representative workload in order to collect profiling data. Build the program again with the profiling data provided in order to build an optimized variant.\\n- BOLT:\\n - Binary optimization and layout tool. You can think of this as \\"post-link PGO\\" where you instrument a binary with `bolt` to collect profiling data. Run that binary. Then finally reorganize the binary layout using the collected profile data. This generally works better on large statically linked binaries but smaller binaries or libraries such as found in a typical package can benefit too. This optimization is still quite new.\\n\\nRegardless, that\'s enough word spaghetti, let\'s look at the process to actually optimize a package.\\n\\n# Optimizing a Package\\n\\nRight, to begin with we\'ll have to start on choosing an actual package to benchmark and optimize. I\'ve heard the `.webp` file format is becoming increasingly common on the web, slowly replacing `.png` and `.jpg` file formats due to the strong backing of Google (for better or for worst). An improvement in decoding time for `.webp` files would benefit any user using a web browser casually browsing the web.\\n\\nLet\'s have a look at the `package.yml` build recipe for `libwebp`.\\n\\n\x3c!-- prettier-ignore --\x3e\\n```yaml\\nname : libwebp\\nversion : 1.3.2\\nrelease : 25\\nsource :\\n - https://github.com/webmproject/libwebp/archive/refs/tags/v1.3.2.tar.gz : c2c2f521fa468e3c5949ab698c2da410f5dce1c5e99f5ad9e70e0e8446b86505\\nhomepage : https://developers.google.com/speed/webp/\\nlicense : BSD-3-Clause\\ncomponent : multimedia.codecs\\nsummary : A new image format for the web\\ndescription: |\\n WebP is a new image format that provides lossless and lossy compression for images on the web. WebP lossless images are 26% smaller in size compared to PNGs. WebP lossy images are 25-34% smaller in size compared to JPEG images at equivalent SSIM index. WebP supports lossless transparency (also known as alpha channel) with just 22% additional bytes. Transparency is also supported with lossy compression and typically provides 3x smaller file sizes compared to PNG when lossy compression is acceptable for the red/green/blue color channels.\\nemul32 : yes\\npatterns :\\n - devel : /usr/share/man\\nbuilddeps :\\n - pkgconfig32(glu)\\n - pkgconfig32(glut)\\n - pkgconfig32(libpng)\\n - pkgconfig32(libtiff-4)\\n - pkgconfig32(libturbojpeg)\\n - pkgconfig32(zlib)\\n - giflib-devel\\nsetup : |\\n %reconfigure --disable-static --enable-everything\\nbuild : |\\n %make\\ninstall : |\\n %make_install\\n```\\n\\nOkay, looks to be a quite simple affair. A simple configure, make, make install as well as `emul32` being enabled specifying the -32bit packages are also provided from this recipe. Next step is to look for a repeatable and easy way to benchmark it. We\'ll begin by looking at the `pspec_x86_64.xml` file which lists all the files produced from the `package.yml` recipe as well as some metadata.\\n\\n```xml\\n libwebp\\n A new image format for the web\\n WebP is a new image format that provides lossless and lossy compression for images on the web. WebP lossless images are 26% smaller in size compared to PNGs. WebP lossy images are 25-34% smaller in size compared to JPEG images at equivalent SSIM index. WebP supports lossless transparency (also known as alpha channel) with just 22% additional bytes. Transparency is also supported with lossy compression and typically provides 3x smaller file sizes compared to PNG when lossy compression is acceptable for the red/green/blue color channels.\\n\\n multimedia.codecs\\n \\n /usr/bin/cwebp\\n /usr/bin/dwebp\\n /usr/bin/gif2webp\\n /usr/bin/img2webp\\n /usr/bin/vwebp\\n /usr/bin/webpinfo\\n /usr/bin/webpmux\\n```\\n\\nPerfect, we have `dwebp` and `cwebp` binaries available in the main package, which from a guess can be used to decode and encode `.webp` files. Let\'s try it out.\\n\\n```\\n$ dwebp -h\\nUsage: dwebp in_file [options] [-o out_file]\\n\\nDecodes the WebP image file to PNG format [Default].\\nNote: Animated WebP files are not supported.\\n$ cwebp -h\\nUsage:\\n\\n cwebp [options] -q quality input.png -o output.webp\\n```\\n\\nAwesome, these binaries do exactly what we need to benchmark `libwebp`, but, we are also indirectly testing `libpng` as well for this benchmark, we\'ll have to keep an eye out for that.\\n\\nOne extra step we have to do is ensure these binaries are actually linking against their own library, as upstream developers can have a habit of making sure their binaries don\'t link against their own libraries and end up being self-contained. Run `ldd` to verify.\\n\\n\x3c!-- spellchecker:disable --\x3e\\n\\n```\\n$ ldd /usr/bin/dwebp\\n\\tlinux-vdso.so.1 (0x00007ffed8733000)\\n\\tlibwebpdemux.so.2 => /usr/lib/libwebpdemux.so.2.0.14 (0x00007f7473bb4000)\\n\\tlibwebp.so.7 => /usr/lib/libwebp.so.7.1.8 (0x00007f7473ae2000)\\n\\tlibpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007f7473aa6000)\\n\\tlibc.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libc.so.6 (0x00007f74738a9000)\\n\\tlibsharpyuv.so.0 => /usr/lib/libsharpyuv.so.0.0.1 (0x00007f747389e000)\\n\\tlibm.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libm.so.6 (0x00007f74737b8000)\\n\\tlibz.so.1 => /usr/lib/libz.so.1.3.0 (0x00007f7473200000)\\n\\t/usr/lib64/ld-linux-x86-64.so.2 (0x00007f7473bea000)\\n```\\n\\n\x3c!-- spellchecker:enable --\x3e\\n\\nAwesome in this case both `dwebp` and `cwebp` link against `libwebp.so` so we can be confident that any performance improvements will be applicable to all packages in the repository linking against `libwebp`.\\n\\nLet\'s grab a couple of `.webp` files from [here](https://developers.google.com/speed/webp/gallery1) to test with. We\'ll just use the largest image size available in this case to reduce noise as much as possible when running benchmarks as well as allow any potential optimizations to stretch their legs a little more.\\n\\nNow having done the prep work, lets actually benchmark the damn thing using `hyperfine` for the time being.\\n\\n```\\n$ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03c3): 202.2 ms \xb1 0.3 ms [User: 198.9 ms, System: 3.0 ms]\\n Range (min \u2026 max): 201.8 ms \u2026 202.7 ms 14 runs\\n$ hyperfine \\"cwebp ~/PNG_Test.png -o /dev/null\\"\\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\\n Time (mean \xb1 \u03c3): 1.423 s \xb1 0.009 s [User: 1.346 s, System: 0.076 s]\\n Range (min \u2026 max): 1.410 s \u2026 1.435 s 10 runs\\n```\\n\\nThere, we have our a basic baseline for encode and decode performance. We mostly care about decode performance here but improved encoding performance would also not go amiss.\\n\\n## Let\'s Start Obvious\\n\\nLet\'s start basic, enabling the `speed` optimization which basically builds with `-O3` instead of `-O2` as well as any other flags that are deemed to be worthy to be part of the `speed` group. As well as, the `lto` optimization which builds with link time optimization allowing for inter-procedural optimizations to take place.\\n\\n\x3c!-- prettier-ignore --\x3e\\n```yaml\\noptimize:\\n - speed\\n - lto\\n```\\n\\nMoment of truth...\\n\\n```\\n$ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03c3): 200.0 ms \xb1 1.5 ms [User: 197.3 ms, System: 2.5 ms]\\n Range (min \u2026 max): 198.1 ms \u2026 203.2 ms 15 runs\\n$ hyperfine \\"cwebp ~/PNG_Test.png -o /dev/null\\"\\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\\n Time (mean \xb1 \u03c3): 1.353 s \xb1 0.012 s [User: 1.281 s, System: 0.071 s]\\n Range (min \u2026 max): 1.336 s \u2026 1.369 s 10 runs\\n```\\n\\nWell okay, we got a very minor uplift in decoding performance and a slightly higher improvement in encoding performance, but nothing too much to write home about. Luckily we have several more optimizations to explore...\\n\\n## PGO is great, except, when it isn\'t.\\n\\nNext step is to explore PGO (Profile Guided Optimization). For our `libwebp` package, looks like we already hit a bit of a snafu. There\'s no test suite included in the tarball! That\'s a bit of a disappointment as a test suite such as `make check` is by far and away the easiest and most comprehensive workload that can be used for profiling as part of PGO, especially for smaller libraries. However, we can still experiment with the just built `dwebp` and `cwebp` binaries as a suitable workload for PGO.\\n\\nLuckily, as part of the package.yml format all you have to do is provide a profile for automatic PGO. After chrooting into the build environment and fiddling around a bit we end up with:\\n\\n\x3c!-- prettier-ignore --\x3e\\n```yaml\\nprofile : |\\n ./examples/dwebp webp_js/test_webp_js.webp -o test_png.png\\n ./examples/cwebp test_png.png -o /dev/null\\n```\\n\\nAfter specifying that, 6 builds will now be performed instead of 2:\\n\\n- emul32:\\n - Instrumented build\\n - Run profiling workload\\n - Optimized build using profiling data\\n- x86_64:\\n - Instrumented build\\n - Run profiling workload\\n - Optimized build using profiling data\\n\\nFor this relatively small package it increases the build time from 1m1.672s to 1m42.199s\\n\\nThe next moment of truth...\\n\\n```\\n$ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03c3): 204.1 ms \xb1 2.2 ms [User: 201.3 ms, System: 2.7 ms]\\n Range (min \u2026 max): 201.6 ms \u2026 207.1 ms 14 runs\\n$ hyperfine \\"cwebp ~/PNG_Test.png -o /dev/null\\"\\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\\n Time (mean \xb1 \u03c3): 1.349 s \xb1 0.010 s [User: 1.266 s, System: 0.082 s]\\n Range (min \u2026 max): 1.335 s \u2026 1.374 s 10 runs\\n```\\n\\nWell... That\'s interesting. We actually regress in performance for decode performance whilst gaining another small bump in encoding performance. Worse still, we get a bunch of `profile count data file not found [-Wmissing-profile]` warning messages during the optimized build indicating to us our profiling workload isn\'t comprehensive enough and doesn\'t cover enough code paths. The lack of a handy `make check` that could be used as a profiling workload is really hurting us here. For now, let\'s put a pin in exploring PGO, it isn\'t a dead end but more work needs to be done curating a more comprehensive workload to chuck at it in this particular case, whilst other, easier, optimization techniques are still available to us.\\n\\n\x3c!-- cspell:disable-next-line --\x3e\\n\\n## 256 Vector Units go brrrrrr...\\n\\nThe next obvious step is to explore `glibc` hardware capabilities. For those unaware both `clang` and `gnu` compilers provide `x86_64-v2`, `x86_64-v3` and `x86_64-v4` micro-architecture build options on top of the baseline of `x86_64`. These enable the use of targeting additional CPU instruction sets during compilation for better performance. For example, `-sse4.2` for `x86_64-v2`, `-avx2` for `x86_64-v3`, and `-avx512` for `x86_64-v4`.\\n\\nWhilst that\'s great \'n all, if a program is built with `x86_64-v3` and gains an additional ~10% uplift in performance, it\'s no good if a `x86_64-v2` compatible cpu can\'t run it. Luckily the `glibc` loader that\'s found on almost general purpose linux installs provides a way to load higher or lower micro-architecture libraries if they\'re installed and supported.\\n\\nOn top of all that, the `package.yml` format provides an incredibly simple way of providing `x86_64-v3` built libraries by enabling the `avx2 : yes` flag.\\n\\nWith `avx2 : yes` enabled in the `libwebp` package three builds are performed.\\n\\n- emul32\\n- x86_64-v3\\n- x86_64\\n\\nWe now see these additional files in the `pspec_x86_64.xml` file\\n\\n```diff\\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0\\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0.0.1\\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebp.so.7\\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8\\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdecoder.so.3\\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdecoder.so.3.1.8\\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2\\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2.0.14\\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpmux.so.3\\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpmux.so.3.0.13\\n```\\n\\nLet\'s rerun `lld` on `dwebp` after installing the new package and...\\n\\n\x3c!-- spellchecker:disable --\x3e\\n\\n```\\n$ ldd /usr/bin/dwebp\\n\\tlinux-vdso.so.1 (0x00007ffeab5b1000)\\n\\tlibwebpdemux.so.2 => /usr/lib/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2.0.14 (0x00007f9a351d5000)\\n\\tlibwebp.so.7 => /usr/lib/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8 (0x00007f9a3510b000)\\n\\tlibpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007f9a350cf000)\\n\\tlibc.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libc.so.6 (0x00007f9a34ed2000)\\n\\tlibsharpyuv.so.0 => /usr/lib/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0.0.1 (0x00007f9a34ec1000)\\n\\tlibm.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libm.so.6 (0x00007f9a34ddb000)\\n\\tlibz.so.1 => /usr/lib/glibc-hwcaps/x86-64-v3/libz.so.1.3 (0x00007f9a34dbb000)\\n\\t/usr/lib64/ld-linux-x86-64.so.2 (0x00007f9a3520b000)\\n```\\n\\n\x3c!-- spellchecker:enable --\x3e\\n\\nWe can crucially see that `dwebp` is now loading the `x86-64-v3` built `libwebp.so` lib from `/usr/lib/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8`, success! Let\'s what our performance looks like.\\n\\n```\\n$ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03c3): 198.2 ms \xb1 1.2 ms [User: 195.4 ms, System: 2.5 ms]\\n Range (min \u2026 max): 197.0 ms \u2026 200.5 ms 14 runs\\n$ hyperfine \\"cwebp ~/PNG_Test.png -o /dev/null\\"\\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\\n Time (mean \xb1 \u03c3): 1.313 s \xb1 0.009 s [User: 1.243 s, System: 0.078 s]\\n Range (min \u2026 max): 1.308 s \u2026 1.341 s 10 runs\\n```\\n\\nLet\'s recap so far:\\n\\n| Optimization | Decode | Encode | Size |\\n| ----------------------- | ------------------ | ------- | ------- |\\n| Baseline | 202.2 ms | 1.399 s | 1.33 MB |\\n| Speed + LTO | 200.0 ms | 1.353 s | 1.73 MB |\\n| Speed + LTO + PGO | 204.1 ms :warning: | 1.349 s | 1.07 MB |\\n| Speed + LTO + x86_64-v3 | 198.2 ms | 1.313 s | 3.17 MB |\\n\\nWhilst we\'re still getting an additional speedup it isn\'t really anything to write home about. A measly ~2% improvement in decoding performance and a fairly respectable ~7% improvement in encoding performance for our test case. However, increasing the package size by an extra ~2MiB from providing a bunch of extra libs in `/usr/lib/glibc-hwcaps/x86-64-v3/` just ain\'t worth it. This hints that either the compiler optimizations aren\'t really effective here or we\'re being bottle-necked by something else.\\n\\nSo far, we\'ve been benchmarking fairly simply using `hyperfine`, let\'s swap that out for `perf` so we can get a callgraph.\\n\\n## Something about `perf` to the rescue\\n\\n`perf record -o dwebp.data -- dwebp ~/3.webp -o /dev/null`\\n\\n`perf record -o cwebp.data -- cwebp ~/PNG_Test.png -o /dev/null`\\n\\nLet\'s look at `dwebp` first with `perf report -i dwebp.data`.\\n\\n![Perf report dwebp](img/2024-02-09-intro-to-optimizing/perf_report_dwebp_png.webp)\\n\\nWell god damn, literally all of our time is being spent in `libz.so` it\'s no wonder our compiler optimizations were hardly improving performance.\\n\\nLet\'s also look at the `cwebp` report, we\'ve generally been getting better results from it.\\n\\n![Perf report cwebp](img/2024-02-09-intro-to-optimizing/perf_report_cwebp_png.webp)\\n\\nOkay, much more of our time is being spent in `libwebp.so` itself here which helps to explain why we were seeing a better performance uplift. Still 5.68% of our time is being spent in `libz`.\\n\\n## Choosing Wisely\\n\\nYou may remember early on, when I said we are also indirectly testing `libpng`. Well... after some more digging, that\'s exactly what\'s happening here. Re-running the `dwebp` binary it says this\\n\\n> Decodes the WebP image file to PNG format\\n\\nTurns out, it\'s more accurate to say we are _directly_ testing `libpng` and by extension `zlib`. It isn\'t `libwebp` that\'s spending all of its time in `libz.so`, it\'s `libpng`! This is exactly the reason you have to be careful about the benchmarks chosen and, ensure you understand what they\'re doing.\\n\\nHowever, the good news about this little snafu is:\\n\\n1. `dwebp` can be used to translate to another image format such as `.yuv` that\'ll more accurately remove the bottleneck from `libz.so`.\\n2. We now know that `libpng` has a huge bottleneck in `libz.so` and speeding up `zlib` _should_ dramatically speed up `libpng` performance.\\n\\n## Adjusting the Benchmark\\n\\nAfter reverting the `libwebp` package to the baseline let\'s use our adjusted decoding benchmark.\\n\\nWe\'ll now use `dwebp ~/3.webp -yuv -o /dev/null` for a decoding test, let\'s run that with `perf` to ensure we\'re exclusively testing `libwebp.so` here.\\n\\n![Perf report dwebp to yuv](img/2024-02-09-intro-to-optimizing/perf_report_dwebp_yuv.webp)\\n\\nOkay that\'s awesome, no `libpng.so` or `libz.so` to mess with our tests!\\n\\nLet\'s reapply our optimizations, keeping those which apply an uplift\\n\\n| Optimization | Decode | Size |\\n| ----------------------- | ----------------- | ------- |\\n| Baseline | 14.7 ms | 1.33 MB |\\n| Speed | 14.5 ms | 1.56 MB |\\n| LTO | 14.6 ms | 1.40 MB |\\n| PGO | 18.0 ms :warning: | 1.07 MB |\\n| x86-64-v3 | 12.7 ms | 2.35 MB |\\n| Speed + LTO + x86-64-v3 | 12.3 ms | 3.17 MB |\\n\\nOkay, this is great, whilst we aren\'t getting much from speed or LTO, we are getting a big uplift from x86-64-v3 libraries and when combined with the other optimizations we\'re getting an uplift in performance of around ~16% at the cost of close to thrice the installed package size.\\n\\n### Partial Profiling\\n\\nOnce again we see that PGO regresses performance hard, however, that smaller size is giving a good hint! We already know that the profiling workload we gave it isn\'t very comprehensive due to the bunch of `-Wmissing-profile` warnings we get during the optimized build. By default, PGO will aggressively inline and apply additional optimizations to code that\'s part of the profiling workload while everything else will be optimized for size. The idea being, hot-path code is fast and code that doesn\'t matter is small. However, what happens when you can\'t craft a comprehensive workload, as seems to be the case here? Luckily GCC has a flag for exactly that `-fprofile-partial-training`. GCC docs state that:\\n\\n> In some cases it is not practical to train all possible hot paths in the program. (For example, program may contain functions specific for a given hardware and training may not cover all hardware configurations program is run on.) With -fprofile-partial-training profile feedback will be ignored for all functions not executed during the train run leading them to be optimized as if they were compiled without profile feedback. This leads to better performance when train run is not representative but also leads to significantly bigger code.\\n\\nOkay, let\'s try it out, all we need to do is specify in our `package.yml` recipe.\\n\\n\x3c!-- prettier-ignore --\x3e\\n```yaml\\nenvironment: |\\n if [[ -n ${PGO_USE_BUILD} ]]; then\\n export CFLAGS=\\"${CFLAGS} -fprofile-partial-training\\"\\n export CXXFLAGS=\\"${CXXFLAGS} -fprofile-partial-training\\"\\n fi\\n```\\n\\nAnd the results:\\n\\n| Optimization | Decode | Size |\\n| ------------------------------------- | ------- | ------- |\\n| Speed + LTO + x86-64-v3 | 12.3 ms | 3.17 MB |\\n| Speed + LTO + x86-64-v3 + Partial PGO | 12.5 ms | 3.13 MB |\\n\\nWell, it was worth a try. This highlights how useless PGO can be when you don\'t or can\'t provide it a good workload. Interestingly, we don\'t get the size bloat that was promised, in fact, the opposite.\\n\\n# Final libwebp Results\\n\\n| Benchmark | Time Before | Time After | Size Before | Size After |\\n| ----------------------------------- | ----------- | ---------- | ----------- | ---------- |\\n| \\"dwebp ~/3.webp -yuv -o /dev/null\\" | 14.5 ms | 12.3 ms | 1.33 MB | 3.17 MB |\\n| \\"cwebp ~/PNG_Test.png -o /dev/null\\" | 1.399 s | 1.313 s | -- | -- |\\n\\nIn the end, we get a very healthy ~16% improvement in decoding from a .webp to .yuv file. As well as a respectable 6% improvement in encoding from a .png to .webp file. However, the increased package size is very unfortunate. It\'s possible to tweak the x86-64-v3 build and only ship the libs that actually improve performance in order to get the installed size back to an acceptable level.\\n\\n# \\"Next-Generation\\" Side Quest\\n\\nNow, you probably remember earlier due to our unrepresentative benchmark we found out that `libpng` is getting highly bottlenecked by `libz.so`. This now seems like a perfect opportunity to take a look at zlib and circle-back to our original benchmark that we were using.\\n\\nZlib is widely employed throughout the ecosystem and, as such you\'d think it would be highly-optimized for performance. However, that isn\'t really the case. Zlib is written in an old-fashioned way of C and tries to be _extremely_ portable; supporting dozens of systems that have fallen out of common use. As such, it\'s hard to apply architecture specific optimizations that wouldn\'t break some old system or without introducing code spaghetti. There have been a couple of attempts to merge AArch64 and x86_64 optimizations into the canonical zlib library without success.\\n\\nHowever, there is some light in this tunnel as various forks of zlib having been popping up, applying new optimizations on top of zlib. The most promising of these looks be to [zlib-ng](https://github.com/zlib-ng/zlib-ng/). When built in compatible mode, it promises to be API compatible with canonical zlib and _tries_ to be as ABI compatible as possible.\\n\\nLet\'s just go for it, replacing Solus\' `zlib` package with zlib-ng built in compatible mode. It\'s a bit scary due to how integral zlib is in a typical Linux install, but, how hard could it be?\\n\\n\x3c!-- cspell:disable-next-line --\x3e\\n\\n## I Zee a Purty lil\' Package\\n\\nWell that was simple. Here\'s what our zlib-ng `package.yml` recipe looks like.\\n\\n\x3c!-- spellchecker:disable --\x3e\\n\x3c!-- prettier-ignore --\x3e\\n```yaml\\nname : zlib\\nversion : 2.1.5\\nrelease : 28\\nsource :\\n - https://github.com/zlib-ng/zlib-ng/archive/refs/tags/2.1.5.tar.gz : 3f6576971397b379d4205ae5451ff5a68edf6c103b2f03c4188ed7075fbb5f04\\nhomepage : https://github.com/zlib-ng/zlib-ng\\nlicense : ZLIB\\ncomponent : system.base\\nsummary : zlib replacement with optimizations for next generation systems.\\ndescription:\\n - A zlib data compression library for the next generation systems. ABI/API compatible mode.\\ndevel : yes\\nemul32 : yes\\nsetup : |\\n %cmake_ninja \\\\\\n -DZLIB_COMPAT=ON \\\\\\n -DWITH_GTEST=OFF \\\\\\n -DBUILD_SHARED_LIBS=ON \\\\\\n -DINSTALL_LIB_DIR=%libdir%\\nbuild : |\\n %ninja_build\\ninstall : |\\n %ninja_install\\ncheck : |\\n %ninja_check\\n```\\n\\n\x3c!-- spellchecker:enable --\x3e\\n\\nAfter building it, all the files seem to be in the right place and the test suite is passing. Let\'s just install it overwriting our canonical `zlib` package and hope our system doesn\'t die... I think the word is YOLO.\\n\\n```\\n$ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03c3): 198.6 ms \xb1 2.3 ms [User: 194.3 ms, System: 3.6 ms]\\n Range (min \u2026 max): 196.3 ms \u2026 203.3 ms 14 runs\\n$ sudo eopkg it zlib-2.1.5-28-1-x86_64.eopkg\\n...\\n$ $ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03c3): 87.6 ms \xb1 0.7 ms [User: 84.7 ms, System: 2.6 ms]\\n Range (min \u2026 max): 86.5 ms \u2026 88.7 ms 33 runs\\n```\\n\\nWell, hot diggity damn. Swapping out the zlib package for a more performant variant has instantly more than halved(!!) our decoding time.\\n\\nWe need to find a more contained `libpng` benchmark here that removes the `libwebp` stuff to really confirm the findings here. After some sleuthing the `libpng` source repository has a [pngtopng.c](https://github.com/glennrp/libpng/blob/libpng16/contrib/examples/pngtopng.c) file we can compile to use the system libpng library.\\n\\nChanging the header from `#include \\"../../png.h\\"` to `#include ` then running `gcc -Ofast pngtopng.c -lpng16 -o pngtopng` to compile it, we have a libpng benchmark. We can reuse our test .png file from earlier. Ending up with: `./pngtopng ~/PNG_Test.png /dev/null` for our benchmark.\\n\\n| Library | Time |\\n| ---------------- | -------- |\\n| zlib (canonical) | 1.464 s |\\n| zlib-ng (compat) | 896.6 ms |\\n\\nWell. This is pretty much inline with our flawed `dwebp` benchmark from earlier. Swapping out zlib almost halves `libpng` decoding time.\\n\\n## Squeezing more from zlib-ng\\n\\nHowever, we\'re not done yet. We still have our compiler optimizations available to us to squeeze more performance from `zlib-ng`.\\n\\n| Optimization | Decode | Size |\\n| ----------------------------- | -------- | --------- |\\n| Baseline | 896.6 ms | 141.00 KB |\\n| Speed | 883.6 ms | 182.00 KB |\\n| LTO | 892.7 ms | 133.00 KB |\\n| PGO | 894.6 ms | 141.00 KB |\\n| x86-64-v3 | 892.5 ms | 295.00 KB |\\n| Speed + LTO | 882.6 ms | 170.00 KB |\\n| Speed + LTO + PGO + x86-64-v3 | 882.5 ms | 250.00 KB |\\n\\nIt looks like in this case the simple speed + LTO optimizations is the way to go. Speed gives the majority of the speedup but LTO helps bring back down the package size again. However, it\'s only a 1.5% improvement from baseline for this benchmark. We can always re-benchmark it later, testing zlib performance more directly instead of via libpng. It shows how good a job the zlib-ng developers have done that it\'s so performant right out of the gate.\\n\\n# Final Words\\n\\nWe\'ve shown the process of how a package can be optimized in Solus, through the failings and wins here I hope some good tips and tricks were provided in avoiding common pitfalls. Additional benchmarking strategies such as BOLT or Polly optimizations were not discussed and it\'ll be good material for a future blog post.\\n\\nSome other important things such as tweaking the system for benchmarking in order to get representative and consistent results were also not discussed. This is especially important in power budget constrained systems such as laptops and worth bearing in mind.\\n\\nRegardless, I hope the story of how `libwebp` was optimized for was entertaining and some things were learnt for anyone looking to optimize packages in Solus for the future."},{"id":"don\'t-call-me-mate-pal","metadata":{"permalink":"/blog/don\'t-call-me-mate-pal","source":"@site/devlog/2024-01-29-dont-call-me-mate.md","title":"Don\'t call me MATE, pal!","description":"Back in our 4.4 release post we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we\'re getting ready to ship the Solus MATE Transition Tool to move existing users off of MATE.","date":"2024-01-29T00:00:00.000Z","tags":[{"inline":true,"label":"MATE","permalink":"/blog/tags/mate"},{"inline":true,"label":"devlog","permalink":"/blog/tags/devlog"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"}],"readingTime":2.645,"hasTruncateMarker":true,"authors":[{"name":"David Harder","title":"Solus Staff","page":{"permalink":"/blog/authors/david"},"socials":{"github":"https://github.com/davidjharder"},"imageURL":"https://avatars.githubusercontent.com/u/23007135?v=4","key":"david"}],"frontMatter":{"title":"Don\'t call me MATE, pal!","slug":"don\'t-call-me-mate-pal","authors":"david","tags":["MATE","devlog","solus"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Intro to Optimizing Packages on Solus","permalink":"/blog/solus-optimizing-packages"},"nextItem":{"title":"eopkg is dead, long live eopkg","permalink":"/blog/eopkg-is-dead-long-live-eopkg"}},"content":"Back in our [4.4 release post](https://getsol.us/2023/07/08/solus-4-4-released/) we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we\'re getting ready to ship the _Solus MATE Transition Tool_ to move existing users off of MATE.\\n\\n\x3c!-- truncate --\x3e\\n\\n## The problem\\n\\nMATE and XFCE are similar enough that eager Solusians can, and have, installed XCFE on their MATE machines with nothing more than a couple of `eopkg` commands. We\'re pretty sure our resident `bash` script enthusiast (ermo) could hammer out a working transition script in an evening. But we want a more polished experience. We know _you_ follow Solus news; after all, you\'re reading this. However, we assume there are users who dutifully update their systems, but have no interest in keeping up with our blog posts. How do we get their attention and prompt them to move away from MATE?\\n\\n## Introducing the Solus MATE Transition Tool\\n\\nWe\'re pleased to show off the _MATE Transition Tool_, which we plan to include in normal updates to MATE systems in the coming weeks. Most of the work on this tool was done by Joey; more on his efforts in the section below. Here\'s how MATE users will encounter the tool:\\n\\n:::note\\n\\nThese screenshots are current as of the publishing of this post, we may change things as we continue testing.\\n\\n:::\\n\\n1. Users will get a notification on every start-up informing them that they need to transition away from MATE.\\n\\n![Notification: Solus Transition Service](img/2024-01-29-dont-call-me-mate/notification.png)\\n\\n2. Clicking on that notification will launch the Solus MATE Transition Tool.\\n\\n![MATE Transition Tool Launch](img/2024-01-29-dont-call-me-mate/MTT-launch.png)\\n\\n3. Users select either Solus Budgie or Solus XFCE. The tool installs the selected edition, removes MATE, and prompts for a reboot\\n4. The tool removes itself after a successful transition.\\n\\nSimple. At least, that\'s what we want users to think.\\n\\n## How the Mate Transition Tool is actually part of our Python2 work\\n\\nThe story of the MATE Transition Tool is actually tied up in our fight to drag `eopkg` into the current decade. As I wrote previously, we\'re somewhat embarrassed by the amount of Solus tooling which _still_ relies on Python2. One such tool is the Solus Software Center `solus-sc`. A while back, the team decided the sane thing to do was to ditch `solus-sc` in favor of _KDE Discover_ and _GNOME Software_ . This would have the additional benefit of promoting flatpak applications to first-class citizens. The problem is _Discover_ and _Software_ have no way to talk to our package manager `eopkg`. We need an API. Luckily, other projects have encountered the same issue, leading to [`packagekit`](https://www.freedesktop.org/software/PackageKit/pk-intro.html).\\n\\nJoey has been doing the dirty work of bolting `packagekit` support onto `eopkg`, and saw an opportunity: If `eopkg` could be upgraded to understand some of `packagekit`, then he could write a special-purpose application to move users off MATE without asking them to run scary bash scripts (sorry ermo). We\'re rather pleased with this solution. MATE users get a simple transition and Solus gets closer to checking `solus-sc` off [the list.](https://github.com/getsolus/packages/issues/270)"},{"id":"eopkg-is-dead-long-live-eopkg","metadata":{"permalink":"/blog/eopkg-is-dead-long-live-eopkg","source":"@site/devlog/2024-01-19-eopkg-is-dead.md","title":"eopkg is dead, long live eopkg","description":"Close watchers of our packages repository may have noticed some strange looking items:","date":"2024-01-19T00:00:00.000Z","tags":[{"inline":true,"label":"eopkg","permalink":"/blog/tags/eopkg"},{"inline":true,"label":"devlog","permalink":"/blog/tags/devlog"},{"inline":true,"label":"moss","permalink":"/blog/tags/moss"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"}],"readingTime":1.645,"hasTruncateMarker":true,"authors":[{"name":"David Harder","title":"Solus Staff","page":{"permalink":"/blog/authors/david"},"socials":{"github":"https://github.com/davidjharder"},"imageURL":"https://avatars.githubusercontent.com/u/23007135?v=4","key":"david"}],"frontMatter":{"title":"eopkg is dead, long live eopkg","slug":"eopkg-is-dead-long-live-eopkg","authors":"david","tags":["eopkg","devlog","moss","solus"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Don\'t call me MATE, pal!","permalink":"/blog/don\'t-call-me-mate-pal"},"nextItem":{"title":"Welcome to the Solus Devlog","permalink":"/blog/welcome-solus-devlog-v1"}},"content":"Close watchers of our [packages repository](https://github.com/getsolus/packages) may have noticed some strange looking items:\\n\\n- [Initial inclusion of eopkg4-bin](https://github.com/getsolus/packages/pull/1305)\\n- [Testing the eopkg4-bin package](https://github.com/getsolus/packages/issues/1316) Warning: Minions GIF\\n\\nIt\'s a long story.\\n\\n\x3c!-- truncate --\x3e\\n\\nOur package manager `eopkg` is written in Python2. Python2 was originally planned to hit end-of-life all the way back in 2015! So Solus contributors past and present have wrestled with three thorny issues:\\n\\n- Do we really want to just port `eopkg` to python3? Surely we could build something newer and shinier.\\n- How exactly do we want to port `eopkg` to Python3? (We\'ll call this ported version `eopkg3` for short)\\n- How do we make sure `eopkg3` works even if something goes wrong with the Python3 libraries on someone\'s machine?\\n\\nHere\'s the plan to solve this: Ikey and friends over at Serpent OS are actively building a new package manager [_moss_](https://github.com/serpent-os/moss) that we are excited about. And they\'re building it with Solus in mind as an eventual user. This will be our fix for the first problem. In the meantime, we\'re taking a pragmatic approach to the last two issues so that (frankly) we can do more exciting things.\\n\\nSheepman, Livingsilver, and others completed a [direct Python3 port](https://github.com/getsolus/eopkg/commits/python3), which we never expect our users to actually run directly like a traditional Python program. Instead, that port will be compiled into a _binary_ using [nuitka](https://nuitka.net/doc/download.html). We\'re calling this compiled `eopkg3` binary `eopkg4-bin` for now. Critically, this binary will have _no dependencies_ other than `libc`. If we can successfully swap `eopkg` with `eopkg4-bin` on user\'s machines, then we\'ve solved the last issue: Python3 can be updated without worrying about also wrecking the package manager. Got it?\\n\\nBut what about Python2? Well, now that Evan and Joey have seen off a [successful ISO release](https://getsol.us/2024/01/08/solus-4-5-released/) with a `calamares` based installer, we can cross `os-installer` [off the list](https://github.com/getsolus/packages/issues/270). And `eopkg4-bin` will let us cross off a whole bunch more. The rest of that list is a story for another day."},{"id":"welcome-solus-devlog-v1","metadata":{"permalink":"/blog/welcome-solus-devlog-v1","source":"@site/devlog/2024-01-13-welcome-devlog.md","title":"Welcome to the Solus Devlog","description":"Welcome to the Solus Development Log.","date":"2024-01-13T00:00:00.000Z","tags":[{"inline":true,"label":"hello","permalink":"/blog/tags/hello"},{"inline":true,"label":"devlog","permalink":"/blog/tags/devlog"},{"inline":true,"label":"firstpost","permalink":"/blog/tags/firstpost"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"}],"readingTime":0.9,"hasTruncateMarker":true,"authors":[{"name":"Joey Riches","title":"Solus Staff","page":{"permalink":"/blog/authors/joey"},"socials":{"github":"https://github.com/joebonrichie"},"imageURL":"https://avatars.githubusercontent.com/u/5338090?s=400&u=f77ed45c7e83814ce3e8bd199fc293bd5b53682b&v=4","key":"joey"}],"frontMatter":{"title":"Welcome to the Solus Devlog","description":"Welcome to the Solus Development Log.","slug":"welcome-solus-devlog-v1","authors":"joey","tags":["hello","devlog","firstpost","solus"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"eopkg is dead, long live eopkg","permalink":"/blog/eopkg-is-dead-long-live-eopkg"}},"content":"Welcome to the Solus Development Log.\\n\\nThe Solus Development Log will be used by Solus Staff and outside contributors to highlight wins and changes in Solus. Keep an eye on this space.\\n\\n\x3c!-- truncate --\x3e\\n\\nThe Solus DevLog has been setup to facilitate improved communication with the outside world; wins, significant changes, as well as challenges, within Solus. Solus Staff and contributors are encouraged to use this space.\\n\\nThe DevLog has been setup as a separate entity to the [Solus Blog](https://getsol.us/blog/) to encourage more short form development content that doesn\'t require the same level of polish as an official blog post.\\n\\nIt is hoped that this will be used to help communicate what\'s going on in Solus such that our short-term and medium-term progress, goals, and ambitions are less of a black box to the outside world.\\n\\nAdditionally, we believe it will help provide context to any of our murmurings for any users who keep an eye on the [getsolus](https://github.com/getsolus/) GitHub organization page and the [Solus](https://matrix.to/#/#solus:matrix.org) Matrix channels.\\n\\nHope to see you back at this space soon with more content!"}]}}')}}]); \ No newline at end of file diff --git a/assets/js/f81c1134.ac31f1df.js b/assets/js/f81c1134.ac31f1df.js new file mode 100644 index 000000000..5a33afebb --- /dev/null +++ b/assets/js/f81c1134.ac31f1df.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[4031],{4108:e=>{e.exports=JSON.parse('{"archive":{"blogPosts":[{"id":"clean-clean-clean","metadata":{"permalink":"/blog/clean-clean-clean","source":"@site/devlog/2024-11-21-clean-cleanl-clean.md","title":"Clean, clean, clean!","description":"Hello everyone! Alfi here, member of Solus Cleanup Crew. It\'s been more than a year since I started contributing to Solus and I want to talk about it. About what I did, what we did, what we accomplished so far, and what we want to do next.","date":"2024-11-21T00:00:00.000Z","tags":[{"inline":true,"label":"housekeeping","permalink":"/blog/tags/housekeeping"},{"inline":true,"label":"cleanup","permalink":"/blog/tags/cleanup"},{"inline":true,"label":"devlog","permalink":"/blog/tags/devlog"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"}],"readingTime":5.585,"hasTruncateMarker":true,"authors":[{"name":"Muhammad Alfi Syahrin","title":"Solus Staff","page":{"permalink":"/blog/authors/alfi"},"socials":{"github":"https://github.com/malfisya"},"imageURL":"https://avatars.githubusercontent.com/u/101771435","key":"alfi"}],"frontMatter":{"title":"Clean, clean, clean!","slug":"clean-clean-clean","authors":"alfi","tags":["housekeeping","cleanup","devlog","solus"],"hide_table_of_contents":false},"unlisted":false,"nextItem":{"title":"Intro to Optimizing Packages on Solus","permalink":"/blog/solus-optimizing-packages"}},"content":"Hello everyone! Alfi here, member of Solus Cleanup Crew. It\'s been more than a year since I started contributing to Solus and I want to talk about it. About what I did, what we did, what we accomplished so far, and what we want to do next.\\n\\n\x3c!-- truncate --\x3e\\n\\n## A bit of background\\n\\nI started contributing in October 2023, when Solus participated in [Hacktoberfest](https://getsol.us/2023/10/01/solus-and-hacktoberfest-2023/). Hacktoberfest is a month-long event that encourage people to contribute to open source project in exchange for some digital merchandise. Finally, an excuse to contribute to something I use every day. Although, as an accountant, all of this is new experience to me. It was confusing at first, but I persisted. Finally, I got the hang of it and I managed to submit around 100 pull request during the month of the event. I was very excited and motivated. During the month, a few people joined the event and contributed to Solus, but then November came and most of the contribution slowed down. I was the only one left that continued doing the beginner tasks, mostly adding homepage to packages.\\n\\nAt the start of January 2024, Jakob Gezelius ([androidnisse](https://github.com/androidnisse)) comes in and starts contributing to homepage task too. Worried that we would stepped on each other\'s feet, we started a private chat to organize the tasks between ourselves. Until May, the two of us had been chipping away at the homepage task which at this point left 650 packages without a homepage. Then we had more contributors joining. I decided to make a group chat to accommodate all the people joining. It was called \\"Solus Homepage Team\\" at the time. More contributors and staff members joined the room, then it was renamed as \\"Solus Cleanup Crew\\" and moved under the official Solus matrix space.\\n\\n## What is it?\\n\\nSolus cleanup crew is a group of community contributors as as well staff members with the goal of bringing the Solus package repository up to current standard. It is a subset of the packaging room on our matrix channel. We organize the work on all the cleanup related tasks.\\n\\n## Why bother?\\n\\nSolus has been updating their tooling and infrastructure since its resurrection. While most of the tooling changes can be accomplished by staff members alone, there are things that they cannot do. While many consider Solus repository as small, it still contains more than 6000 packages. Some packages have never even gotten an update since Solus was first created! We want to get rid of all its cruft before we can migrate to a better tooling. That\'s where the community contributor can come in and help.\\n\\nFor me personally, it is a chance to learn something new and fill my time with more purpose. Sometimes, I feel like a slob scrolling through things, opening the same three apps over and over or sleeping midday. Technically speaking, doing packaging is still scrolling through things, still opening the same three apps over and over, and I still get my midday nap, but now it is with purpose. I love that what I do can be enjoyed by other people. It is mostly invisible and not even noticed by people, but the chance of it helping people gives me so much joy. Why bother? Because I love it.\\n\\n## What we accomplished\\n\\nWe create a few repository wide task that can done with little reading of our packaging guide. The keen-eyed of you may have already seen these tasks. It is always attached at the end of every Sync Updates since July. These are the tasks we did:\\n|No. | Task | Date Started | Start count | Current count|\\n|----|-------------| ------| ------------|--------------|\\n|1.| [Adding homepage key to package.yml](https://github.com/getsolus/packages/issues/411)|30-09-2023|2300|8\\n|2.| [Adding AppStream metainfo to all font packages](https://github.com/getsolus/packages/issues/449)|06-10-2023| 38 | Done \ud83c\udf89|\\n|3.| [Adding AppStream metainfo to all graphical applications](https://github.com/getsolus/packages/issues/1389)|22-01-2024|316|198|\\n|4.| [Applying new cargo macros](https://github.com/getsolus/packages/issues/3111)|27-06-2024|37| Done \ud83c\udf89|\\n|5.| [Changing all packages with homepages pointing to wiki.gnome.org](https://github.com/getsolus/packages/issues/4116)|20-10-2024|87|62|\\n|6.| [Adding monitoring.yml](https://github.com/getsolus/packages/issues/4121)|21-10-2024|3070|2937|\\n|7.| [Tagging packages that do not build](https://github.com/getsolus/packages/issues?q=is%3Aopen+is%3Aissue+label%3A%22Packaging+Problem%22)|Ongoing| N/A| 13\\n|8.| [Tagging packages that should be deprecated](https://github.com/getsolus/packages/issues?q=is%3Aopen+is%3Aissue+label%3A%22Package%3A+Removal+Request%22)|Ongoing| N/A| 25\\n\\nAs you can see from the table above, we just completed two tasks and we are close to completing homepage task. Packages that do not build also are also getting solved one by one. Right now, there are 12 people in Solus Cleanup Crew Matrix room, 6 of them are new contributors. We also create a new AppStream metainfo documentation, clean up our issue templates, implement a better tagging system for organizing issues and much more. Solus Cleanup Crew is also becoming a place where we can onboard new contributors and recruit new staff. I thought we accomplished a lot and I am happy with it.\\n\\n## What next?\\n\\nWe want to focus on adding appstream metainfo for remaining 200 packages, in line with the goal of 4.7 ISO. It will not be easy nor quick, but we will try our best. We want Solus users to have the best experience possible when we finally say goodbye to `solus-sc` and switch to modern software center (Gnome Software and KDE Discover). We want you to be able to install all graphical application from software center and have all the relevant information (Legible screenshot, Hi-Res Icon, good description, etc).\\n\\nWe also want to add more [monitoring.yml](https://help.getsol.us/docs/packaging/monitoring.yml) files to packages, so we can utilize our proof-of-concept [\\"Package Update Monitor\\"](https://shared.getsol.us/justin/updates/) created by [Justin Zobel](https://github.com/Justinzobel). I, myself and [Joey Riches](https://github.com/joebonrichie) will explore the possibility of curating our own \\"Editor\'s Choice\\" and \\"Featured Apps\\" in Gnome Software, made possible by [`gnome-app-list`](https://gitlab.gnome.org/GNOME/gnome-app-list). I think the road ahead is very exciting for us and hopefully for you too!\\n\\n## Want to help?\\n\\nWe are always eager for people to join and spend their time contributing to Solus. There are many ways you can [contribute](https://help.getsol.us/docs/user/contributing/getting-involved), but for me it is packaging. For me, packaging can be relaxing, sometimes frustrating, but always gives me joy at the end. If you are interested to dip your toe on packaging and want to help us, here are the simple steps:\\n\\n1. Join the Solus Packaging Room on Matrix\\n2. Read and practice our [packaging documentation](https://help.getsol.us/docs/packaging/)\\n3. Submit your first Pull Request. We recommend doing the wiki gnome task or monitoring task\\n4. Follow along the review process until your PR gets merged\\n5. Continue on contributing and you might get invited to Solus Cleanup Crew\\n\\n## Closing thoughts\\n\\nI want to thank all the contributors that made all of this possible. It was such a wonderful effort from everyone and we will strive to keep that up. Let me know if you are interested in a follow-up blog about the detail of doing packaging for Solus. _Terima kasih dan sampai jumpa_!"},{"id":"solus-optimizing-packages","metadata":{"permalink":"/blog/solus-optimizing-packages","source":"@site/devlog/2024-02-09-Intro-to-optimizing-packages-on-solus.md","title":"Intro to Optimizing Packages on Solus","description":"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle","date":"2024-02-09T00:00:00.000Z","tags":[{"inline":true,"label":"pgo","permalink":"/blog/tags/pgo"},{"inline":true,"label":"lto","permalink":"/blog/tags/lto"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"},{"inline":true,"label":"packaging","permalink":"/blog/tags/packaging"},{"inline":true,"label":"optimization","permalink":"/blog/tags/optimization"},{"inline":true,"label":"3","permalink":"/blog/tags/3"},{"inline":true,"label":"clang","permalink":"/blog/tags/clang"},{"inline":true,"label":"gnu","permalink":"/blog/tags/gnu"},{"inline":true,"label":"llvm","permalink":"/blog/tags/llvm"},{"inline":true,"label":"glibc","permalink":"/blog/tags/glibc"},{"inline":true,"label":"hwcaps","permalink":"/blog/tags/hwcaps"},{"inline":true,"label":"x86_64-v3","permalink":"/blog/tags/x-86-64-v-3"}],"readingTime":22.32,"hasTruncateMarker":true,"authors":[{"name":"Joey Riches","title":"Solus Staff","page":{"permalink":"/blog/authors/joey"},"socials":{"github":"https://github.com/joebonrichie"},"imageURL":"https://avatars.githubusercontent.com/u/5338090","key":"joey"}],"frontMatter":{"title":"Intro to Optimizing Packages on Solus","description":"Explore how to employ advanced compiler techniques such as PGO, BOLT & Glibc HWCaps to squeeze extra performance from packages using libwebp as a test vehicle","slug":"solus-optimizing-packages","authors":"joey","tags":["pgo","lto","solus","packaging","optimization","3","clang","gnu","llvm","glibc","hwcaps","x86_64-v3"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Clean, clean, clean!","permalink":"/blog/clean-clean-clean"},"nextItem":{"title":"Don\'t call me MATE, pal!","permalink":"/blog/don\'t-call-me-mate-pal"}},"content":"We\'ll explore how to build packages with advanced compiler techniques in order to squeeze more performance out of the box for packages in Solus. We\'ll be using the story of how `libwebp` was optimized for and how it led to an unexpected side quest.\\n\\n\x3c!-- truncate --\x3e\\n\x3c!-- cspell:disable-next-line --\x3e\\n\\n# Cual es la causa\\n\\nLinux distributions have a lot of control over how a source-based package gets compiled and shipped to users as part of a binary repository. Aggressive and advanced compiler optimization techniques, as well as other methods can be used to provide greater out of the box performance for end users. This can greatly benefit users running on older hardware to provide a snappier end-user experience; reducing time waiting on a heavy workload to finish; or even improved battery life; amongst other improvements.\\n\\nPart of the problem is, a packager\'s time is limited. So how, as a distribution, do you choose to try provide faster compatible packages for an end user. A historic approach is to simply change the default compiler flags for _all_ packages, such as enabling [LTO](https://en.wikipedia.org/wiki/Interprocedural_optimization) by default. Whilst this approach can work well, at Solus the philosophy is slightly different where a packager can trivially enable several advanced compiler optimization techniques such as [PGO](https://en.wikipedia.org/wiki/Profile-guided_optimization) without too much faffing around on a _targeted_ package.\\n\\nThe benefits of such an approach are:\\n\\n- Can target the performance of a specific package to benefit _all_ users\\n- A compiler optimization may improve one package, but may not apply globally to all packages.\\n\\nThe downsides are such:\\n\\n- Requires additional packager time to benchmark and experiment with different optimization strategies.\\n- Requires the packager to _choose_ and invest time into improving performance of a package.\\n- Requires the packager to find an appropriate benchmark to test the package against.\\n- Experimenting with compiler optimizations may not bear fruit: no meaningful improvement in performance, or there may be some other bottleneck.\\n\\n# Optimization Techniques Available\\n\\n- speed:\\n - As simple as it gets really, build a package with `-O3` instead of `-O2` as well as any other flags deemed worthy to be included as part of the `speed` flags. The main drawback of this is that `-O3` is not guaranteed to produce faster results than building with `-O2` and typically will produce bigger binaries. The days of `-O3` outright breaking your program in weird unexpected ways is largely behind us.\\n- LTO:\\n - Compared to some other distributions `-flto` is not yet enabled by default on Solus. LTO is almost guaranteed to provide a %1 or slightly larger performance improvement as well as a smaller binary at the cost of increased compiling times and memory usage during build. When combined with other optimization techniques such as PGO the LTO optimization can really stretch its legs and provide even greater uplift!\\n- Clang:\\n - Not strictly an optimization, but, building a package with `clang` instead of `gcc` and `ld.ldd` to link instead of the infamous `ld.bfd` may provide a faster package out of the box. You\'ll have to be careful of subtle ABI differences if building with `clang`. If in doubt, and, `clang` is the obvious choice, perform safety rebuilds on all reverse dependencies of the package.\\n- PGO:\\n - Profile guided optimization. Build once with instrumentation in order to collect profile data when ran. Run the program using a representative workload in order to collect profiling data. Build the program again with the profiling data provided in order to build an optimized variant.\\n- BOLT:\\n - Binary optimization and layout tool. You can think of this as \\"post-link PGO\\" where you instrument a binary with `bolt` to collect profiling data. Run that binary. Then finally reorganize the binary layout using the collected profile data. This generally works better on large statically linked binaries but smaller binaries or libraries such as found in a typical package can benefit too. This optimization is still quite new.\\n\\nRegardless, that\'s enough word spaghetti, let\'s look at the process to actually optimize a package.\\n\\n# Optimizing a Package\\n\\nRight, to begin with we\'ll have to start on choosing an actual package to benchmark and optimize. I\'ve heard the `.webp` file format is becoming increasingly common on the web, slowly replacing `.png` and `.jpg` file formats due to the strong backing of Google (for better or for worst). An improvement in decoding time for `.webp` files would benefit any user using a web browser casually browsing the web.\\n\\nLet\'s have a look at the `package.yml` build recipe for `libwebp`.\\n\\n\x3c!-- prettier-ignore --\x3e\\n```yaml\\nname : libwebp\\nversion : 1.3.2\\nrelease : 25\\nsource :\\n - https://github.com/webmproject/libwebp/archive/refs/tags/v1.3.2.tar.gz : c2c2f521fa468e3c5949ab698c2da410f5dce1c5e99f5ad9e70e0e8446b86505\\nhomepage : https://developers.google.com/speed/webp/\\nlicense : BSD-3-Clause\\ncomponent : multimedia.codecs\\nsummary : A new image format for the web\\ndescription: |\\n WebP is a new image format that provides lossless and lossy compression for images on the web. WebP lossless images are 26% smaller in size compared to PNGs. WebP lossy images are 25-34% smaller in size compared to JPEG images at equivalent SSIM index. WebP supports lossless transparency (also known as alpha channel) with just 22% additional bytes. Transparency is also supported with lossy compression and typically provides 3x smaller file sizes compared to PNG when lossy compression is acceptable for the red/green/blue color channels.\\nemul32 : yes\\npatterns :\\n - devel : /usr/share/man\\nbuilddeps :\\n - pkgconfig32(glu)\\n - pkgconfig32(glut)\\n - pkgconfig32(libpng)\\n - pkgconfig32(libtiff-4)\\n - pkgconfig32(libturbojpeg)\\n - pkgconfig32(zlib)\\n - giflib-devel\\nsetup : |\\n %reconfigure --disable-static --enable-everything\\nbuild : |\\n %make\\ninstall : |\\n %make_install\\n```\\n\\nOkay, looks to be a quite simple affair. A simple configure, make, make install as well as `emul32` being enabled specifying the -32bit packages are also provided from this recipe. Next step is to look for a repeatable and easy way to benchmark it. We\'ll begin by looking at the `pspec_x86_64.xml` file which lists all the files produced from the `package.yml` recipe as well as some metadata.\\n\\n```xml\\n libwebp\\n A new image format for the web\\n WebP is a new image format that provides lossless and lossy compression for images on the web. WebP lossless images are 26% smaller in size compared to PNGs. WebP lossy images are 25-34% smaller in size compared to JPEG images at equivalent SSIM index. WebP supports lossless transparency (also known as alpha channel) with just 22% additional bytes. Transparency is also supported with lossy compression and typically provides 3x smaller file sizes compared to PNG when lossy compression is acceptable for the red/green/blue color channels.\\n\\n multimedia.codecs\\n \\n /usr/bin/cwebp\\n /usr/bin/dwebp\\n /usr/bin/gif2webp\\n /usr/bin/img2webp\\n /usr/bin/vwebp\\n /usr/bin/webpinfo\\n /usr/bin/webpmux\\n```\\n\\nPerfect, we have `dwebp` and `cwebp` binaries available in the main package, which from a guess can be used to decode and encode `.webp` files. Let\'s try it out.\\n\\n```\\n$ dwebp -h\\nUsage: dwebp in_file [options] [-o out_file]\\n\\nDecodes the WebP image file to PNG format [Default].\\nNote: Animated WebP files are not supported.\\n$ cwebp -h\\nUsage:\\n\\n cwebp [options] -q quality input.png -o output.webp\\n```\\n\\nAwesome, these binaries do exactly what we need to benchmark `libwebp`, but, we are also indirectly testing `libpng` as well for this benchmark, we\'ll have to keep an eye out for that.\\n\\nOne extra step we have to do is ensure these binaries are actually linking against their own library, as upstream developers can have a habit of making sure their binaries don\'t link against their own libraries and end up being self-contained. Run `ldd` to verify.\\n\\n\x3c!-- spellchecker:disable --\x3e\\n\\n```\\n$ ldd /usr/bin/dwebp\\n\\tlinux-vdso.so.1 (0x00007ffed8733000)\\n\\tlibwebpdemux.so.2 => /usr/lib/libwebpdemux.so.2.0.14 (0x00007f7473bb4000)\\n\\tlibwebp.so.7 => /usr/lib/libwebp.so.7.1.8 (0x00007f7473ae2000)\\n\\tlibpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007f7473aa6000)\\n\\tlibc.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libc.so.6 (0x00007f74738a9000)\\n\\tlibsharpyuv.so.0 => /usr/lib/libsharpyuv.so.0.0.1 (0x00007f747389e000)\\n\\tlibm.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libm.so.6 (0x00007f74737b8000)\\n\\tlibz.so.1 => /usr/lib/libz.so.1.3.0 (0x00007f7473200000)\\n\\t/usr/lib64/ld-linux-x86-64.so.2 (0x00007f7473bea000)\\n```\\n\\n\x3c!-- spellchecker:enable --\x3e\\n\\nAwesome in this case both `dwebp` and `cwebp` link against `libwebp.so` so we can be confident that any performance improvements will be applicable to all packages in the repository linking against `libwebp`.\\n\\nLet\'s grab a couple of `.webp` files from [here](https://developers.google.com/speed/webp/gallery1) to test with. We\'ll just use the largest image size available in this case to reduce noise as much as possible when running benchmarks as well as allow any potential optimizations to stretch their legs a little more.\\n\\nNow having done the prep work, lets actually benchmark the damn thing using `hyperfine` for the time being.\\n\\n```\\n$ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03c3): 202.2 ms \xb1 0.3 ms [User: 198.9 ms, System: 3.0 ms]\\n Range (min \u2026 max): 201.8 ms \u2026 202.7 ms 14 runs\\n$ hyperfine \\"cwebp ~/PNG_Test.png -o /dev/null\\"\\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\\n Time (mean \xb1 \u03c3): 1.423 s \xb1 0.009 s [User: 1.346 s, System: 0.076 s]\\n Range (min \u2026 max): 1.410 s \u2026 1.435 s 10 runs\\n```\\n\\nThere, we have our a basic baseline for encode and decode performance. We mostly care about decode performance here but improved encoding performance would also not go amiss.\\n\\n## Let\'s Start Obvious\\n\\nLet\'s start basic, enabling the `speed` optimization which basically builds with `-O3` instead of `-O2` as well as any other flags that are deemed to be worthy to be part of the `speed` group. As well as, the `lto` optimization which builds with link time optimization allowing for inter-procedural optimizations to take place.\\n\\n\x3c!-- prettier-ignore --\x3e\\n```yaml\\noptimize:\\n - speed\\n - lto\\n```\\n\\nMoment of truth...\\n\\n```\\n$ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03c3): 200.0 ms \xb1 1.5 ms [User: 197.3 ms, System: 2.5 ms]\\n Range (min \u2026 max): 198.1 ms \u2026 203.2 ms 15 runs\\n$ hyperfine \\"cwebp ~/PNG_Test.png -o /dev/null\\"\\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\\n Time (mean \xb1 \u03c3): 1.353 s \xb1 0.012 s [User: 1.281 s, System: 0.071 s]\\n Range (min \u2026 max): 1.336 s \u2026 1.369 s 10 runs\\n```\\n\\nWell okay, we got a very minor uplift in decoding performance and a slightly higher improvement in encoding performance, but nothing too much to write home about. Luckily we have several more optimizations to explore...\\n\\n## PGO is great, except, when it isn\'t.\\n\\nNext step is to explore PGO (Profile Guided Optimization). For our `libwebp` package, looks like we already hit a bit of a snafu. There\'s no test suite included in the tarball! That\'s a bit of a disappointment as a test suite such as `make check` is by far and away the easiest and most comprehensive workload that can be used for profiling as part of PGO, especially for smaller libraries. However, we can still experiment with the just built `dwebp` and `cwebp` binaries as a suitable workload for PGO.\\n\\nLuckily, as part of the package.yml format all you have to do is provide a profile for automatic PGO. After chrooting into the build environment and fiddling around a bit we end up with:\\n\\n\x3c!-- prettier-ignore --\x3e\\n```yaml\\nprofile : |\\n ./examples/dwebp webp_js/test_webp_js.webp -o test_png.png\\n ./examples/cwebp test_png.png -o /dev/null\\n```\\n\\nAfter specifying that, 6 builds will now be performed instead of 2:\\n\\n- emul32:\\n - Instrumented build\\n - Run profiling workload\\n - Optimized build using profiling data\\n- x86_64:\\n - Instrumented build\\n - Run profiling workload\\n - Optimized build using profiling data\\n\\nFor this relatively small package it increases the build time from 1m1.672s to 1m42.199s\\n\\nThe next moment of truth...\\n\\n```\\n$ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03c3): 204.1 ms \xb1 2.2 ms [User: 201.3 ms, System: 2.7 ms]\\n Range (min \u2026 max): 201.6 ms \u2026 207.1 ms 14 runs\\n$ hyperfine \\"cwebp ~/PNG_Test.png -o /dev/null\\"\\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\\n Time (mean \xb1 \u03c3): 1.349 s \xb1 0.010 s [User: 1.266 s, System: 0.082 s]\\n Range (min \u2026 max): 1.335 s \u2026 1.374 s 10 runs\\n```\\n\\nWell... That\'s interesting. We actually regress in performance for decode performance whilst gaining another small bump in encoding performance. Worse still, we get a bunch of `profile count data file not found [-Wmissing-profile]` warning messages during the optimized build indicating to us our profiling workload isn\'t comprehensive enough and doesn\'t cover enough code paths. The lack of a handy `make check` that could be used as a profiling workload is really hurting us here. For now, let\'s put a pin in exploring PGO, it isn\'t a dead end but more work needs to be done curating a more comprehensive workload to chuck at it in this particular case, whilst other, easier, optimization techniques are still available to us.\\n\\n\x3c!-- cspell:disable-next-line --\x3e\\n\\n## 256 Vector Units go brrrrrr...\\n\\nThe next obvious step is to explore `glibc` hardware capabilities. For those unaware both `clang` and `gnu` compilers provide `x86_64-v2`, `x86_64-v3` and `x86_64-v4` micro-architecture build options on top of the baseline of `x86_64`. These enable the use of targeting additional CPU instruction sets during compilation for better performance. For example, `-sse4.2` for `x86_64-v2`, `-avx2` for `x86_64-v3`, and `-avx512` for `x86_64-v4`.\\n\\nWhilst that\'s great \'n all, if a program is built with `x86_64-v3` and gains an additional ~10% uplift in performance, it\'s no good if a `x86_64-v2` compatible cpu can\'t run it. Luckily the `glibc` loader that\'s found on almost general purpose linux installs provides a way to load higher or lower micro-architecture libraries if they\'re installed and supported.\\n\\nOn top of all that, the `package.yml` format provides an incredibly simple way of providing `x86_64-v3` built libraries by enabling the `avx2 : yes` flag.\\n\\nWith `avx2 : yes` enabled in the `libwebp` package three builds are performed.\\n\\n- emul32\\n- x86_64-v3\\n- x86_64\\n\\nWe now see these additional files in the `pspec_x86_64.xml` file\\n\\n```diff\\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0\\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0.0.1\\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebp.so.7\\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8\\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdecoder.so.3\\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdecoder.so.3.1.8\\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2\\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2.0.14\\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpmux.so.3\\n+ /usr/lib64/glibc-hwcaps/x86-64-v3/libwebpmux.so.3.0.13\\n```\\n\\nLet\'s rerun `lld` on `dwebp` after installing the new package and...\\n\\n\x3c!-- spellchecker:disable --\x3e\\n\\n```\\n$ ldd /usr/bin/dwebp\\n\\tlinux-vdso.so.1 (0x00007ffeab5b1000)\\n\\tlibwebpdemux.so.2 => /usr/lib/glibc-hwcaps/x86-64-v3/libwebpdemux.so.2.0.14 (0x00007f9a351d5000)\\n\\tlibwebp.so.7 => /usr/lib/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8 (0x00007f9a3510b000)\\n\\tlibpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007f9a350cf000)\\n\\tlibc.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libc.so.6 (0x00007f9a34ed2000)\\n\\tlibsharpyuv.so.0 => /usr/lib/glibc-hwcaps/x86-64-v3/libsharpyuv.so.0.0.1 (0x00007f9a34ec1000)\\n\\tlibm.so.6 => /usr/lib/glibc-hwcaps/x86-64-v3/libm.so.6 (0x00007f9a34ddb000)\\n\\tlibz.so.1 => /usr/lib/glibc-hwcaps/x86-64-v3/libz.so.1.3 (0x00007f9a34dbb000)\\n\\t/usr/lib64/ld-linux-x86-64.so.2 (0x00007f9a3520b000)\\n```\\n\\n\x3c!-- spellchecker:enable --\x3e\\n\\nWe can crucially see that `dwebp` is now loading the `x86-64-v3` built `libwebp.so` lib from `/usr/lib/glibc-hwcaps/x86-64-v3/libwebp.so.7.1.8`, success! Let\'s what our performance looks like.\\n\\n```\\n$ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03c3): 198.2 ms \xb1 1.2 ms [User: 195.4 ms, System: 2.5 ms]\\n Range (min \u2026 max): 197.0 ms \u2026 200.5 ms 14 runs\\n$ hyperfine \\"cwebp ~/PNG_Test.png -o /dev/null\\"\\nBenchmark 1: cwebp ~/PNG_Test.png -o /dev/null\\n Time (mean \xb1 \u03c3): 1.313 s \xb1 0.009 s [User: 1.243 s, System: 0.078 s]\\n Range (min \u2026 max): 1.308 s \u2026 1.341 s 10 runs\\n```\\n\\nLet\'s recap so far:\\n\\n| Optimization | Decode | Encode | Size |\\n| ----------------------- | ------------------ | ------- | ------- |\\n| Baseline | 202.2 ms | 1.399 s | 1.33 MB |\\n| Speed + LTO | 200.0 ms | 1.353 s | 1.73 MB |\\n| Speed + LTO + PGO | 204.1 ms :warning: | 1.349 s | 1.07 MB |\\n| Speed + LTO + x86_64-v3 | 198.2 ms | 1.313 s | 3.17 MB |\\n\\nWhilst we\'re still getting an additional speedup it isn\'t really anything to write home about. A measly ~2% improvement in decoding performance and a fairly respectable ~7% improvement in encoding performance for our test case. However, increasing the package size by an extra ~2MiB from providing a bunch of extra libs in `/usr/lib/glibc-hwcaps/x86-64-v3/` just ain\'t worth it. This hints that either the compiler optimizations aren\'t really effective here or we\'re being bottle-necked by something else.\\n\\nSo far, we\'ve been benchmarking fairly simply using `hyperfine`, let\'s swap that out for `perf` so we can get a callgraph.\\n\\n## Something about `perf` to the rescue\\n\\n`perf record -o dwebp.data -- dwebp ~/3.webp -o /dev/null`\\n\\n`perf record -o cwebp.data -- cwebp ~/PNG_Test.png -o /dev/null`\\n\\nLet\'s look at `dwebp` first with `perf report -i dwebp.data`.\\n\\n![Perf report dwebp](img/2024-02-09-intro-to-optimizing/perf_report_dwebp_png.webp)\\n\\nWell god damn, literally all of our time is being spent in `libz.so` it\'s no wonder our compiler optimizations were hardly improving performance.\\n\\nLet\'s also look at the `cwebp` report, we\'ve generally been getting better results from it.\\n\\n![Perf report cwebp](img/2024-02-09-intro-to-optimizing/perf_report_cwebp_png.webp)\\n\\nOkay, much more of our time is being spent in `libwebp.so` itself here which helps to explain why we were seeing a better performance uplift. Still 5.68% of our time is being spent in `libz`.\\n\\n## Choosing Wisely\\n\\nYou may remember early on, when I said we are also indirectly testing `libpng`. Well... after some more digging, that\'s exactly what\'s happening here. Re-running the `dwebp` binary it says this\\n\\n> Decodes the WebP image file to PNG format\\n\\nTurns out, it\'s more accurate to say we are _directly_ testing `libpng` and by extension `zlib`. It isn\'t `libwebp` that\'s spending all of its time in `libz.so`, it\'s `libpng`! This is exactly the reason you have to be careful about the benchmarks chosen and, ensure you understand what they\'re doing.\\n\\nHowever, the good news about this little snafu is:\\n\\n1. `dwebp` can be used to translate to another image format such as `.yuv` that\'ll more accurately remove the bottleneck from `libz.so`.\\n2. We now know that `libpng` has a huge bottleneck in `libz.so` and speeding up `zlib` _should_ dramatically speed up `libpng` performance.\\n\\n## Adjusting the Benchmark\\n\\nAfter reverting the `libwebp` package to the baseline let\'s use our adjusted decoding benchmark.\\n\\nWe\'ll now use `dwebp ~/3.webp -yuv -o /dev/null` for a decoding test, let\'s run that with `perf` to ensure we\'re exclusively testing `libwebp.so` here.\\n\\n![Perf report dwebp to yuv](img/2024-02-09-intro-to-optimizing/perf_report_dwebp_yuv.webp)\\n\\nOkay that\'s awesome, no `libpng.so` or `libz.so` to mess with our tests!\\n\\nLet\'s reapply our optimizations, keeping those which apply an uplift\\n\\n| Optimization | Decode | Size |\\n| ----------------------- | ----------------- | ------- |\\n| Baseline | 14.7 ms | 1.33 MB |\\n| Speed | 14.5 ms | 1.56 MB |\\n| LTO | 14.6 ms | 1.40 MB |\\n| PGO | 18.0 ms :warning: | 1.07 MB |\\n| x86-64-v3 | 12.7 ms | 2.35 MB |\\n| Speed + LTO + x86-64-v3 | 12.3 ms | 3.17 MB |\\n\\nOkay, this is great, whilst we aren\'t getting much from speed or LTO, we are getting a big uplift from x86-64-v3 libraries and when combined with the other optimizations we\'re getting an uplift in performance of around ~16% at the cost of close to thrice the installed package size.\\n\\n### Partial Profiling\\n\\nOnce again we see that PGO regresses performance hard, however, that smaller size is giving a good hint! We already know that the profiling workload we gave it isn\'t very comprehensive due to the bunch of `-Wmissing-profile` warnings we get during the optimized build. By default, PGO will aggressively inline and apply additional optimizations to code that\'s part of the profiling workload while everything else will be optimized for size. The idea being, hot-path code is fast and code that doesn\'t matter is small. However, what happens when you can\'t craft a comprehensive workload, as seems to be the case here? Luckily GCC has a flag for exactly that `-fprofile-partial-training`. GCC docs state that:\\n\\n> In some cases it is not practical to train all possible hot paths in the program. (For example, program may contain functions specific for a given hardware and training may not cover all hardware configurations program is run on.) With -fprofile-partial-training profile feedback will be ignored for all functions not executed during the train run leading them to be optimized as if they were compiled without profile feedback. This leads to better performance when train run is not representative but also leads to significantly bigger code.\\n\\nOkay, let\'s try it out, all we need to do is specify in our `package.yml` recipe.\\n\\n\x3c!-- prettier-ignore --\x3e\\n```yaml\\nenvironment: |\\n if [[ -n ${PGO_USE_BUILD} ]]; then\\n export CFLAGS=\\"${CFLAGS} -fprofile-partial-training\\"\\n export CXXFLAGS=\\"${CXXFLAGS} -fprofile-partial-training\\"\\n fi\\n```\\n\\nAnd the results:\\n\\n| Optimization | Decode | Size |\\n| ------------------------------------- | ------- | ------- |\\n| Speed + LTO + x86-64-v3 | 12.3 ms | 3.17 MB |\\n| Speed + LTO + x86-64-v3 + Partial PGO | 12.5 ms | 3.13 MB |\\n\\nWell, it was worth a try. This highlights how useless PGO can be when you don\'t or can\'t provide it a good workload. Interestingly, we don\'t get the size bloat that was promised, in fact, the opposite.\\n\\n# Final libwebp Results\\n\\n| Benchmark | Time Before | Time After | Size Before | Size After |\\n| ----------------------------------- | ----------- | ---------- | ----------- | ---------- |\\n| \\"dwebp ~/3.webp -yuv -o /dev/null\\" | 14.5 ms | 12.3 ms | 1.33 MB | 3.17 MB |\\n| \\"cwebp ~/PNG_Test.png -o /dev/null\\" | 1.399 s | 1.313 s | -- | -- |\\n\\nIn the end, we get a very healthy ~16% improvement in decoding from a .webp to .yuv file. As well as a respectable 6% improvement in encoding from a .png to .webp file. However, the increased package size is very unfortunate. It\'s possible to tweak the x86-64-v3 build and only ship the libs that actually improve performance in order to get the installed size back to an acceptable level.\\n\\n# \\"Next-Generation\\" Side Quest\\n\\nNow, you probably remember earlier due to our unrepresentative benchmark we found out that `libpng` is getting highly bottlenecked by `libz.so`. This now seems like a perfect opportunity to take a look at zlib and circle-back to our original benchmark that we were using.\\n\\nZlib is widely employed throughout the ecosystem and, as such you\'d think it would be highly-optimized for performance. However, that isn\'t really the case. Zlib is written in an old-fashioned way of C and tries to be _extremely_ portable; supporting dozens of systems that have fallen out of common use. As such, it\'s hard to apply architecture specific optimizations that wouldn\'t break some old system or without introducing code spaghetti. There have been a couple of attempts to merge AArch64 and x86_64 optimizations into the canonical zlib library without success.\\n\\nHowever, there is some light in this tunnel as various forks of zlib having been popping up, applying new optimizations on top of zlib. The most promising of these looks be to [zlib-ng](https://github.com/zlib-ng/zlib-ng/). When built in compatible mode, it promises to be API compatible with canonical zlib and _tries_ to be as ABI compatible as possible.\\n\\nLet\'s just go for it, replacing Solus\' `zlib` package with zlib-ng built in compatible mode. It\'s a bit scary due to how integral zlib is in a typical Linux install, but, how hard could it be?\\n\\n\x3c!-- cspell:disable-next-line --\x3e\\n\\n## I Zee a Purty lil\' Package\\n\\nWell that was simple. Here\'s what our zlib-ng `package.yml` recipe looks like.\\n\\n\x3c!-- spellchecker:disable --\x3e\\n\x3c!-- prettier-ignore --\x3e\\n```yaml\\nname : zlib\\nversion : 2.1.5\\nrelease : 28\\nsource :\\n - https://github.com/zlib-ng/zlib-ng/archive/refs/tags/2.1.5.tar.gz : 3f6576971397b379d4205ae5451ff5a68edf6c103b2f03c4188ed7075fbb5f04\\nhomepage : https://github.com/zlib-ng/zlib-ng\\nlicense : ZLIB\\ncomponent : system.base\\nsummary : zlib replacement with optimizations for next generation systems.\\ndescription:\\n - A zlib data compression library for the next generation systems. ABI/API compatible mode.\\ndevel : yes\\nemul32 : yes\\nsetup : |\\n %cmake_ninja \\\\\\n -DZLIB_COMPAT=ON \\\\\\n -DWITH_GTEST=OFF \\\\\\n -DBUILD_SHARED_LIBS=ON \\\\\\n -DINSTALL_LIB_DIR=%libdir%\\nbuild : |\\n %ninja_build\\ninstall : |\\n %ninja_install\\ncheck : |\\n %ninja_check\\n```\\n\\n\x3c!-- spellchecker:enable --\x3e\\n\\nAfter building it, all the files seem to be in the right place and the test suite is passing. Let\'s just install it overwriting our canonical `zlib` package and hope our system doesn\'t die... I think the word is YOLO.\\n\\n```\\n$ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03c3): 198.6 ms \xb1 2.3 ms [User: 194.3 ms, System: 3.6 ms]\\n Range (min \u2026 max): 196.3 ms \u2026 203.3 ms 14 runs\\n$ sudo eopkg it zlib-2.1.5-28-1-x86_64.eopkg\\n...\\n$ $ hyperfine \\"dwebp ~/3.webp -o /dev/null\\"\\nBenchmark 1: dwebp ~/3.webp -o /dev/null\\n Time (mean \xb1 \u03c3): 87.6 ms \xb1 0.7 ms [User: 84.7 ms, System: 2.6 ms]\\n Range (min \u2026 max): 86.5 ms \u2026 88.7 ms 33 runs\\n```\\n\\nWell, hot diggity damn. Swapping out the zlib package for a more performant variant has instantly more than halved(!!) our decoding time.\\n\\nWe need to find a more contained `libpng` benchmark here that removes the `libwebp` stuff to really confirm the findings here. After some sleuthing the `libpng` source repository has a [pngtopng.c](https://github.com/glennrp/libpng/blob/libpng16/contrib/examples/pngtopng.c) file we can compile to use the system libpng library.\\n\\nChanging the header from `#include \\"../../png.h\\"` to `#include ` then running `gcc -Ofast pngtopng.c -lpng16 -o pngtopng` to compile it, we have a libpng benchmark. We can reuse our test .png file from earlier. Ending up with: `./pngtopng ~/PNG_Test.png /dev/null` for our benchmark.\\n\\n| Library | Time |\\n| ---------------- | -------- |\\n| zlib (canonical) | 1.464 s |\\n| zlib-ng (compat) | 896.6 ms |\\n\\nWell. This is pretty much inline with our flawed `dwebp` benchmark from earlier. Swapping out zlib almost halves `libpng` decoding time.\\n\\n## Squeezing more from zlib-ng\\n\\nHowever, we\'re not done yet. We still have our compiler optimizations available to us to squeeze more performance from `zlib-ng`.\\n\\n| Optimization | Decode | Size |\\n| ----------------------------- | -------- | --------- |\\n| Baseline | 896.6 ms | 141.00 KB |\\n| Speed | 883.6 ms | 182.00 KB |\\n| LTO | 892.7 ms | 133.00 KB |\\n| PGO | 894.6 ms | 141.00 KB |\\n| x86-64-v3 | 892.5 ms | 295.00 KB |\\n| Speed + LTO | 882.6 ms | 170.00 KB |\\n| Speed + LTO + PGO + x86-64-v3 | 882.5 ms | 250.00 KB |\\n\\nIt looks like in this case the simple speed + LTO optimizations is the way to go. Speed gives the majority of the speedup but LTO helps bring back down the package size again. However, it\'s only a 1.5% improvement from baseline for this benchmark. We can always re-benchmark it later, testing zlib performance more directly instead of via libpng. It shows how good a job the zlib-ng developers have done that it\'s so performant right out of the gate.\\n\\n# Final Words\\n\\nWe\'ve shown the process of how a package can be optimized in Solus, through the failings and wins here I hope some good tips and tricks were provided in avoiding common pitfalls. Additional benchmarking strategies such as BOLT or Polly optimizations were not discussed and it\'ll be good material for a future blog post.\\n\\nSome other important things such as tweaking the system for benchmarking in order to get representative and consistent results were also not discussed. This is especially important in power budget constrained systems such as laptops and worth bearing in mind.\\n\\nRegardless, I hope the story of how `libwebp` was optimized for was entertaining and some things were learnt for anyone looking to optimize packages in Solus for the future."},{"id":"don\'t-call-me-mate-pal","metadata":{"permalink":"/blog/don\'t-call-me-mate-pal","source":"@site/devlog/2024-01-29-dont-call-me-mate.md","title":"Don\'t call me MATE, pal!","description":"Back in our 4.4 release post we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we\'re getting ready to ship the Solus MATE Transition Tool to move existing users off of MATE.","date":"2024-01-29T00:00:00.000Z","tags":[{"inline":true,"label":"MATE","permalink":"/blog/tags/mate"},{"inline":true,"label":"devlog","permalink":"/blog/tags/devlog"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"}],"readingTime":2.645,"hasTruncateMarker":true,"authors":[{"name":"David Harder","title":"Solus Staff","page":{"permalink":"/blog/authors/david"},"socials":{"github":"https://github.com/davidjharder"},"imageURL":"https://avatars.githubusercontent.com/u/23007135","key":"david"}],"frontMatter":{"title":"Don\'t call me MATE, pal!","slug":"don\'t-call-me-mate-pal","authors":"david","tags":["MATE","devlog","solus"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Intro to Optimizing Packages on Solus","permalink":"/blog/solus-optimizing-packages"},"nextItem":{"title":"eopkg is dead, long live eopkg","permalink":"/blog/eopkg-is-dead-long-live-eopkg"}},"content":"Back in our [4.4 release post](https://getsol.us/2023/07/08/solus-4-4-released/) we announced that Solus would stop shipping a MATE ISO, mostly because MATE showed no signs of moving away from X11 and towards wayland. At the beginning of this year, we shipped our new XFCE ISO as a beta. And now we\'re getting ready to ship the _Solus MATE Transition Tool_ to move existing users off of MATE.\\n\\n\x3c!-- truncate --\x3e\\n\\n## The problem\\n\\nMATE and XFCE are similar enough that eager Solusians can, and have, installed XCFE on their MATE machines with nothing more than a couple of `eopkg` commands. We\'re pretty sure our resident `bash` script enthusiast (ermo) could hammer out a working transition script in an evening. But we want a more polished experience. We know _you_ follow Solus news; after all, you\'re reading this. However, we assume there are users who dutifully update their systems, but have no interest in keeping up with our blog posts. How do we get their attention and prompt them to move away from MATE?\\n\\n## Introducing the Solus MATE Transition Tool\\n\\nWe\'re pleased to show off the _MATE Transition Tool_, which we plan to include in normal updates to MATE systems in the coming weeks. Most of the work on this tool was done by Joey; more on his efforts in the section below. Here\'s how MATE users will encounter the tool:\\n\\n:::note\\n\\nThese screenshots are current as of the publishing of this post, we may change things as we continue testing.\\n\\n:::\\n\\n1. Users will get a notification on every start-up informing them that they need to transition away from MATE.\\n\\n![Notification: Solus Transition Service](img/2024-01-29-dont-call-me-mate/notification.png)\\n\\n2. Clicking on that notification will launch the Solus MATE Transition Tool.\\n\\n![MATE Transition Tool Launch](img/2024-01-29-dont-call-me-mate/MTT-launch.png)\\n\\n3. Users select either Solus Budgie or Solus XFCE. The tool installs the selected edition, removes MATE, and prompts for a reboot\\n4. The tool removes itself after a successful transition.\\n\\nSimple. At least, that\'s what we want users to think.\\n\\n## How the Mate Transition Tool is actually part of our Python2 work\\n\\nThe story of the MATE Transition Tool is actually tied up in our fight to drag `eopkg` into the current decade. As I wrote previously, we\'re somewhat embarrassed by the amount of Solus tooling which _still_ relies on Python2. One such tool is the Solus Software Center `solus-sc`. A while back, the team decided the sane thing to do was to ditch `solus-sc` in favor of _KDE Discover_ and _GNOME Software_ . This would have the additional benefit of promoting flatpak applications to first-class citizens. The problem is _Discover_ and _Software_ have no way to talk to our package manager `eopkg`. We need an API. Luckily, other projects have encountered the same issue, leading to [`packagekit`](https://www.freedesktop.org/software/PackageKit/pk-intro.html).\\n\\nJoey has been doing the dirty work of bolting `packagekit` support onto `eopkg`, and saw an opportunity: If `eopkg` could be upgraded to understand some of `packagekit`, then he could write a special-purpose application to move users off MATE without asking them to run scary bash scripts (sorry ermo). We\'re rather pleased with this solution. MATE users get a simple transition and Solus gets closer to checking `solus-sc` off [the list.](https://github.com/getsolus/packages/issues/270)"},{"id":"eopkg-is-dead-long-live-eopkg","metadata":{"permalink":"/blog/eopkg-is-dead-long-live-eopkg","source":"@site/devlog/2024-01-19-eopkg-is-dead.md","title":"eopkg is dead, long live eopkg","description":"Close watchers of our packages repository may have noticed some strange looking items:","date":"2024-01-19T00:00:00.000Z","tags":[{"inline":true,"label":"eopkg","permalink":"/blog/tags/eopkg"},{"inline":true,"label":"devlog","permalink":"/blog/tags/devlog"},{"inline":true,"label":"moss","permalink":"/blog/tags/moss"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"}],"readingTime":1.645,"hasTruncateMarker":true,"authors":[{"name":"David Harder","title":"Solus Staff","page":{"permalink":"/blog/authors/david"},"socials":{"github":"https://github.com/davidjharder"},"imageURL":"https://avatars.githubusercontent.com/u/23007135","key":"david"}],"frontMatter":{"title":"eopkg is dead, long live eopkg","slug":"eopkg-is-dead-long-live-eopkg","authors":"david","tags":["eopkg","devlog","moss","solus"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"Don\'t call me MATE, pal!","permalink":"/blog/don\'t-call-me-mate-pal"},"nextItem":{"title":"Welcome to the Solus Devlog","permalink":"/blog/welcome-solus-devlog-v1"}},"content":"Close watchers of our [packages repository](https://github.com/getsolus/packages) may have noticed some strange looking items:\\n\\n- [Initial inclusion of eopkg4-bin](https://github.com/getsolus/packages/pull/1305)\\n- [Testing the eopkg4-bin package](https://github.com/getsolus/packages/issues/1316) Warning: Minions GIF\\n\\nIt\'s a long story.\\n\\n\x3c!-- truncate --\x3e\\n\\nOur package manager `eopkg` is written in Python2. Python2 was originally planned to hit end-of-life all the way back in 2015! So Solus contributors past and present have wrestled with three thorny issues:\\n\\n- Do we really want to just port `eopkg` to python3? Surely we could build something newer and shinier.\\n- How exactly do we want to port `eopkg` to Python3? (We\'ll call this ported version `eopkg3` for short)\\n- How do we make sure `eopkg3` works even if something goes wrong with the Python3 libraries on someone\'s machine?\\n\\nHere\'s the plan to solve this: Ikey and friends over at Serpent OS are actively building a new package manager [_moss_](https://github.com/serpent-os/moss) that we are excited about. And they\'re building it with Solus in mind as an eventual user. This will be our fix for the first problem. In the meantime, we\'re taking a pragmatic approach to the last two issues so that (frankly) we can do more exciting things.\\n\\nSheepman, Livingsilver, and others completed a [direct Python3 port](https://github.com/getsolus/eopkg/commits/python3), which we never expect our users to actually run directly like a traditional Python program. Instead, that port will be compiled into a _binary_ using [nuitka](https://nuitka.net/doc/download.html). We\'re calling this compiled `eopkg3` binary `eopkg4-bin` for now. Critically, this binary will have _no dependencies_ other than `libc`. If we can successfully swap `eopkg` with `eopkg4-bin` on user\'s machines, then we\'ve solved the last issue: Python3 can be updated without worrying about also wrecking the package manager. Got it?\\n\\nBut what about Python2? Well, now that Evan and Joey have seen off a [successful ISO release](https://getsol.us/2024/01/08/solus-4-5-released/) with a `calamares` based installer, we can cross `os-installer` [off the list](https://github.com/getsolus/packages/issues/270). And `eopkg4-bin` will let us cross off a whole bunch more. The rest of that list is a story for another day."},{"id":"welcome-solus-devlog-v1","metadata":{"permalink":"/blog/welcome-solus-devlog-v1","source":"@site/devlog/2024-01-13-welcome-devlog.md","title":"Welcome to the Solus Devlog","description":"Welcome to the Solus Development Log.","date":"2024-01-13T00:00:00.000Z","tags":[{"inline":true,"label":"hello","permalink":"/blog/tags/hello"},{"inline":true,"label":"devlog","permalink":"/blog/tags/devlog"},{"inline":true,"label":"firstpost","permalink":"/blog/tags/firstpost"},{"inline":true,"label":"solus","permalink":"/blog/tags/solus"}],"readingTime":0.9,"hasTruncateMarker":true,"authors":[{"name":"Joey Riches","title":"Solus Staff","page":{"permalink":"/blog/authors/joey"},"socials":{"github":"https://github.com/joebonrichie"},"imageURL":"https://avatars.githubusercontent.com/u/5338090","key":"joey"}],"frontMatter":{"title":"Welcome to the Solus Devlog","description":"Welcome to the Solus Development Log.","slug":"welcome-solus-devlog-v1","authors":"joey","tags":["hello","devlog","firstpost","solus"],"hide_table_of_contents":false},"unlisted":false,"prevItem":{"title":"eopkg is dead, long live eopkg","permalink":"/blog/eopkg-is-dead-long-live-eopkg"}},"content":"Welcome to the Solus Development Log.\\n\\nThe Solus Development Log will be used by Solus Staff and outside contributors to highlight wins and changes in Solus. Keep an eye on this space.\\n\\n\x3c!-- truncate --\x3e\\n\\nThe Solus DevLog has been setup to facilitate improved communication with the outside world; wins, significant changes, as well as challenges, within Solus. Solus Staff and contributors are encouraged to use this space.\\n\\nThe DevLog has been setup as a separate entity to the [Solus Blog](https://getsol.us/blog/) to encourage more short form development content that doesn\'t require the same level of polish as an official blog post.\\n\\nIt is hoped that this will be used to help communicate what\'s going on in Solus such that our short-term and medium-term progress, goals, and ambitions are less of a black box to the outside world.\\n\\nAdditionally, we believe it will help provide context to any of our murmurings for any users who keep an eye on the [getsolus](https://github.com/getsolus/) GitHub organization page and the [Solus](https://matrix.to/#/#solus:matrix.org) Matrix channels.\\n\\nHope to see you back at this space soon with more content!"}]}}')}}]); \ No newline at end of file diff --git a/assets/js/f8dd8223.db925b05.js b/assets/js/f8dd8223.0f285722.js similarity index 98% rename from assets/js/f8dd8223.db925b05.js rename to assets/js/f8dd8223.0f285722.js index 30e49af0e..6fd81c24d 100644 --- a/assets/js/f8dd8223.db925b05.js +++ b/assets/js/f8dd8223.0f285722.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7212],{4606:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=t(85893),r=t(11151);const a={title:"PostgreSQL",summary:"A quick guide to using Postgres on Solus"},o="PostgreSQL server",l={id:"user/software/development/postgresql",title:"PostgreSQL",description:"PostgreSQL is an open source object-relational database system. The postgresql package in Solus includes the PostgreSQL library, client and server.",source:"@site/docs/user/software/development/postgresql.md",sourceDirName:"user/software/development",slug:"/user/software/development/postgresql",permalink:"/docs/user/software/development/postgresql",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/postgresql.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"PostgreSQL",summary:"A quick guide to using Postgres on Solus"},sidebar:"userSidebar",previous:{title:"Java",permalink:"/docs/user/software/development/java"},next:{title:"R and RStudio",permalink:"/docs/user/software/development/r-and-rstudio"}},d={},c=[{value:"Usage",id:"usage",level:2},{value:"Updating to 17",id:"updating-to-17",level:2}];function i(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"postgresql-server",children:"PostgreSQL server"})}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.a,{href:"https://www.postgresql.org/",children:"PostgreSQL"})," is an open source object-relational database system. The ",(0,n.jsx)(s.code,{children:"postgresql"})," package in Solus includes the PostgreSQL library, client and server."]}),"\n",(0,n.jsx)(s.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsx)(s.p,{children:"PostgreSQL can be installed either from the Software Center or via terminal:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo eopkg install postgresql\n"})}),"\n",(0,n.jsx)(s.p,{children:"Management of the server can be done using Systemd:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo systemctl enable postgresql # Start the server on boot\nsudo systemctl start postgresql # Start the server now\nsudo systemctl stop postgresql # Stop the server\n"})}),"\n",(0,n.jsx)(s.p,{children:"It is possible to connect to the database using the PostgreSQL user:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo -u postgres psql\n"})}),"\n",(0,n.jsxs)(s.p,{children:["Note that all local connections are trusted and can access all databases by default. This can be changed in ",(0,n.jsx)(s.code,{children:"/var/db/pgsql/data/pg_hba.conf"}),", see the ",(0,n.jsx)(s.a,{href:"https://www.postgresql.org/docs/current/auth-pg-hba-conf.html",children:"PostgreSQL documentation"})," for more details."]}),"\n",(0,n.jsx)(s.h2,{id:"updating-to-17",children:"Updating to 17"}),"\n",(0,n.jsxs)(s.p,{children:["Because PostgreSQL is included as a single package, the only way to perform a major upgrade of PostgreSQL is via a backup/restore. The procedure below describes the upgrade process as it applies to Solus. See the ",(0,n.jsx)(s.a,{href:"https://www.postgresql.org/docs/17/upgrading.html#UPGRADING-VIA-PGDUMPALL",children:"PostgreSQL documentation"})," for more details."]}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsx)(s.li,{children:"If you have already updated PostgreSQL, downgrade PostgreSQL back to 16.4:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo eopkg it https://cdn.getsol.us/repo/shannon/p/postgresql/postgresql-16.4-51-1-x86_64.eopkg \\\n https://cdn.getsol.us/repo/shannon/p/postgresql/postgresql-libpq-16.4-51-1-x86_64.eopkg\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"2",children:["\n",(0,n.jsx)(s.li,{children:"(Re)start PostgreSQL:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo systemctl restart postgresql\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"3",children:["\n",(0,n.jsx)(s.li,{children:"Create a backup of all current data:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo -u postgres pg_dumpall -f /tmp/backup.sql\n"})}),"\n",(0,n.jsxs)(s.p,{children:["The location of the backup may be one of your choosing, but keep in mind that the ",(0,n.jsx)(s.code,{children:"postgres"})," user needs to have write permissions on the given location."]}),"\n",(0,n.jsxs)(s.ol,{start:"4",children:["\n",(0,n.jsx)(s.li,{children:"Stop PostgreSQL:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo systemctl stop postgresql\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"5",children:["\n",(0,n.jsx)(s.li,{children:"Rename the old data directory. This directory contains the old configuration and the original database, but requires significant disk space."}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo mv /var/db/pgsql/data /var/db/pgsql/data.old\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"6",children:["\n",(0,n.jsx)(s.li,{children:"Create a new data directory:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo mkdir /var/db/pgsql/data\nsudo chown postgres: /var/db/pgsql/data\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"7",children:["\n",(0,n.jsx)(s.li,{children:"Upgrade PostgreSQL:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo eopkg upgrade\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"8",children:["\n",(0,n.jsx)(s.li,{children:"Start PostgreSQL:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo systemctl start postgresql\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"9",children:["\n",(0,n.jsx)(s.li,{children:"Restore the data:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo -u postgres psql < /tmp/backup.sql\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"10",children:["\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:["(optional) Update the configuration files in ",(0,n.jsx)(s.code,{children:"/var/db/pgsql/data"})," based on the configuration in ",(0,n.jsx)(s.code,{children:"/var/db/pgsql/data.old"}),". Restart PostgreSQL afterwards."]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:"Verify that the migration was successful and your data is there."}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:"Remove the backup and data dump:"}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo rm -r /var/db/pgsql/data.old /tmp/backup.sql\n"})})]})}function h(e={}){const{wrapper:s}={...(0,r.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(i,{...e})}):i(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>l,a:()=>o});var n=t(67294);const r={},a=n.createContext(r);function o(e){const s=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),n.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[7212],{4606:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=t(85893),r=t(11151);const a={title:"PostgreSQL",summary:"A quick guide to using Postgres on Solus"},o="PostgreSQL server",l={id:"user/software/development/postgresql",title:"PostgreSQL",description:"PostgreSQL is an open source object-relational database system. The postgresql package in Solus includes the PostgreSQL library, client and server.",source:"@site/docs/user/software/development/postgresql.md",sourceDirName:"user/software/development",slug:"/user/software/development/postgresql",permalink:"/docs/user/software/development/postgresql",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/postgresql.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"PostgreSQL",summary:"A quick guide to using Postgres on Solus"},sidebar:"userSidebar",previous:{title:"Java",permalink:"/docs/user/software/development/java"},next:{title:"R and RStudio",permalink:"/docs/user/software/development/r-and-rstudio"}},d={},c=[{value:"Usage",id:"usage",level:2},{value:"Updating to 17",id:"updating-to-17",level:2}];function i(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"postgresql-server",children:"PostgreSQL server"})}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.a,{href:"https://www.postgresql.org/",children:"PostgreSQL"})," is an open source object-relational database system. The ",(0,n.jsx)(s.code,{children:"postgresql"})," package in Solus includes the PostgreSQL library, client and server."]}),"\n",(0,n.jsx)(s.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsx)(s.p,{children:"PostgreSQL can be installed either from the Software Center or via terminal:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo eopkg install postgresql\n"})}),"\n",(0,n.jsx)(s.p,{children:"Management of the server can be done using Systemd:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo systemctl enable postgresql # Start the server on boot\nsudo systemctl start postgresql # Start the server now\nsudo systemctl stop postgresql # Stop the server\n"})}),"\n",(0,n.jsx)(s.p,{children:"It is possible to connect to the database using the PostgreSQL user:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo -u postgres psql\n"})}),"\n",(0,n.jsxs)(s.p,{children:["Note that all local connections are trusted and can access all databases by default. This can be changed in ",(0,n.jsx)(s.code,{children:"/var/db/pgsql/data/pg_hba.conf"}),", see the ",(0,n.jsx)(s.a,{href:"https://www.postgresql.org/docs/current/auth-pg-hba-conf.html",children:"PostgreSQL documentation"})," for more details."]}),"\n",(0,n.jsx)(s.h2,{id:"updating-to-17",children:"Updating to 17"}),"\n",(0,n.jsxs)(s.p,{children:["Because PostgreSQL is included as a single package, the only way to perform a major upgrade of PostgreSQL is via a backup/restore. The procedure below describes the upgrade process as it applies to Solus. See the ",(0,n.jsx)(s.a,{href:"https://www.postgresql.org/docs/17/upgrading.html#UPGRADING-VIA-PGDUMPALL",children:"PostgreSQL documentation"})," for more details."]}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsx)(s.li,{children:"If you have already updated PostgreSQL, downgrade PostgreSQL back to 16.4:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo eopkg it https://cdn.getsol.us/repo/shannon/p/postgresql/postgresql-16.4-51-1-x86_64.eopkg \\\n https://cdn.getsol.us/repo/shannon/p/postgresql/postgresql-libpq-16.4-51-1-x86_64.eopkg\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"2",children:["\n",(0,n.jsx)(s.li,{children:"(Re)start PostgreSQL:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo systemctl restart postgresql\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"3",children:["\n",(0,n.jsx)(s.li,{children:"Create a backup of all current data:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo -u postgres pg_dumpall -f /tmp/backup.sql\n"})}),"\n",(0,n.jsxs)(s.p,{children:["The location of the backup may be one of your choosing, but keep in mind that the ",(0,n.jsx)(s.code,{children:"postgres"})," user needs to have write permissions on the given location."]}),"\n",(0,n.jsxs)(s.ol,{start:"4",children:["\n",(0,n.jsx)(s.li,{children:"Stop PostgreSQL:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo systemctl stop postgresql\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"5",children:["\n",(0,n.jsx)(s.li,{children:"Rename the old data directory. This directory contains the old configuration and the original database, but requires significant disk space."}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo mv /var/db/pgsql/data /var/db/pgsql/data.old\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"6",children:["\n",(0,n.jsx)(s.li,{children:"Create a new data directory:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo mkdir /var/db/pgsql/data\nsudo chown postgres: /var/db/pgsql/data\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"7",children:["\n",(0,n.jsx)(s.li,{children:"Upgrade PostgreSQL:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo eopkg upgrade\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"8",children:["\n",(0,n.jsx)(s.li,{children:"Start PostgreSQL:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo systemctl start postgresql\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"9",children:["\n",(0,n.jsx)(s.li,{children:"Restore the data:"}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo -u postgres psql < /tmp/backup.sql\n"})}),"\n",(0,n.jsxs)(s.ol,{start:"10",children:["\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:["(optional) Update the configuration files in ",(0,n.jsx)(s.code,{children:"/var/db/pgsql/data"})," based on the configuration in ",(0,n.jsx)(s.code,{children:"/var/db/pgsql/data.old"}),". Restart PostgreSQL afterwards."]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:"Verify that the migration was successful and your data is there."}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:"Remove the backup and data dump:"}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"sudo rm -r /var/db/pgsql/data.old /tmp/backup.sql\n"})})]})}function h(e={}){const{wrapper:s}={...(0,r.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(i,{...e})}):i(e)}},11151:(e,s,t)=>{t.d(s,{Z:()=>l,a:()=>o});var n=t(67294);const r={},a=n.createContext(r);function o(e){const s=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),n.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fb6dc457.75a60bc1.js b/assets/js/fb6dc457.c69a7694.js similarity index 99% rename from assets/js/fb6dc457.75a60bc1.js rename to assets/js/fb6dc457.c69a7694.js index c6b932448..30f8fff04 100644 --- a/assets/js/fb6dc457.75a60bc1.js +++ b/assets/js/fb6dc457.c69a7694.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[5482],{77123:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>d,toc:()=>r});var t=i(85893),o=i(11151);const s={title:"Configuration",summary:"Help for configuring GNOME Shell on Solus"},a="Configuration",d={id:"user/editions/gnome/configuration",title:"Configuration",description:"System",source:"@site/docs/user/editions/gnome/configuration.md",sourceDirName:"user/editions/gnome",slug:"/user/editions/gnome/configuration",permalink:"/docs/user/editions/gnome/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/gnome/configuration.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"Configuration",summary:"Help for configuring GNOME Shell on Solus"},sidebar:"userSidebar",previous:{title:"GNOME",permalink:"/docs/user/editions/gnome/"},next:{title:"Tips and Tricks",permalink:"/docs/user/editions/gnome/tips-and-tricks"}},c={},r=[{value:"System",id:"system",level:2},{value:"Date and time",id:"date-and-time",level:3},{value:"Default applications",id:"default-applications",level:3},{value:"Displays",id:"displays",level:2},{value:"Keyboard layout",id:"keyboard-layout",level:2},{value:"IBus",id:"ibus",level:3},{value:"Language",id:"language",level:2},{value:"Mouse and touchpad",id:"mouse-and-touchpad",level:2},{value:"Mouse",id:"mouse",level:3},{value:"Touchpad",id:"touchpad",level:3},{value:"Testing",id:"testing",level:3},{value:"Networking",id:"networking",level:2},{value:"Non-hidden network",id:"non-hidden-network",level:3},{value:"Hidden network",id:"hidden-network",level:3},{value:"Sound and sound devices",id:"sound-and-sound-devices",level:2},{value:"Settings",id:"settings",level:3},{value:"Users",id:"users",level:2},{value:"Adding a user",id:"adding-a-user",level:3},{value:"Removing a user",id:"removing-a-user",level:3},{value:"User interface",id:"user-interface",level:2},{value:"Desktop background",id:"desktop-background",level:3},{value:"Desktop icons",id:"desktop-icons",level:3},{value:"Workspaces",id:"workspaces",level:2},{value:"Keyboard Shortcuts",id:"keyboard-shortcuts",level:3}];function l(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,o.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,t.jsx)(n.h2,{id:"system",children:"System"}),"\n",(0,t.jsx)(n.h3,{id:"date-and-time",children:"Date and time"}),"\n",(0,t.jsxs)(n.p,{children:["To change the date and time settings in GNOME, you can open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Date & Time".']}),"\n",(0,t.jsx)(n.p,{children:'You will be presented with the following window. This window provides you with the ability to enable / disable automatic date & time, automatic time zone changing, and the time format. You will need to click on "Unlock" and input your user password before changes can be made.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Date and Time",src:i(56935).Z+"",width:"742",height:"384"})}),"\n",(0,t.jsx)(n.p,{children:'If you wish to change how the time is displayed in the top panel, go back to the Applications Overlay and then find and click on "Tweak Tool". You can now show the date and / or seconds by opening the Top Bar section.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Tweak Tool: Top Bar",src:i(94202).Z+"",width:"906",height:"656"})}),"\n",(0,t.jsx)(n.h3,{id:"default-applications",children:"Default applications"}),"\n",(0,t.jsxs)(n.p,{children:["With GNOME, you will need to open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Details".']}),"\n",(0,t.jsx)(n.p,{children:'Upon entering the Details section, click on "Default Applications" and then use the drop down boxes to select a different default application for each category. For most categories, you will need to have installed alternative applications before you can change the default settings. For instance, if you wish to change the default video player from GNOME MPV to VLC then you must first install VLC (available in the Software Center).'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Default Applications",src:i(53885).Z+"",width:"742",height:"517"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.em,{children:"Note: In the image above, we've changed the Web browser and Photo viewer."})}),"\n",(0,t.jsx)(n.p,{children:'You can specify default applications for individual file types by right clicking on a file and then clicking on "Open With Other Application".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Context Menu ",src:i(72964).Z+"",width:"324",height:"417"})}),"\n",(0,t.jsx)(n.p,{children:'Next, select the application you wish to use from the list. You may need to click "View All Applications" if you can\'t see the one you would like to use. Finish by clicking "Select". In the future, all files with the same file type will open with the same application.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Application Selection",src:i(72191).Z+"",width:"426",height:"405"})}),"\n",(0,t.jsx)(n.h2,{id:"displays",children:"Displays"}),"\n",(0,t.jsx)(n.p,{children:'In GNOME, You can configure your display(s) simply by right clicking anywhere on the desktop and clicking "Display Settings".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Desktop Context Menu",src:i(51729).Z+"",width:"210",height:"152"})}),"\n",(0,t.jsxs)(n.p,{children:["Alternatively, you can open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Displays".']}),"\n",(0,t.jsx)(n.p,{children:"You will then be shown the following window."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Displays Overview",src:i(20241).Z+"",width:"742",height:"345"})}),"\n",(0,t.jsx)(n.p,{children:"Click on the individual display you wish to configure. You will now be able to select if you wish to use this monitor as the primary or secondary display, mirror it with another display, or turn it off. This window also gives you the size and aspect ratio, ability to rotate the display, and ability to change the resolution."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Individual Display Settings",src:i(94287).Z+"",width:"741",height:"365"})}),"\n",(0,t.jsx)(n.p,{children:"Going back to the Displays section, you also have the option to arrange your displays. Click the \u201cArrange Combined Displays\u201d button and then drag your displays so they are arranged to your liking."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Arrange Displays",src:i(59556).Z+"",width:"742",height:"381"})}),"\n",(0,t.jsx)(n.p,{children:'Click "Apply" once you are happy with your changes. You will be shown a message asking if the display looks OK, if it does, click on "Keep Changes" within 20 seconds.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Confirm Display Settings",src:i(24798).Z+"",width:"502",height:"142"})}),"\n",(0,t.jsx)(n.h2,{id:"keyboard-layout",children:"Keyboard layout"}),"\n",(0,t.jsxs)(n.p,{children:["With GNOME, open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then find and click on "Region and Language".']}),"\n",(0,t.jsx)(n.p,{children:"You will now be shown the following dialog."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Region and Languages",src:i(92266).Z+"",width:"742",height:"345"})}),"\n",(0,t.jsxs)(n.p,{children:["Click the ",(0,t.jsx)(n.code,{children:"+"})," button to add an input source (keyboard layout). You will be shown the following dialog."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Add Input Source",src:i(88175).Z+"",width:"742",height:"410"})}),"\n",(0,t.jsxs)(n.p,{children:["Here you can select the language and then keyboard layout within each language section. If it does not appear in this list, click the ",(0,t.jsx)(n.code,{children:"\u22ee"})," button (three vertical dots). This will enable you to search for the keyboard layout you wish to use."]}),"\n",(0,t.jsx)(n.p,{children:'After choosing the keyboard layout, click "Done". You will be brought back to the following dialog with your new keyboard layout. In the image below, we are now using English (US), Finnish, and Swedish layout.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME New Input Source Added",src:i(39324).Z+"",width:"742",height:"363"})}),"\n",(0,t.jsxs)(n.p,{children:["You can remove a keyboard layout by clicking on one of the items, for instance Swedish, then clicking the ",(0,t.jsx)(n.code,{children:"-"})," button."]}),"\n",(0,t.jsxs)(n.p,{children:["If you wish to use multiple keyboard layouts, you can switch between them by using the keyboard shortcut ",(0,t.jsx)(n.code,{children:"Super + Space"})," or by clicking on the keyboard layout icon shown in the system tray. The icon will automatically appear when you have 2 or more keyboard layouts selected."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Keyboard Indicator",src:i(12837).Z+"",width:"206",height:"168"})}),"\n",(0,t.jsx)(n.h3,{id:"ibus",children:"IBus"}),"\n",(0,t.jsxs)(n.p,{children:["For ease of use, GNOME has IBus up and running by default. If you need an additional IBus IME see: ",(0,t.jsx)(n.a,{href:"/docs/user/software/localization/ibus/",children:"IBus"})]}),"\n",(0,t.jsxs)(n.p,{children:["You can now switch between your layouts by using the keyboard shortcut ",(0,t.jsx)(n.code,{children:"Super + Space"})," or by clicking on the keyboard layout icon shown in the system tray."]}),"\n",(0,t.jsx)(n.h2,{id:"language",children:"Language"}),"\n",(0,t.jsxs)(n.p,{children:["With GNOME, open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then find and click on "Region and Language".']}),"\n",(0,t.jsx)(n.p,{children:"You will now be shown the following window. This window allows you to change your language, formatting for dates and times and the language of your keyboard."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Region and Languages",src:i(92266).Z+"",width:"742",height:"345"})}),"\n",(0,t.jsx)(n.p,{children:'Start by clicking "Language". This brings up a selection of languages to chose from.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Selecting Language",src:i(45905).Z+"",width:"742",height:"489"})}),"\n",(0,t.jsx)(n.p,{children:"If your language does not appear in the list, click the \u22ee button at the bottom (three vertical dots) to show all the available languages. You can use the search box to go directly to your choice or scroll down the list."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Language Search",src:i(5623).Z+"",width:"742",height:"489"})}),"\n",(0,t.jsxs)(n.p,{children:['Once you have selected the language you wish to use, click "Done". You ',(0,t.jsx)(n.em,{children:"may"})," need to logout and login to your computer for it to take affect."]}),"\n",(0,t.jsx)(n.h2,{id:"mouse-and-touchpad",children:"Mouse and touchpad"}),"\n",(0,t.jsxs)(n.p,{children:["With GNOME, open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then find and click on "Mouse and Touchpad". You will see either settings for your mouse or trackpad, depending on the device.']}),"\n",(0,t.jsx)(n.h3,{id:"mouse",children:"Mouse"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Mouse Settings",src:i(19580).Z+"",width:"742",height:"585"})}),"\n",(0,t.jsx)(n.p,{children:"For mice, you can set:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"The primary button (usually left click) to be left or right."}),"\n",(0,t.jsx)(n.li,{children:"Mouse speed."}),"\n",(0,t.jsx)(n.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"touchpad",children:"Touchpad"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Touchpad Settings",src:i(62903).Z+"",width:"742",height:"585"})}),"\n",(0,t.jsx)(n.p,{children:"For touchpads, you can set:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"The primary button (usually left click) to be left or right."}),"\n",(0,t.jsx)(n.li,{children:"Enabling / disabling of the touchpad."}),"\n",(0,t.jsx)(n.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n",(0,t.jsx)(n.li,{children:"Touchpad speed."}),"\n",(0,t.jsx)(n.li,{children:"Enabling / disabling of Tap to Click."}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"testing",children:"Testing"}),"\n",(0,t.jsx)(n.p,{children:'You can test your settings by clicking the "Test Your Settings" button in the top right of the window.'}),"\n",(0,t.jsx)(n.h2,{id:"networking",children:"Networking"}),"\n",(0,t.jsx)(n.p,{children:'Easily change network settings with GNOME by left or right clicking on the system tray in the top panel and then clicking on "WiFi Not Connected".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Network Indicator",src:i(41694).Z+"",width:"331",height:"500"})}),"\n",(0,t.jsxs)(n.p,{children:["Alternatively, you can open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Network".']}),"\n",(0,t.jsx)(n.h3,{id:"non-hidden-network",children:"Non-hidden network"}),"\n",(0,t.jsx)(n.p,{children:'Once you have opened the "WiFi Not Connected" menu, click on "Select Network". Click on the network you wish to join and then on "Connect".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Network Selection",src:i(19750).Z+"",width:"500",height:"479"})}),"\n",(0,t.jsx)(n.p,{children:'You may now be prompted to authenticate with the network. Type in your password and then click "Connect".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Network Authentication",src:i(49755).Z+"",width:"550",height:"244"})}),"\n",(0,t.jsx)(n.p,{children:"If your password is correct, you will now be authenticated with the network."}),"\n",(0,t.jsx)(n.h3,{id:"hidden-network",children:"Hidden network"}),"\n",(0,t.jsx)(n.p,{children:'To join a hidden network, open the "WiFi Not Connected" menu and click on "WiFi Settings".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Network Overview",src:i(13917).Z+"",width:"742",height:"491"})}),"\n",(0,t.jsx)(n.p,{children:"Next, click on \u201cConnect to Hidden Network...\u201d. It will show the following dialog, where you type the network name and type of security (if any)."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Hidden Network",src:i(36258).Z+"",width:"741",height:"490"})}),"\n",(0,t.jsx)(n.p,{children:"If the network is found and has a password, you will be prompted to authenticate with the network."}),"\n",(0,t.jsx)(n.h2,{id:"sound-and-sound-devices",children:"Sound and sound devices"}),"\n",(0,t.jsx)(n.p,{children:"With GNOME, the volume can be changed by left or right clicking the system tray in the top panel and then simply dragging the volume slider with your mouse."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Volume Control",src:i(44483).Z+"",width:"300",height:"370"})}),"\n",(0,t.jsx)(n.h3,{id:"settings",children:"Settings"}),"\n",(0,t.jsxs)(n.p,{children:["You can access sound settings, including individual application volume controls, and a simple speaker test by opening the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Sound".']}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Sound Settings",src:i(31401).Z+"",width:"742",height:"495"})}),"\n",(0,t.jsx)(n.h2,{id:"users",children:"Users"}),"\n",(0,t.jsx)(n.p,{children:'To add and remove users with GNOME, you can click on the icons in the far right of the top panel. Click on your name and then on "Account Setting".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME User Indicator",src:i(27121).Z+"",width:"283",height:"323"})}),"\n",(0,t.jsxs)(n.p,{children:["Alternatively, you can open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Users".']}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME User Settings",src:i(51215).Z+"",width:"742",height:"453"})}),"\n",(0,t.jsx)(n.p,{children:'To manage your own or other accounts, you first need to authenticate. Click the "Unlock" button in the top right corner and type your password. Note that you are required to be an administrator. If you\'re the only user on the system, then your account is an administrator by default.'}),"\n",(0,t.jsx)(n.p,{children:'In the event the password provided is correct, the "Unlock" button will change to "Add User..."'}),"\n",(0,t.jsx)(n.h3,{id:"adding-a-user",children:"Adding a user"}),"\n",(0,t.jsx)(n.p,{children:'To add a user, click the "Add User..." button in the top right corner of the Users window.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Add User Button",src:i(53854).Z+"",width:"225",height:"65"})}),"\n",(0,t.jsx)(n.p,{children:"This will open the Add User window (shown below)."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Add User Dialog",src:i(72158).Z+"",width:"466",height:"546"})}),"\n",(0,t.jsx)(n.p,{children:'Fill in the required items and then finish adding the new user by clicking "Add" in the top right corner.'}),"\n",(0,t.jsx)(n.h3,{id:"removing-a-user",children:"Removing a user"}),"\n",(0,t.jsx)(n.p,{children:'To remove a user, open the Users window and then click on the user you wish to remove. Now click on the red "Remove User..." button in the bottom right corner.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME User List",src:i(81379).Z+"",width:"742",height:"592"})}),"\n",(0,t.jsx)(n.p,{children:"Upon clicking to remove the user, you will be given the option to keep their files, delete their files, or cancel the removal of the user\u2019s account."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Keep Files Prompt",src:i(41361).Z+"",width:"508",height:"162"})}),"\n",(0,t.jsx)(n.h2,{id:"user-interface",children:"User interface"}),"\n",(0,t.jsx)(n.h3,{id:"desktop-background",children:"Desktop background"}),"\n",(0,t.jsx)(n.p,{children:'The GNOME desktop background can be changed by simply right clicking anywhere on the desktop and selecting "Change background".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Background Right Click Menu",src:i(36198).Z+"",width:"212",height:"150"})}),"\n",(0,t.jsx)(n.p,{children:'Alternatively, you can open the Applications Overlay by clicking the applications icon in the dock and then finding and clicking on "Background".'}),"\n",(0,t.jsx)(n.p,{children:'You will have two options, Background and Lock Screen. Click "Background".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Settings Background Section",src:i(77101).Z+"",width:"742",height:"515"})}),"\n",(0,t.jsx)(n.p,{children:'In this section, you can choose between Solus wallpapers, pictures in your Pictures folder, or solid colors. After choosing, click "Select".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Background Selection",src:i(71955).Z+"",width:"830",height:"468"})}),"\n",(0,t.jsx)(n.h3,{id:"desktop-icons",children:"Desktop icons"}),"\n",(0,t.jsxs)(n.p,{children:["In GNOME, you can enable desktop items by opening the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the Applications icon in the dock and then search for and open "Tweak Tool". You can then toggle them on and off by clicking "Icons on Desktop" under the Desktop section.']}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Tweak Tool",src:i(8338).Z+"",width:"904",height:"654"})}),"\n",(0,t.jsx)(n.p,{children:'You may now add things to your Desktop. This can be done by dragging an item onto the Desktop or by right clicking an icon and selecting Copy to / Move to Desktop. Alternatively, click on the "Files" icon in the dock and then move the files you want to the Desktop folder (as shown in the image below). Please note, the Desktop folder is not visible in "Files" until you\'ve enabled the Desktop icons.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Desktop Folder",src:i(62778).Z+"",width:"884",height:"415"})}),"\n",(0,t.jsx)(n.h2,{id:"workspaces",children:"Workspaces"}),"\n",(0,t.jsx)(n.p,{children:"GNOME enables the switching of workspaces via the Workspace Switcher on the right side of the Activities Overview screen. Application windows can be dragged from the Activities Overview to a workspace, whether it is empty / new, or one that already has windows in it."}),"\n",(0,t.jsx)(n.h3,{id:"keyboard-shortcuts",children:"Keyboard Shortcuts"}),"\n",(0,t.jsx)(n.p,{children:"GNOME provides a variety of keyboard shortcuts for workspaces."}),"\n",(0,t.jsx)(n.p,{children:"To view these shortcuts open the Keyboard application and scroll to the Navigation section."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Workspaces Keyboard Shortcuts",src:i(36663).Z+"",width:"740",height:"395"})})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},88175:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-add-input-source-d437c5e7831ecdb1e489aa21ac60d526.png"},53854:(e,n,i)=>{i.d(n,{Z:()=>t});const t="data:image/jpeg;base64,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"},72158:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-add-user-dialog-4a76a1d5811db1f477173c3c1fabb43a.jpg"},59556:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-arrange-displays-c6b7dca4d418eed7a79be42eabbab2d1.png"},36198:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-background-right-click-296958d96e0cd78b4bd122538368baf6.jpg"},77101:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-background-section-ca69ba209a6e21b75235377cfe37096a.jpg"},71955:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-background-selection-2b69c07e0327d086c99d3925edefd0de.jpg"},53885:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-configuring-default-applications-c38e8846a0f5406e2a929ceed630e0ac.jpg"},56935:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-date-and-time-aa3c32f3601912751b47792bed13d861.jpg"},24798:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-display-confirm-73e76e471778f250fce7a77b06ebf4cc.jpg"},51729:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-display-right-click-0e3734d006161e208d66f1dbbfd5b284.jpg"},20241:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-displays-overview-6bbedd44653525b6c3aba838cf30349d.jpg"},94287:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-individual-display-settings-2d5ef78b2175bb97fc2e729a90ee5774.jpg"},41361:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-keep-files-prompt-5b7532e8ea1cf62ad466bf6d2eec702f.jpg"},19580:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-mouse-settings-4652630acfe19020bb0b29d0155bf012.jpg"},81379:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-multiple-user-settings-e0957ed6affeef47726232f6fa2c22a0.jpg"},62778:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-nautilus-desktop-folder-d8e82c2d25e2d637fc2f63e85241c255.jpg"},49755:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-network-authentication-306d93017ccbe74f3760db30ad3be13c.jpg"},36258:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-network-hidden-0567bce591f6219bb35378032a3db3e9.jpg"},13917:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-network-overview-56ca62f1ff834202f557968bddfe6ae8.jpg"},19750:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-network-select-b153e6a0d6a6394708fd70d376d84dc9.jpg"},72964:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-open-with-right-click-f8c5019ecbc6f6cb589c6117c20c85b4.jpg"},72191:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-open-with-select-application-7c831e8489c82c5ac4df9f3bd5a85644.jpg"},39324:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-region-and-languages-newlang-4bb2078c2e13e3b57093c6b6c8b68695.jpg"},92266:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-region-and-languages-335dc9a1b149e6ee8b31960b2786e80f.jpg"},5623:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-selecting-language-search-0ef7ad4ad481eba3511f505c0d48dd64.png"},45905:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-selecting-language-1b584e15820bf752584efc6dd7b15aeb.png"},51215:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-single-user-settings-39514927d322f1eae5e257384a82106b.jpg"},31401:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-sound-settings-83f0c82715b44956569594953085dad1.jpg"},12837:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-top-panel-keyboard-layout-c727398da89fe9a7bbae669ab07699d7.jpg"},41694:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-top-panel-network-click-23903f435151287556210b48a2731783.jpg"},27121:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-top-panel-right-click-10a13ee21a2ed1ad21315bfdd76e4041.jpg"},62903:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-touchpad-settings-ee9690f056a1ed39ebddd5cd61936608.jpg"},8338:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-tweak-tool-desktop-46f30603727af27af46f394d0df8f07e.jpg"},94202:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-tweak-tool-top-bar-212f1978bc9194fbe0d5a1f49da0ef38.jpg"},44483:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-volume-control-fc9ad5c29a7859a4532adde7ed56df46.jpg"},36663:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/workspace-shortcuts-gcc-f4f5e863caf0c2532f4d3cbc633b5f8a.jpg"},11151:(e,n,i)=>{i.d(n,{Z:()=>d,a:()=>a});var t=i(67294);const o={},s=t.createContext(o);function a(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[5482],{77123:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>d,toc:()=>r});var t=i(85893),o=i(11151);const s={title:"Configuration",summary:"Help for configuring GNOME Shell on Solus"},a="Configuration",d={id:"user/editions/gnome/configuration",title:"Configuration",description:"System",source:"@site/docs/user/editions/gnome/configuration.md",sourceDirName:"user/editions/gnome",slug:"/user/editions/gnome/configuration",permalink:"/docs/user/editions/gnome/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/gnome/configuration.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"Configuration",summary:"Help for configuring GNOME Shell on Solus"},sidebar:"userSidebar",previous:{title:"GNOME",permalink:"/docs/user/editions/gnome/"},next:{title:"Tips and Tricks",permalink:"/docs/user/editions/gnome/tips-and-tricks"}},c={},r=[{value:"System",id:"system",level:2},{value:"Date and time",id:"date-and-time",level:3},{value:"Default applications",id:"default-applications",level:3},{value:"Displays",id:"displays",level:2},{value:"Keyboard layout",id:"keyboard-layout",level:2},{value:"IBus",id:"ibus",level:3},{value:"Language",id:"language",level:2},{value:"Mouse and touchpad",id:"mouse-and-touchpad",level:2},{value:"Mouse",id:"mouse",level:3},{value:"Touchpad",id:"touchpad",level:3},{value:"Testing",id:"testing",level:3},{value:"Networking",id:"networking",level:2},{value:"Non-hidden network",id:"non-hidden-network",level:3},{value:"Hidden network",id:"hidden-network",level:3},{value:"Sound and sound devices",id:"sound-and-sound-devices",level:2},{value:"Settings",id:"settings",level:3},{value:"Users",id:"users",level:2},{value:"Adding a user",id:"adding-a-user",level:3},{value:"Removing a user",id:"removing-a-user",level:3},{value:"User interface",id:"user-interface",level:2},{value:"Desktop background",id:"desktop-background",level:3},{value:"Desktop icons",id:"desktop-icons",level:3},{value:"Workspaces",id:"workspaces",level:2},{value:"Keyboard Shortcuts",id:"keyboard-shortcuts",level:3}];function l(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,o.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"configuration",children:"Configuration"})}),"\n",(0,t.jsx)(n.h2,{id:"system",children:"System"}),"\n",(0,t.jsx)(n.h3,{id:"date-and-time",children:"Date and time"}),"\n",(0,t.jsxs)(n.p,{children:["To change the date and time settings in GNOME, you can open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Date & Time".']}),"\n",(0,t.jsx)(n.p,{children:'You will be presented with the following window. This window provides you with the ability to enable / disable automatic date & time, automatic time zone changing, and the time format. You will need to click on "Unlock" and input your user password before changes can be made.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Date and Time",src:i(56935).Z+"",width:"742",height:"384"})}),"\n",(0,t.jsx)(n.p,{children:'If you wish to change how the time is displayed in the top panel, go back to the Applications Overlay and then find and click on "Tweak Tool". You can now show the date and / or seconds by opening the Top Bar section.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Tweak Tool: Top Bar",src:i(94202).Z+"",width:"906",height:"656"})}),"\n",(0,t.jsx)(n.h3,{id:"default-applications",children:"Default applications"}),"\n",(0,t.jsxs)(n.p,{children:["With GNOME, you will need to open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Details".']}),"\n",(0,t.jsx)(n.p,{children:'Upon entering the Details section, click on "Default Applications" and then use the drop down boxes to select a different default application for each category. For most categories, you will need to have installed alternative applications before you can change the default settings. For instance, if you wish to change the default video player from GNOME MPV to VLC then you must first install VLC (available in the Software Center).'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Default Applications",src:i(53885).Z+"",width:"742",height:"517"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.em,{children:"Note: In the image above, we've changed the Web browser and Photo viewer."})}),"\n",(0,t.jsx)(n.p,{children:'You can specify default applications for individual file types by right clicking on a file and then clicking on "Open With Other Application".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Context Menu ",src:i(72964).Z+"",width:"324",height:"417"})}),"\n",(0,t.jsx)(n.p,{children:'Next, select the application you wish to use from the list. You may need to click "View All Applications" if you can\'t see the one you would like to use. Finish by clicking "Select". In the future, all files with the same file type will open with the same application.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Application Selection",src:i(72191).Z+"",width:"426",height:"405"})}),"\n",(0,t.jsx)(n.h2,{id:"displays",children:"Displays"}),"\n",(0,t.jsx)(n.p,{children:'In GNOME, You can configure your display(s) simply by right clicking anywhere on the desktop and clicking "Display Settings".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Desktop Context Menu",src:i(51729).Z+"",width:"210",height:"152"})}),"\n",(0,t.jsxs)(n.p,{children:["Alternatively, you can open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Displays".']}),"\n",(0,t.jsx)(n.p,{children:"You will then be shown the following window."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Displays Overview",src:i(20241).Z+"",width:"742",height:"345"})}),"\n",(0,t.jsx)(n.p,{children:"Click on the individual display you wish to configure. You will now be able to select if you wish to use this monitor as the primary or secondary display, mirror it with another display, or turn it off. This window also gives you the size and aspect ratio, ability to rotate the display, and ability to change the resolution."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Individual Display Settings",src:i(94287).Z+"",width:"741",height:"365"})}),"\n",(0,t.jsx)(n.p,{children:"Going back to the Displays section, you also have the option to arrange your displays. Click the \u201cArrange Combined Displays\u201d button and then drag your displays so they are arranged to your liking."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Arrange Displays",src:i(59556).Z+"",width:"742",height:"381"})}),"\n",(0,t.jsx)(n.p,{children:'Click "Apply" once you are happy with your changes. You will be shown a message asking if the display looks OK, if it does, click on "Keep Changes" within 20 seconds.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Confirm Display Settings",src:i(24798).Z+"",width:"502",height:"142"})}),"\n",(0,t.jsx)(n.h2,{id:"keyboard-layout",children:"Keyboard layout"}),"\n",(0,t.jsxs)(n.p,{children:["With GNOME, open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then find and click on "Region and Language".']}),"\n",(0,t.jsx)(n.p,{children:"You will now be shown the following dialog."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Region and Languages",src:i(92266).Z+"",width:"742",height:"345"})}),"\n",(0,t.jsxs)(n.p,{children:["Click the ",(0,t.jsx)(n.code,{children:"+"})," button to add an input source (keyboard layout). You will be shown the following dialog."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Add Input Source",src:i(88175).Z+"",width:"742",height:"410"})}),"\n",(0,t.jsxs)(n.p,{children:["Here you can select the language and then keyboard layout within each language section. If it does not appear in this list, click the ",(0,t.jsx)(n.code,{children:"\u22ee"})," button (three vertical dots). This will enable you to search for the keyboard layout you wish to use."]}),"\n",(0,t.jsx)(n.p,{children:'After choosing the keyboard layout, click "Done". You will be brought back to the following dialog with your new keyboard layout. In the image below, we are now using English (US), Finnish, and Swedish layout.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME New Input Source Added",src:i(39324).Z+"",width:"742",height:"363"})}),"\n",(0,t.jsxs)(n.p,{children:["You can remove a keyboard layout by clicking on one of the items, for instance Swedish, then clicking the ",(0,t.jsx)(n.code,{children:"-"})," button."]}),"\n",(0,t.jsxs)(n.p,{children:["If you wish to use multiple keyboard layouts, you can switch between them by using the keyboard shortcut ",(0,t.jsx)(n.code,{children:"Super + Space"})," or by clicking on the keyboard layout icon shown in the system tray. The icon will automatically appear when you have 2 or more keyboard layouts selected."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Keyboard Indicator",src:i(12837).Z+"",width:"206",height:"168"})}),"\n",(0,t.jsx)(n.h3,{id:"ibus",children:"IBus"}),"\n",(0,t.jsxs)(n.p,{children:["For ease of use, GNOME has IBus up and running by default. If you need an additional IBus IME see: ",(0,t.jsx)(n.a,{href:"/docs/user/software/localization/ibus/",children:"IBus"})]}),"\n",(0,t.jsxs)(n.p,{children:["You can now switch between your layouts by using the keyboard shortcut ",(0,t.jsx)(n.code,{children:"Super + Space"})," or by clicking on the keyboard layout icon shown in the system tray."]}),"\n",(0,t.jsx)(n.h2,{id:"language",children:"Language"}),"\n",(0,t.jsxs)(n.p,{children:["With GNOME, open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then find and click on "Region and Language".']}),"\n",(0,t.jsx)(n.p,{children:"You will now be shown the following window. This window allows you to change your language, formatting for dates and times and the language of your keyboard."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Region and Languages",src:i(92266).Z+"",width:"742",height:"345"})}),"\n",(0,t.jsx)(n.p,{children:'Start by clicking "Language". This brings up a selection of languages to chose from.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Selecting Language",src:i(45905).Z+"",width:"742",height:"489"})}),"\n",(0,t.jsx)(n.p,{children:"If your language does not appear in the list, click the \u22ee button at the bottom (three vertical dots) to show all the available languages. You can use the search box to go directly to your choice or scroll down the list."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Language Search",src:i(5623).Z+"",width:"742",height:"489"})}),"\n",(0,t.jsxs)(n.p,{children:['Once you have selected the language you wish to use, click "Done". You ',(0,t.jsx)(n.em,{children:"may"})," need to logout and login to your computer for it to take affect."]}),"\n",(0,t.jsx)(n.h2,{id:"mouse-and-touchpad",children:"Mouse and touchpad"}),"\n",(0,t.jsxs)(n.p,{children:["With GNOME, open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then find and click on "Mouse and Touchpad". You will see either settings for your mouse or trackpad, depending on the device.']}),"\n",(0,t.jsx)(n.h3,{id:"mouse",children:"Mouse"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Mouse Settings",src:i(19580).Z+"",width:"742",height:"585"})}),"\n",(0,t.jsx)(n.p,{children:"For mice, you can set:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"The primary button (usually left click) to be left or right."}),"\n",(0,t.jsx)(n.li,{children:"Mouse speed."}),"\n",(0,t.jsx)(n.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"touchpad",children:"Touchpad"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Touchpad Settings",src:i(62903).Z+"",width:"742",height:"585"})}),"\n",(0,t.jsx)(n.p,{children:"For touchpads, you can set:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"The primary button (usually left click) to be left or right."}),"\n",(0,t.jsx)(n.li,{children:"Enabling / disabling of the touchpad."}),"\n",(0,t.jsx)(n.li,{children:'Enabling / disabling "natural scrolling" (reversed scrolling direction).'}),"\n",(0,t.jsx)(n.li,{children:"Touchpad speed."}),"\n",(0,t.jsx)(n.li,{children:"Enabling / disabling of Tap to Click."}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"testing",children:"Testing"}),"\n",(0,t.jsx)(n.p,{children:'You can test your settings by clicking the "Test Your Settings" button in the top right of the window.'}),"\n",(0,t.jsx)(n.h2,{id:"networking",children:"Networking"}),"\n",(0,t.jsx)(n.p,{children:'Easily change network settings with GNOME by left or right clicking on the system tray in the top panel and then clicking on "WiFi Not Connected".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Network Indicator",src:i(41694).Z+"",width:"331",height:"500"})}),"\n",(0,t.jsxs)(n.p,{children:["Alternatively, you can open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Network".']}),"\n",(0,t.jsx)(n.h3,{id:"non-hidden-network",children:"Non-hidden network"}),"\n",(0,t.jsx)(n.p,{children:'Once you have opened the "WiFi Not Connected" menu, click on "Select Network". Click on the network you wish to join and then on "Connect".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Network Selection",src:i(19750).Z+"",width:"500",height:"479"})}),"\n",(0,t.jsx)(n.p,{children:'You may now be prompted to authenticate with the network. Type in your password and then click "Connect".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Network Authentication",src:i(49755).Z+"",width:"550",height:"244"})}),"\n",(0,t.jsx)(n.p,{children:"If your password is correct, you will now be authenticated with the network."}),"\n",(0,t.jsx)(n.h3,{id:"hidden-network",children:"Hidden network"}),"\n",(0,t.jsx)(n.p,{children:'To join a hidden network, open the "WiFi Not Connected" menu and click on "WiFi Settings".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Network Overview",src:i(13917).Z+"",width:"742",height:"491"})}),"\n",(0,t.jsx)(n.p,{children:"Next, click on \u201cConnect to Hidden Network...\u201d. It will show the following dialog, where you type the network name and type of security (if any)."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Hidden Network",src:i(36258).Z+"",width:"741",height:"490"})}),"\n",(0,t.jsx)(n.p,{children:"If the network is found and has a password, you will be prompted to authenticate with the network."}),"\n",(0,t.jsx)(n.h2,{id:"sound-and-sound-devices",children:"Sound and sound devices"}),"\n",(0,t.jsx)(n.p,{children:"With GNOME, the volume can be changed by left or right clicking the system tray in the top panel and then simply dragging the volume slider with your mouse."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Volume Control",src:i(44483).Z+"",width:"300",height:"370"})}),"\n",(0,t.jsx)(n.h3,{id:"settings",children:"Settings"}),"\n",(0,t.jsxs)(n.p,{children:["You can access sound settings, including individual application volume controls, and a simple speaker test by opening the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Sound".']}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Sound Settings",src:i(31401).Z+"",width:"742",height:"495"})}),"\n",(0,t.jsx)(n.h2,{id:"users",children:"Users"}),"\n",(0,t.jsx)(n.p,{children:'To add and remove users with GNOME, you can click on the icons in the far right of the top panel. Click on your name and then on "Account Setting".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME User Indicator",src:i(27121).Z+"",width:"283",height:"323"})}),"\n",(0,t.jsxs)(n.p,{children:["Alternatively, you can open the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the applications icon in the dock and then finding and clicking on "Users".']}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME User Settings",src:i(51215).Z+"",width:"742",height:"453"})}),"\n",(0,t.jsx)(n.p,{children:'To manage your own or other accounts, you first need to authenticate. Click the "Unlock" button in the top right corner and type your password. Note that you are required to be an administrator. If you\'re the only user on the system, then your account is an administrator by default.'}),"\n",(0,t.jsx)(n.p,{children:'In the event the password provided is correct, the "Unlock" button will change to "Add User..."'}),"\n",(0,t.jsx)(n.h3,{id:"adding-a-user",children:"Adding a user"}),"\n",(0,t.jsx)(n.p,{children:'To add a user, click the "Add User..." button in the top right corner of the Users window.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Add User Button",src:i(53854).Z+"",width:"225",height:"65"})}),"\n",(0,t.jsx)(n.p,{children:"This will open the Add User window (shown below)."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Add User Dialog",src:i(72158).Z+"",width:"466",height:"546"})}),"\n",(0,t.jsx)(n.p,{children:'Fill in the required items and then finish adding the new user by clicking "Add" in the top right corner.'}),"\n",(0,t.jsx)(n.h3,{id:"removing-a-user",children:"Removing a user"}),"\n",(0,t.jsx)(n.p,{children:'To remove a user, open the Users window and then click on the user you wish to remove. Now click on the red "Remove User..." button in the bottom right corner.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME User List",src:i(81379).Z+"",width:"742",height:"592"})}),"\n",(0,t.jsx)(n.p,{children:"Upon clicking to remove the user, you will be given the option to keep their files, delete their files, or cancel the removal of the user\u2019s account."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Keep Files Prompt",src:i(41361).Z+"",width:"508",height:"162"})}),"\n",(0,t.jsx)(n.h2,{id:"user-interface",children:"User interface"}),"\n",(0,t.jsx)(n.h3,{id:"desktop-background",children:"Desktop background"}),"\n",(0,t.jsx)(n.p,{children:'The GNOME desktop background can be changed by simply right clicking anywhere on the desktop and selecting "Change background".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Background Right Click Menu",src:i(36198).Z+"",width:"212",height:"150"})}),"\n",(0,t.jsx)(n.p,{children:'Alternatively, you can open the Applications Overlay by clicking the applications icon in the dock and then finding and clicking on "Background".'}),"\n",(0,t.jsx)(n.p,{children:'You will have two options, Background and Lock Screen. Click "Background".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Settings Background Section",src:i(77101).Z+"",width:"742",height:"515"})}),"\n",(0,t.jsx)(n.p,{children:'In this section, you can choose between Solus wallpapers, pictures in your Pictures folder, or solid colors. After choosing, click "Select".'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Background Selection",src:i(71955).Z+"",width:"830",height:"468"})}),"\n",(0,t.jsx)(n.h3,{id:"desktop-icons",children:"Desktop icons"}),"\n",(0,t.jsxs)(n.p,{children:["In GNOME, you can enable desktop items by opening the Overlay using the ",(0,t.jsx)(n.code,{children:"Super"}),' button on your keyboard or by clicking the Applications icon in the dock and then search for and open "Tweak Tool". You can then toggle them on and off by clicking "Icons on Desktop" under the Desktop section.']}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Tweak Tool",src:i(8338).Z+"",width:"904",height:"654"})}),"\n",(0,t.jsx)(n.p,{children:'You may now add things to your Desktop. This can be done by dragging an item onto the Desktop or by right clicking an icon and selecting Copy to / Move to Desktop. Alternatively, click on the "Files" icon in the dock and then move the files you want to the Desktop folder (as shown in the image below). Please note, the Desktop folder is not visible in "Files" until you\'ve enabled the Desktop icons.'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Desktop Folder",src:i(62778).Z+"",width:"884",height:"415"})}),"\n",(0,t.jsx)(n.h2,{id:"workspaces",children:"Workspaces"}),"\n",(0,t.jsx)(n.p,{children:"GNOME enables the switching of workspaces via the Workspace Switcher on the right side of the Activities Overview screen. Application windows can be dragged from the Activities Overview to a workspace, whether it is empty / new, or one that already has windows in it."}),"\n",(0,t.jsx)(n.h3,{id:"keyboard-shortcuts",children:"Keyboard Shortcuts"}),"\n",(0,t.jsx)(n.p,{children:"GNOME provides a variety of keyboard shortcuts for workspaces."}),"\n",(0,t.jsx)(n.p,{children:"To view these shortcuts open the Keyboard application and scroll to the Navigation section."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"GNOME Workspaces Keyboard Shortcuts",src:i(36663).Z+"",width:"740",height:"395"})})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},88175:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-add-input-source-d437c5e7831ecdb1e489aa21ac60d526.png"},53854:(e,n,i)=>{i.d(n,{Z:()=>t});const t="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCABBAOEDAREAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9c9Ph1SC+km+0FoHXBQrjB9a/KYUqsajd9D66UoONupqQ3UwABTIx1rrjz9jF8pKk7MSoY1UU2S7D45UDeZ6nmrjFCbHmdQ2Bkgnr6U3Gz0QiWFwo54wa0jHQlu5I11tXGepq22lYncR7iWJd23cKluSQ0rkD38mzMa/gaxnKql7qLUY9Sv8A2w018mnLZSsXXll+6PxrP20faKnJaspwtG9x19qcGk25muA2xPvnPSpxGJw2ChzzdkOnSqVpcsRbfU7TU4PNsXLgjqRirp4mhiIXpu6FKnUpytIdFCTGGeY8n1q40uZXuS5Ddio20scE9afs3F2Dm6jZ4Fx8s+D2pypAphh1i/euCR3FHs7R1DmuyCaO2Iyz8n6VhPDUpK0tS1UknoZer6BpupQBZ13sjbgG6A1xvL8JTjzQikzeOJrX3MKPwvpS6sbaexyrDliMg/0rneHUqtrfM6PbzUL3OI8U/s2eEpru81fSL+9gvJpfMjmiuWUK/Y46VjLBOOx2Us0nZKSKvw+8FfE3wdqMl5qvxMvdSQFcw3aqQFB5wcda5Z0KsZfu9Doq4jC1oW5bM7Xx7+0mfhLo0Go3WgX+q27yLHO2nRbjHnjOO4HeumlKo0ouN/PY4IYNV5aSsZWufEL4P/Gbwa/2vULuwgujtNxPGYwp+prmq0suq+67xl95vShj8LPTU42X4FWWgT2+p+CPHsd7beXtFtPMrBh7Y715tTJ+WTnGab+49P8AtmVSPJUhYzPinpHjTWPDjW8Xgeb7Zp43Wl6jgqMf3QATz059frXNg8JjMFWcpv3H0LhXw1WSs7ep46ngP9oO406bxHr2k2t7vJYQrJsIToFJb7xxxxgelepXx+Bp8iV4o76UKTk43u+ljI8G/G3wr4NefwpeeH72yup5D5zNkAY+8Qe5r0KmH+tQVWMk0Z1MPVU+W2p0lx8dPhhrcQ0ObxV9qvLIbraKWTJQ+2eD9a4/7Px0ZKcY2iyfZQi3rqH/AAtex/6DH/jq/wCFbfVanYPZxPznX/gtH/wU+QYX9q665/6kvQf/AJX1+2LIMpW1N/8AgT/zPx/+0cY/tfghR/wWl/4KfgbR+1fdY/7EvQf/AJX0/wCwcq/kf/gT/wAw/tDF/wA34IP+H03/AAVAHP8Aw1fdf+EXoH/yvoWQ5Sv+Xf8A5M/8xf2hi/5vwQ1v+C0P/BT1zlv2rbr/AMIzQf8A5ApPIMpf/Lt/+BP/ADH/AGhjP5vwQ4f8Fpv+CoA6ftX3X/hF6B/8r6f9hZV/z7f/AIE/8xf2hi/5vwQ4f8Fqv+CoY4H7WN1/4Regf/K+msjytfYf/gT/AMwePxb+1+CD/h9V/wAFQ85P7WN1/wCEXoH/AMr6f9h5V/z7/F/5i+v4v+b8EL/w+t/4KjYx/wANZXWP+xL0D/5X0f2Hlf8Az7/F/wCYfXsX/N+CG/8AD6n/AIKh/wDR2F1/4Regf/K+j+w8r/59/i/8w+vYv+b8EOh/4LXf8FRrd/Mh/axuQ3r/AMIVoH/yvqf7AyhS5vZ6+r/zH9fxdrc34IbP/wAFp/8AgqDc7vP/AGrrlt3UHwVoHP8A5T6ynw1kdRWlRv6t/wCZSzLHR2n+CGQf8Fof+Cnlsnl2/wC1ZcoP9nwVoA/9x9XDh/J6ceWNKy9X/mJ5jjZO7l+CJP8Ah9Z/wVFxt/4ayuv/AAi9A/8AlfWiyPK0v4f4v/Mn6/i/5vwQN/wWr/4KiNyf2sbr/wAIrQP/AJX0/wCxMrf2Pxf+YfXsV/N+CEP/AAWn/wCCoLHJ/avuv/CL0D/5X0v7Dyr/AJ9/i/8AMPr+L/m/BDW/4LR/8FPmOW/auuj/ANyZoP8A8gUnkWVP7D/8Cf8AmNY/Fr7X4IYf+Czv/BTo/wDN1l1/4Rmg/wDyBU/2BlH/AD7f/gT/AMx/2hi/5vwQv/D53/gp1jH/AA1Xc/8AhGaD/wDIFH+r+Uf8+/8AyZ/5h/aGL/m/BDG/4LLf8FNX+9+1Vd/+EdoX/wAgVH+rmTX/AIb/APApf5j/ALSxv834Iaf+CyX/AAUyPX9qi6/8I7Qv/kCn/q7k3/Pv/wAml/mL+0cZ/N+CGSf8Fiv+Clcq7ZP2pLkj0/4Q3Qv/AJApPhzJXvS/8ml/mP8AtLGr7X4Ir3H/AAV0/wCCjd3EYbn9pu4dD1VvB+h4/wDSGpfDORv/AJdf+TS/zKWa5gndT/BGfqP/AAVN/b91XRpPD9/+0RJJZzf6yA+D9DAP5WOazfCuQP8A5c/+TS/zNo55msZXVT8F/kZ9h/wUr/bp0qxTTtP/AGhbyKGLHlovhzSPlx0wfseRWcuEeHpSu6Lv/il/maf6w5v/AM/P/JY/5G1p/wDwV0/4KRaPCIbD9qLUdgHCyeGtGcf+PWJrWPC+RQVlSf8A4FL/ADMJZvmE3rJfcv8AIjuP+Ctv/BRS+Ui7/aWumHTH/CJ6J/SxrnrcGcM4hWqUL/8Ab0v8zWGe5tTd41LfJf5HKWn7bfxt1PxfZeKviv4/udZsrObzbu3i02ztWkjzmQA28EZ3FdwBOQCQSGAINT4WymlhpQw0OV201bXlo2zvw3FudUqsXOpzRXSy/RXP038X/wDBLPWRJcX3hfxh/abh82d21z5cioRyGK9fX8TX55TzLFU4pRimj7xZnha8uavFqRyv/Dtn41f9ByL/AL+v/jWv9rv+R/gbe2yzz+8/Jiv2Q/FgoAKACgAoAKAP090n9mz4AaPplvpVv8GfDMqW8SxrJd6HBNKwAxlndCzt6kkk1+zU8nyunBRVCLt3im/vaufy3W4m4hrVZVHi6ibd9JyS+STSS8kWf+GfvgL/ANES8I/+E1a//G6v+ysr/wCfEP8AwGP+Rn/rDn//AEF1f/Bk/wDMP+GfvgL/ANES8I/+E1a//G6P7Kyv/nxD/wABj/kH+sOf/wDQXV/8GT/zD/hn74C/9ES8I/8AhNWv/wAbo/srK/8AnxD/AMBj/kH+sOf/APQXV/8ABk/8w/4Z++Av/REvCP8A4TVr/wDG6P7Kyv8A58Q/8Bj/AJB/rDn/AP0F1f8AwZP/ADD/AIZ++Av/AERLwj/4TVr/APG6P7Kyv/nxD/wGP+Qf6w5//wBBdX/wZP8AzD/hn74C/wDREvCP/hNWv/xuj+ysr/58Q/8AAY/5B/rDn/8A0F1f/Bk/8w/4Z++Av/REvCP/AITVr/8AG6P7Kyv/AJ8Q/wDAY/5B/rDn/wD0F1f/AAZP/MP+GfvgL/0RLwj/AOE1a/8Axuj+ysr/AOfEP/AY/wCQf6w5/wD9BdX/AMGT/wAw/wCGfvgL/wBES8I/+E1a/wDxuj+ysr/58Q/8Bj/kH+sOf/8AQXV/8GT/AMw/4Z++Av8A0RLwj/4TVr/8bo/srK/+fEP/AAGP+Qf6w5//ANBdX/wZP/M+fP8Agon8HPhb4M+FWj+LfBvgLStHvh4hS0eTSrFLcSRPBM5DLGAGO6JcEjI5x1NfK8WZfgsPgoVaVNRfNbRJaNN9PQ/Q/DjOs1xubVcPia0px5HL3m5WalFaN3a0b9fkfHlfAH7KFABQAUAFABQAjKW6UrJANEZ7mhICvrShdHusdfs7/wDoJpS+FjW5+9nxW0T4p2d7bXGleKL3S7K7fF5Ppku4wvkYO0/w4r+fYJwXNKJ+wYaeEmmmlfpcxf8AhAPiN/0ct4k/8BBT+sU/+fX4ml6f8q/A/Div6DPxoKACgAoAKACgD9dK/eD+PyfTNOvNY1K30nToGluLqdIYIlGS7sQqgfUkUNpK7dkGvRXO/wDin+zrrvgb4jab8PfB+rjxM2rQFtPu7S38lZZUkkinjwXIAjkikBYsBtXccA8eNl+c0sZhalerH2ahq7v7LipRl03i1p301Po834cxGW4ujh6UvayqXWi/5eRk4Thu7uMlv1TT0TK2v/s9+NNGtfDNvaeTqGqeJp7uO2sNOuoLiNRCyDctxFK8bqQxJOQE2HJ640pZvhqtSrf3Y04xk2047826kk18Pzvp544jIMZQw9CWkp1ZzgoxcZfCqdrSjJp3c7W6cuu+lH4ifCDV/ht4Y0LXdb1K1lm1p7sCCyuYbiKNYWRQyzwyOkm7eeh4K457aYTMaWMxM6UE7RUXdpp+9zacskmrct/O5lj8mr5dgaWIqyV5ynGycZL3FB35oyad3O1unL56VNY+H39k+EvC/in+1/M/4SQ3P7j7Pj7P5U/lfe3fPnr0GOnPWt6OJ9tjqmGtbkUXfvzX6eVu+pyYjB/V8qp43mvzyqK1tuRQe/nzdtLdbmz4m/Z68b6R4k8QaTov2a9stC1i504X91fW9mbySDlxDFLKGlcLhike8gMPUVxYfOcNVwtKrUvFzipWScrJ9W0tFfS7stz1MXw3jaOOrYei1JU5cvM3GF3a9kpS1lb7Kbf3mRcfB74h2vhIeNp9CjWx+yJdlf7QgNwts7hFna3D+csRYgCQoFORzyK6v7QwjxPsOb3r8uztzWvy81uXmtra9/I4FlGYSwf1lQ9yzlvHm5U7OShfmcU9OZRt5kPj34W+N/hjcRWXjjS4bG4lLBbX+0YJZlAAO5o43ZkUhgVZgAw+6Tg08Lj8Ljb+xle3WzS7Wu1a6tqt11JxuV47L4RliIqPNZpc0W7NJp2Tbs01Z2s9r3TOfrsPPCgD50/4Kb/8kF0j/sb7f/0luq+S4y/5FcP8a/8ASZH6R4X/API/q/8AXqX/AKXA+I5/+Rdtf+v24/8AQIa/Neh+8dSlSA3fDHwv+JfjWwfVfBvw713V7WOYxSXOmaRNcRrIACULIpAbDKcdcMPWldIDI1DT7/Sb+fStVsZra6tpmiuba4iKSRSKSGRlPKsCCCDyCKYENAHZfAj4YxfFj4h2/hm8uHis44mub54z83lKQML6EsyjPbOe1edmuNeAwbqJa7L1PruCOHI8UZ/DCVG1TScp235VbRebbSv0vc99/sX9nQan/wAKt/4VOP7S+3fY/sn9mj7R5X/P3527d5O35t+7PbGeK+U9pnHJ9Z9t7tr3vpf+W3fpa1vkfuX1PgD6x/Y39n/vefk5eT3+X/n7z3v7O2vNzX6W5tDwH48fDOL4TfES48M2k7yWckS3Ni8h+bymJGG9SGVlz3xnvX1WV414/CKq1rs/VH4Zxtw3HhfPp4Sm26bSlBvfld9H5ppq/W1zhNc40W8IHP2WT/0E13yvZnya3P6QdD064lsv3mk4kIBKsd2fzr8OdOy2P0JVNdyx/ZN9/wBC8v5LWXLL+U19pHufzgV+8n5uFABQAUAFABQB+ulfvB/H51fwU8beH/ht8SNP8feIdKlvl0jzLmytI1BWS7VGMG/LKQgl2MxBzheATXFmWHrYvA1KFJ2c1y37Ju0vny3t52PRyjE4bBZnSxFeLlGD5rK2rjrFa9HJR5v7t9HsegaT+0x4BuNI0mz1r4bHS5NLvNRhA0OeaVWsdQtpIrk7rueRxMrlZEGdhy2ducnx6uR4nnnyVbqUYr3klaVOSlT0jFJrdS62ta+y+ko8U4Nxpurh+WUKrmuVyd1Ui4VbucpNSfuSjbS6d0t3Q034xfC3wk3hXRfD0Ov32m6Rb6xa6tc3tnBbzyR38XlF4UWWRVZFJIVmwSB83PG1XLsdivbyq8sXNU+WzbSdOTnrdRum7bLa+mmvNQzfK8vWEjh+eapVKspOSjFtVIQh7qUpWaUXu97O+tlzPxL8W+ANR8E+G/A/gKbWJ49ElvnuLvV7KKAzGd42BVI5ZNuAhBBY/U547MJh8YsZUxFdRXNGKSi27crle7aX83b/ADfnZhisueWUcJhXN8k6km5JRvzxppWSlLbkd9ezvrZaPhvxz8JdZ8D+HvDPxMfxDaz+GL64ktX0SygnS9glkWQxOZZozCwYN84DjDfd45mrh8fRx08RheV88YpqTas43s1ZO6s9VptuOhicrxOVRwWNc48k5STgoyupqCcWpSjZrkupXe7vHQ29F+P/AIM1PWvEOufEK3v7mz1nX7vUn8LHRbS9tJvOHAWeV1ls5BwDNEGYhV44xXBUyfE0sJSo4drmhBRU+aUZJrrZJqSvrySsr311PYpcRYKtmdfE4pS9nUqc7p8kJxlH+VuTThK3u+0jd26aEXin9oHRtf8AAQs7C7ubHVX8N2ujXNlF4T00xyxwpHGWOoH/AEnayRg+Xt4bgPgAVtSyqpTxznJKUHUdS/PNNNvmtyL3G1LrfbdXOeef0Z5ZGnFuNSNL2VlTptNaxv7V/vFeLs0k9dpK5yfxW8W+C/iB4u8Q+NrFtUhub/Uo5NNt5baPy/JKkSGVhISrghNoUMCC2SMDPZl+GxODw9KjKzS5uZ3fV3VtNd3e9ulrnl5njMHmGIqV1zJ2pqKsre7FRlza6be7a9+tjHvYfh6tzqg03UdZaFbdDorT2UStJLlN4nAkIRceZgqWJIXIGTjpi8Zyx5lG93zav4dbW01e107LfXa/HJZf7SVpS5eVcuivz2jdPXSN+azV3bl01dsauk4z50/4Kb/8kF0j/sb7f/0luq+S4y/5FcP8a/8ASZH6R4X/API/q/8AXqX/AKXA+IZpYzoNtCJFLrdzsy55AKxYOPfB/I1+a9D946lSkBu+GPih8S/BVg+leDfiJrukWskxlkttM1ea3jaQgAuVRgC2FUZ64UelKyYGRqGoX+rX8+q6rfTXN1czNLc3NxKXklkYks7MeWYkkknkk0wIaAOy+BHxOi+E/wAQ7fxNeW7y2ckTW18kY+bymIOV9SGVTjvjHevOzXBPH4R009d16n13BPEkeF8+hi6ibptOM7b8rtqvNNJ262se/wD9ufs3fb/+Fn/8LPj/ALS+3/bftv8AaX+lbP8An28rG7ydvy+Xtzjvnmvk/ZZzyfVvZe7a1raf4r7X63v+B+5/XfD32/8AbH19e15+fm5/3lv+ffJbm9nb3eTlvbrfU8A+O/xOj+LHxDuPE1nA8VnHEttYpIPm8pSTlvQlmY47Zx2r6zKsE8Bg1Te+79T8L424jjxRn88XTTVNJRhfflV9X5ttu3S9jg9c/wCQLef9esn/AKCa9CXws+TW5/S74dtEkRtsuABx82MivxG2jufdK9zV22f96T86yvDzK5ZH8y9fuh8EFABQAUAAz3NABQB+nuk/tJ/s/wCs6ZBqtv8AGbwzElxEsix3etwQyqCM4ZHcMjeoIBFfs1POMqqQUlWir95JP7m7n8t1uGeIaNWVN4So2nbSEmvk0mmvNFn/AIaB+Av/AEW3wj/4Utr/APHKv+1cr/5/w/8AAo/5mf8Aq9n/AP0CVf8AwXP/ACD/AIaB+Av/AEW3wj/4Utr/APHKP7Vyv/n/AA/8Cj/mH+r2f/8AQJV/8Fz/AMg/4aB+Av8A0W3wj/4Utr/8co/tXK/+f8P/AAKP+Yf6vZ//ANAlX/wXP/IP+GgfgL/0W3wj/wCFLa//AByj+1cr/wCf8P8AwKP+Yf6vZ/8A9AlX/wAFz/yD/hoH4C/9Ft8I/wDhS2v/AMco/tXK/wDn/D/wKP8AmH+r2f8A/QJV/wDBc/8AIP8AhoH4C/8ARbfCP/hS2v8A8co/tXK/+f8AD/wKP+Yf6vZ//wBAlX/wXP8AyD/hoH4C/wDRbfCP/hS2v/xyj+1cr/5/w/8AAo/5h/q9n/8A0CVf/Bc/8g/4aB+Av/RbfCP/AIUtr/8AHKP7Vyv/AJ/w/wDAo/5h/q9n/wD0CVf/AAXP/IP+GgfgL/0W3wj/AOFLa/8Axyj+1cr/AOf8P/Ao/wCYf6vZ/wD9AlX/AMFz/wAg/wCGgfgL/wBFt8I/+FLa/wDxyj+1cr/5/wAP/Ao/5h/q9n//AECVf/Bc/wDI+fP+Cifxj+FvjP4V6P4S8G+PdK1i+PiFLt49KvkuFjiSCZCWaMkKd0q4BOTzjoa+V4szDBYjBQpUqik+a+jT0Sa6ep+h+HGS5rgs2q4jE0ZQjyOPvJxu3KL0Ts3on6fM+PK+AP2UKACgAPHNAAOeaACgABB6UbgFAFXXP+QLecf8usn/AKCamXwsa3P6V9FceSBDMMqBuU+lfiE5K2h95FO5u+fa/wCRWVy+U/ExP+CEX/BWg/e/ZCmH/c9+H/8A5YV+4e3pnwXIx3/DiD/grJ/0aNL/AOF34f8A/lhR7emHJIP+HEH/AAVk/wCjRpf/AAu/D/8A8sKPb0w5JB/w4g/4Kyf9GjS/+F34f/8AlhR7emHJIP8AhxB/wVk/6NGl/wDC78P/APywo9vTDkkH/DiD/grJ/wBGjS/+F34f/wDlhR7emHJIP+HEH/BWT/o0aX/wu/D/AP8ALCj29MOSQf8ADiD/AIKyf9GjS/8Ahd+H/wD5YUe3phySD/hxB/wVk/6NGl/8Lvw//wDLCj29MOSQf8OIP+Csv/Ro0v8A4Xfh/wD+WFHt6YckgH/BCD/grL/0aLL/AOF34f8A/lhR7emHJIP+HEH/AAVk/wCjRpf/AAu/D/8A8sKPb0w5JB/w4g/4Kyf9GjS/+F34f/8AlhR7emHJIP8AhxB/wVk/6NGl/wDC78P/APywo9vTDkkH/DiD/grJ/wBGjS/+F34f/wDlhR7emHJIP+HEH/BWX/o0WX/wu/D/AP8ALCj29MOSQf8ADiD/AIKyf9GjS/8Ahd+H/wD5YUe3phySD/hxB/wVk/6NGl/8Lvw//wDLCj29MOSQf8OIP+Csn/Ro0v8A4Xfh/wD+WFHt6fcOSQf8OIP+Csn/AEaNL/4Xfh//AOWFHt6fcOSQf8OH/wDgrLn/AJNHl/8AC68P/wDywo9vT7hySD/hxB/wVk/6NGl/8Lvw/wD/ACwp+3p9w5JB/wAOIP8AgrJ/0aNL/wCF34f/APlhS9tS7hySGn/ghD/wVp3cfsiyY/7Hvw//APJ9J1qbDkYn/Dh//grQD8v7IsmO/wDxXfh//wCWFL21PuHIx4/4IQf8FZe/7I8v/hdeH/8A5YU1WpoOSRz3xc/4Iuf8FOPhZ8KPE/xO8ffsuyafoXhzw9e6prV+fGehy/ZrS3geWaXZFfM77URm2orMcYAJwKbrU2rIFBpn7UKfFEduZ4bayit0cK8rtypPsB0r8ExVTF2alaPZ7/gfomHjh21u2ankeJ/7lt/3zXm/V8x/5/8A/kp1c+E/59v7z6kr9/PzYKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAPFv8AgpIcf8E7Pj4T/wBEW8U/+mi6prcDyLwWYPEWl2PiHw9fSJbTxrMomjYb1Izyrcg/Wvx6pC6utD7pe5Jxkdf/AKR/ejrOzFp2Z9L1+yHwwUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAeLf8ABSP/AJR2/Hv/ALIt4p/9NF1TW4PY8og/5JxJ/wBeg/lX47V/g/I+6p/x/mcPXkHtH//Z"},72158:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-add-user-dialog-4a76a1d5811db1f477173c3c1fabb43a.jpg"},59556:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-arrange-displays-c6b7dca4d418eed7a79be42eabbab2d1.png"},36198:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-background-right-click-296958d96e0cd78b4bd122538368baf6.jpg"},77101:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-background-section-ca69ba209a6e21b75235377cfe37096a.jpg"},71955:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-background-selection-2b69c07e0327d086c99d3925edefd0de.jpg"},53885:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-configuring-default-applications-c38e8846a0f5406e2a929ceed630e0ac.jpg"},56935:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-date-and-time-aa3c32f3601912751b47792bed13d861.jpg"},24798:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-display-confirm-73e76e471778f250fce7a77b06ebf4cc.jpg"},51729:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-display-right-click-0e3734d006161e208d66f1dbbfd5b284.jpg"},20241:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-displays-overview-6bbedd44653525b6c3aba838cf30349d.jpg"},94287:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-individual-display-settings-2d5ef78b2175bb97fc2e729a90ee5774.jpg"},41361:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-keep-files-prompt-5b7532e8ea1cf62ad466bf6d2eec702f.jpg"},19580:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-mouse-settings-4652630acfe19020bb0b29d0155bf012.jpg"},81379:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-multiple-user-settings-e0957ed6affeef47726232f6fa2c22a0.jpg"},62778:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-nautilus-desktop-folder-d8e82c2d25e2d637fc2f63e85241c255.jpg"},49755:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-network-authentication-306d93017ccbe74f3760db30ad3be13c.jpg"},36258:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-network-hidden-0567bce591f6219bb35378032a3db3e9.jpg"},13917:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-network-overview-56ca62f1ff834202f557968bddfe6ae8.jpg"},19750:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-network-select-b153e6a0d6a6394708fd70d376d84dc9.jpg"},72964:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-open-with-right-click-f8c5019ecbc6f6cb589c6117c20c85b4.jpg"},72191:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-open-with-select-application-7c831e8489c82c5ac4df9f3bd5a85644.jpg"},39324:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-region-and-languages-newlang-4bb2078c2e13e3b57093c6b6c8b68695.jpg"},92266:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-region-and-languages-335dc9a1b149e6ee8b31960b2786e80f.jpg"},5623:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-selecting-language-search-0ef7ad4ad481eba3511f505c0d48dd64.png"},45905:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-selecting-language-1b584e15820bf752584efc6dd7b15aeb.png"},51215:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-single-user-settings-39514927d322f1eae5e257384a82106b.jpg"},31401:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-sound-settings-83f0c82715b44956569594953085dad1.jpg"},12837:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-top-panel-keyboard-layout-c727398da89fe9a7bbae669ab07699d7.jpg"},41694:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-top-panel-network-click-23903f435151287556210b48a2731783.jpg"},27121:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-top-panel-right-click-10a13ee21a2ed1ad21315bfdd76e4041.jpg"},62903:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-touchpad-settings-ee9690f056a1ed39ebddd5cd61936608.jpg"},8338:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-tweak-tool-desktop-46f30603727af27af46f394d0df8f07e.jpg"},94202:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-tweak-tool-top-bar-212f1978bc9194fbe0d5a1f49da0ef38.jpg"},44483:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/gnome-volume-control-fc9ad5c29a7859a4532adde7ed56df46.jpg"},36663:(e,n,i)=>{i.d(n,{Z:()=>t});const t=i.p+"assets/images/workspace-shortcuts-gcc-f4f5e863caf0c2532f4d3cbc633b5f8a.jpg"},11151:(e,n,i)=>{i.d(n,{Z:()=>d,a:()=>a});var t=i(67294);const o={},s=t.createContext(o);function a(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fb8d634e.d61ceef3.js b/assets/js/fb8d634e.0e14772e.js similarity index 97% rename from assets/js/fb8d634e.d61ceef3.js rename to assets/js/fb8d634e.0e14772e.js index 31c5d69db..12814d34f 100644 --- a/assets/js/fb8d634e.d61ceef3.js +++ b/assets/js/fb8d634e.0e14772e.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[999],{86591:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var i=t(85893),o=t(11151);const s={title:"GNOME",summary:"A quick introduction to the GNOME Edition of Solus"},r="GNOME Shell",c={id:"user/editions/gnome/index",title:"GNOME",description:"GNOME Shell is provided by default with the GNOME Edition of Solus. They describe it as:",source:"@site/docs/user/editions/gnome/index.md",sourceDirName:"user/editions/gnome",slug:"/user/editions/gnome/",permalink:"/docs/user/editions/gnome/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/gnome/index.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"GNOME",summary:"A quick introduction to the GNOME Edition of Solus"},sidebar:"userSidebar",previous:{title:"Tips and Tricks",permalink:"/docs/user/editions/budgie/tips-and-tricks"},next:{title:"Configuration",permalink:"/docs/user/editions/gnome/configuration"}},d={},l=[];function a(e){const n={a:"a",blockquote:"blockquote",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"gnome-shell",children:"GNOME Shell"})}),"\n",(0,i.jsx)(n.p,{children:"GNOME Shell is provided by default with the GNOME Edition of Solus. They describe it as:"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Provides core interface functions like switching windows, launching applications or see your notifications. It takes advantage of the capabilities of modern graphics hardware and introduces innovative user interface concepts to provide a delightful and easy to use experience. GNOME Shell is the defining technology of the GNOME 3 user experience."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Here are some links related to this project that you may find helpful:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://www.gnome.org/",children:"Homepage"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://thisweek.gnome.org/",children:"News"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://help.gnome.org/users/gnome-help/stable/",children:"Support"})}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"configuration",children:"Go to GNOME Configuration"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"tips-and-tricks",children:"Go to GNOME Tips and Tricks"})})]})}function u(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>r});var i=t(67294);const o={},s=i.createContext(o);function r(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[999],{86591:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var i=t(85893),o=t(11151);const s={title:"GNOME",summary:"A quick introduction to the GNOME Edition of Solus"},r="GNOME Shell",c={id:"user/editions/gnome/index",title:"GNOME",description:"GNOME Shell is provided by default with the GNOME Edition of Solus. They describe it as:",source:"@site/docs/user/editions/gnome/index.md",sourceDirName:"user/editions/gnome",slug:"/user/editions/gnome/",permalink:"/docs/user/editions/gnome/",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/editions/gnome/index.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"GNOME",summary:"A quick introduction to the GNOME Edition of Solus"},sidebar:"userSidebar",previous:{title:"Tips and Tricks",permalink:"/docs/user/editions/budgie/tips-and-tricks"},next:{title:"Configuration",permalink:"/docs/user/editions/gnome/configuration"}},d={},l=[];function a(e){const n={a:"a",blockquote:"blockquote",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"gnome-shell",children:"GNOME Shell"})}),"\n",(0,i.jsx)(n.p,{children:"GNOME Shell is provided by default with the GNOME Edition of Solus. They describe it as:"}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Provides core interface functions like switching windows, launching applications or see your notifications. It takes advantage of the capabilities of modern graphics hardware and introduces innovative user interface concepts to provide a delightful and easy to use experience. GNOME Shell is the defining technology of the GNOME 3 user experience."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Here are some links related to this project that you may find helpful:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://www.gnome.org/",children:"Homepage"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://thisweek.gnome.org/",children:"News"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://help.gnome.org/users/gnome-help/stable/",children:"Support"})}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"configuration",children:"Go to GNOME Configuration"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"tips-and-tricks",children:"Go to GNOME Tips and Tricks"})})]})}function u(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>r});var i=t(67294);const o={},s=i.createContext(o);function r(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fc733b73.9d462a0e.js b/assets/js/fc733b73.108abd58.js similarity index 99% rename from assets/js/fc733b73.9d462a0e.js rename to assets/js/fc733b73.108abd58.js index 763e34e8f..d75cbf919 100644 --- a/assets/js/fc733b73.9d462a0e.js +++ b/assets/js/fc733b73.108abd58.js @@ -1 +1 @@ -"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6042],{28537:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>a});var s=t(85893),o=t(11151);const i={title:"R and RStudio",summary:"Quick start guide for R and RStudio on Solus"},r="R and RStudio",l={id:"user/software/development/r-and-rstudio",title:"R and RStudio",description:"Covers the basics of how to install R and RStudio on Solus and how to install required dependencies for installing additional CRAN libraries.",source:"@site/docs/user/software/development/r-and-rstudio.md",sourceDirName:"user/software/development",slug:"/user/software/development/r-and-rstudio",permalink:"/docs/user/software/development/r-and-rstudio",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/r-and-rstudio.md",tags:[],version:"current",lastUpdatedAt:1731532839e3,frontMatter:{title:"R and RStudio",summary:"Quick start guide for R and RStudio on Solus"},sidebar:"userSidebar",previous:{title:"PostgreSQL",permalink:"/docs/user/software/development/postgresql"},next:{title:"Rust",permalink:"/docs/user/software/development/rust"}},d={},a=[{value:"Downloading R",id:"downloading-r",level:2},{value:"Downloading RStudio",id:"downloading-rstudio",level:2},{value:"How to use install.packages() on Solus",id:"how-to-use-installpackages-on-solus",level:3}];function c(e){const n={code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"r-and-rstudio",children:"R and RStudio"})}),"\n",(0,s.jsx)(n.p,{children:"Covers the basics of how to install R and RStudio on Solus and how to install required dependencies for installing additional CRAN libraries."}),"\n",(0,s.jsx)(n.h2,{id:"downloading-r",children:"Downloading R"}),"\n",(0,s.jsxs)(n.p,{children:["It is recommended to download R before downloading RStudio. This can be accomplished easily in any of three ways.\n",(0,s.jsx)(n.strong,{children:"NOTE:"})," Both R and RStudio are available natively on Solus thanks to their amazing maintainers, it is not necessary to go to either software's respective website."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:['The easiest way to do this is to search for "R" within the ',(0,s.jsx)(n.strong,{children:"Software Center"})]}),"\n",(0,s.jsxs)(n.li,{children:["Alternatively you can enter the ",(0,s.jsx)(n.strong,{children:"Software Center"}),", select ",(0,s.jsx)(n.strong,{children:"Programming Languages & Tools"}),", then select ",(0,s.jsx)(n.strong,{children:"Programming"})," and scroll down until you see ",(0,s.jsx)(n.strong,{children:"r"}),". ",(0,s.jsx)(n.em,{children:"The list itself is in alphabetical order so it will be near the bottom."})]}),"\n",(0,s.jsxs)(n.li,{children:["The third option for installation is to open your terminal and enter the command ",(0,s.jsx)(n.code,{children:"sudo eopkg it r"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"downloading-rstudio",children:"Downloading RStudio"}),"\n",(0,s.jsx)(n.p,{children:"The first step in setting up RStudio is to download and install it. This can be accomplished in the same ways as R in the prior step."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:['The easiest way to do this is to search for "RStudio" within the ',(0,s.jsx)(n.strong,{children:"Software Center"})]}),"\n",(0,s.jsxs)(n.li,{children:["Alternatively you can enter the ",(0,s.jsx)(n.strong,{children:"Software Center"}),", select ",(0,s.jsx)(n.strong,{children:"Programming Languages & Tools"}),", then select ",(0,s.jsx)(n.strong,{children:"Integrated Development Environments"})," and scroll down until you see ",(0,s.jsx)(n.strong,{children:"RStudio"}),". ",(0,s.jsx)(n.em,{children:"The list itself is in alphabetical order so it will be near the bottom."})]}),"\n",(0,s.jsxs)(n.li,{children:["The third option for installation is to open your terminal and enter the command ",(0,s.jsx)(n.code,{children:"sudo eopkg it rstudio"})]}),"\n"]}),"\n",(0,s.jsxs)(n.h3,{id:"how-to-use-installpackages-on-solus",children:["How to use ",(0,s.jsx)(n.code,{children:"install.packages()"})," on Solus"]}),"\n",(0,s.jsxs)(n.p,{children:["Unless you are only going to use base R functions, you will need to make use of ",(0,s.jsx)(n.code,{children:"install.packages()"})," within R to install additional libraries. To use this function you need to install certain development packages which vary depending on the library you are trying to enable within R."]}),"\n",(0,s.jsx)(n.p,{children:"On other Linux distros (like Debian, Ubuntu, and Fedora) this is accomplished through the installation of r-devel. However since Solus does not have an r-devel package these dependencies have to be installed through other means."}),"\n",(0,s.jsxs)(n.p,{children:["There are three main Solus packages that will include many of the dependencies required that allow you to install most CRAN packages. These are ",(0,s.jsx)(n.code,{children:"system.devel"}),", ",(0,s.jsx)(n.code,{children:"curl-devel"})," and ",(0,s.jsx)(n.code,{children:"fontconfig-devel"}),"."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"system.devel"})," is a component containing several packages and can ",(0,s.jsx)(n.strong,{children:"ONLY"})," be installed from within a terminal by running the command ",(0,s.jsx)(n.code,{children:"sudo eopkg it -c system.devel"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"curl-devel"})," and ",(0,s.jsx)(n.code,{children:"fontconfig-devel"})," can be found by searching in the ",(0,s.jsx)(n.strong,{children:"Software Center"})," or by running the command ",(0,s.jsx)(n.code,{children:"sudo eopkg it curl-devel fontconfig-devel"})]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Once these two Solus packages are installed ",(0,s.jsx)(n.code,{children:"install.packages()"})," will work as usual within R for most packages like ",(0,s.jsx)(n.code,{children:"tidyverse"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["If you try to install a CRAN library with ",(0,s.jsx)(n.code,{children:"install.packages()"})," from within R and you are presented with an error that says ",(0,s.jsx)(n.code,{children:"...exited with non zero exit status"})," this is most likely because one of the required dependencies, ",(0,s.jsx)(n.em,{children:"which will be listed within the R console detailing the error"}),", is contained within a Solus devel package you have not yet installed."]})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>r});var s=t(67294);const o={},i=s.createContext(o);function r(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[6042],{28537:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>a});var s=t(85893),o=t(11151);const i={title:"R and RStudio",summary:"Quick start guide for R and RStudio on Solus"},r="R and RStudio",l={id:"user/software/development/r-and-rstudio",title:"R and RStudio",description:"Covers the basics of how to install R and RStudio on Solus and how to install required dependencies for installing additional CRAN libraries.",source:"@site/docs/user/software/development/r-and-rstudio.md",sourceDirName:"user/software/development",slug:"/user/software/development/r-and-rstudio",permalink:"/docs/user/software/development/r-and-rstudio",draft:!1,unlisted:!1,editUrl:"https://github.com/getsolus/help-center-docs/tree/master/docs/user/software/development/r-and-rstudio.md",tags:[],version:"current",lastUpdatedAt:1732070401e3,frontMatter:{title:"R and RStudio",summary:"Quick start guide for R and RStudio on Solus"},sidebar:"userSidebar",previous:{title:"PostgreSQL",permalink:"/docs/user/software/development/postgresql"},next:{title:"Rust",permalink:"/docs/user/software/development/rust"}},d={},a=[{value:"Downloading R",id:"downloading-r",level:2},{value:"Downloading RStudio",id:"downloading-rstudio",level:2},{value:"How to use install.packages() on Solus",id:"how-to-use-installpackages-on-solus",level:3}];function c(e){const n={code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"r-and-rstudio",children:"R and RStudio"})}),"\n",(0,s.jsx)(n.p,{children:"Covers the basics of how to install R and RStudio on Solus and how to install required dependencies for installing additional CRAN libraries."}),"\n",(0,s.jsx)(n.h2,{id:"downloading-r",children:"Downloading R"}),"\n",(0,s.jsxs)(n.p,{children:["It is recommended to download R before downloading RStudio. This can be accomplished easily in any of three ways.\n",(0,s.jsx)(n.strong,{children:"NOTE:"})," Both R and RStudio are available natively on Solus thanks to their amazing maintainers, it is not necessary to go to either software's respective website."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:['The easiest way to do this is to search for "R" within the ',(0,s.jsx)(n.strong,{children:"Software Center"})]}),"\n",(0,s.jsxs)(n.li,{children:["Alternatively you can enter the ",(0,s.jsx)(n.strong,{children:"Software Center"}),", select ",(0,s.jsx)(n.strong,{children:"Programming Languages & Tools"}),", then select ",(0,s.jsx)(n.strong,{children:"Programming"})," and scroll down until you see ",(0,s.jsx)(n.strong,{children:"r"}),". ",(0,s.jsx)(n.em,{children:"The list itself is in alphabetical order so it will be near the bottom."})]}),"\n",(0,s.jsxs)(n.li,{children:["The third option for installation is to open your terminal and enter the command ",(0,s.jsx)(n.code,{children:"sudo eopkg it r"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"downloading-rstudio",children:"Downloading RStudio"}),"\n",(0,s.jsx)(n.p,{children:"The first step in setting up RStudio is to download and install it. This can be accomplished in the same ways as R in the prior step."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:['The easiest way to do this is to search for "RStudio" within the ',(0,s.jsx)(n.strong,{children:"Software Center"})]}),"\n",(0,s.jsxs)(n.li,{children:["Alternatively you can enter the ",(0,s.jsx)(n.strong,{children:"Software Center"}),", select ",(0,s.jsx)(n.strong,{children:"Programming Languages & Tools"}),", then select ",(0,s.jsx)(n.strong,{children:"Integrated Development Environments"})," and scroll down until you see ",(0,s.jsx)(n.strong,{children:"RStudio"}),". ",(0,s.jsx)(n.em,{children:"The list itself is in alphabetical order so it will be near the bottom."})]}),"\n",(0,s.jsxs)(n.li,{children:["The third option for installation is to open your terminal and enter the command ",(0,s.jsx)(n.code,{children:"sudo eopkg it rstudio"})]}),"\n"]}),"\n",(0,s.jsxs)(n.h3,{id:"how-to-use-installpackages-on-solus",children:["How to use ",(0,s.jsx)(n.code,{children:"install.packages()"})," on Solus"]}),"\n",(0,s.jsxs)(n.p,{children:["Unless you are only going to use base R functions, you will need to make use of ",(0,s.jsx)(n.code,{children:"install.packages()"})," within R to install additional libraries. To use this function you need to install certain development packages which vary depending on the library you are trying to enable within R."]}),"\n",(0,s.jsx)(n.p,{children:"On other Linux distros (like Debian, Ubuntu, and Fedora) this is accomplished through the installation of r-devel. However since Solus does not have an r-devel package these dependencies have to be installed through other means."}),"\n",(0,s.jsxs)(n.p,{children:["There are three main Solus packages that will include many of the dependencies required that allow you to install most CRAN packages. These are ",(0,s.jsx)(n.code,{children:"system.devel"}),", ",(0,s.jsx)(n.code,{children:"curl-devel"})," and ",(0,s.jsx)(n.code,{children:"fontconfig-devel"}),"."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"system.devel"})," is a component containing several packages and can ",(0,s.jsx)(n.strong,{children:"ONLY"})," be installed from within a terminal by running the command ",(0,s.jsx)(n.code,{children:"sudo eopkg it -c system.devel"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"curl-devel"})," and ",(0,s.jsx)(n.code,{children:"fontconfig-devel"})," can be found by searching in the ",(0,s.jsx)(n.strong,{children:"Software Center"})," or by running the command ",(0,s.jsx)(n.code,{children:"sudo eopkg it curl-devel fontconfig-devel"})]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Once these two Solus packages are installed ",(0,s.jsx)(n.code,{children:"install.packages()"})," will work as usual within R for most packages like ",(0,s.jsx)(n.code,{children:"tidyverse"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["If you try to install a CRAN library with ",(0,s.jsx)(n.code,{children:"install.packages()"})," from within R and you are presented with an error that says ",(0,s.jsx)(n.code,{children:"...exited with non zero exit status"})," this is most likely because one of the required dependencies, ",(0,s.jsx)(n.em,{children:"which will be listed within the R console detailing the error"}),", is contained within a Solus devel package you have not yet installed."]})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>r});var s=t(67294);const o={},i=s.createContext(o);function r(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fe13418f.ea789d98.js b/assets/js/fe13418f.ea789d98.js new file mode 100644 index 000000000..950951398 --- /dev/null +++ b/assets/js/fe13418f.ea789d98.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[1182],{43900:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>r});var a=n(85893),l=n(11151);const o={title:"Clean, clean, clean!",slug:"clean-clean-clean",authors:"alfi",tags:["housekeeping","cleanup","devlog","solus"],hide_table_of_contents:!1},s=void 0,i={permalink:"/blog/clean-clean-clean",source:"@site/devlog/2024-11-21-clean-cleanl-clean.md",title:"Clean, clean, clean!",description:"Hello everyone! Alfi here, member of Solus Cleanup Crew. It's been more than a year since I started contributing to Solus and I want to talk about it. About what I did, what we did, what we accomplished so far, and what we want to do next.",date:"2024-11-21T00:00:00.000Z",tags:[{inline:!0,label:"housekeeping",permalink:"/blog/tags/housekeeping"},{inline:!0,label:"cleanup",permalink:"/blog/tags/cleanup"},{inline:!0,label:"devlog",permalink:"/blog/tags/devlog"},{inline:!0,label:"solus",permalink:"/blog/tags/solus"}],readingTime:5.585,hasTruncateMarker:!0,authors:[{name:"Muhammad Alfi Syahrin",title:"Solus Staff",page:{permalink:"/blog/authors/alfi"},socials:{github:"https://github.com/malfisya"},imageURL:"https://avatars.githubusercontent.com/u/101771435",key:"alfi"}],frontMatter:{title:"Clean, clean, clean!",slug:"clean-clean-clean",authors:"alfi",tags:["housekeeping","cleanup","devlog","solus"],hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"Intro to Optimizing Packages on Solus",permalink:"/blog/solus-optimizing-packages"}},c={authorsImageUrls:[void 0]},r=[];function u(e){const t={p:"p",...(0,l.a)(),...e.components};return(0,a.jsx)(t.p,{children:"Hello everyone! Alfi here, member of Solus Cleanup Crew. It's been more than a year since I started contributing to Solus and I want to talk about it. About what I did, what we did, what we accomplished so far, and what we want to do next."})}function p(e={}){const{wrapper:t}={...(0,l.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(u,{...e})}):u(e)}},11151:(e,t,n)=>{n.d(t,{Z:()=>i,a:()=>s});var a=n(67294);const l={},o=a.createContext(l);function s(e){const t=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:s(e.components),a.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.30095a43.js b/assets/js/main.30095a43.js deleted file mode 100644 index b763a7692..000000000 --- a/assets/js/main.30095a43.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.30095a43.js.LICENSE.txt */ -(self.webpackChunksolus_help_center=self.webpackChunksolus_help_center||[]).push([[179],{78179:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});n(67294);var r=n(68356),o=n.n(r),a=n(16887);const i={"0058b4c6":[()=>n.e(4088).then(n.t.bind(n,66462,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-175.json",66462],"01a85c17":[()=>Promise.all([n.e(3312),n.e(4013)]).then(n.bind(n,53282)),"@theme/BlogTagsListPage",53282],"04b18502":[()=>n.e(1942).then(n.bind(n,37123)),"@site/docs/packaging/index.md",37123],"05767842":[()=>n.e(1606).then(n.t.bind(n,77755,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-authors-joey-023.json",77755],"06758c2b":[()=>n.e(1073).then(n.t.bind(n,81885,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-optimization-150.json",81885],"080a8349":[()=>n.e(224).then(n.bind(n,92857)),"@site/docs/packaging/monitoring.yml.md",92857],"08bef15d":[()=>n.e(7228).then(n.bind(n,40846)),"@site/docs/user/privacy.md",40846],"09dbd43b":[()=>n.e(9397).then(n.bind(n,78118)),"@site/docs/user/troubleshooting/boot-rescue.md",78118],"0b254e3a":[()=>n.e(6726).then(n.bind(n,99528)),"@site/docs/packaging/updating-an-existing-package.md",99528],"0b85ec06":[()=>n.e(3398).then(n.t.bind(n,22844,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-pgo-777.json",22844],"0cfc9369":[()=>n.e(6025).then(n.t.bind(n,82504,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-lto-304.json",82504],"0e3c5e6b":[()=>n.e(4859).then(n.bind(n,5166)),"@site/docs/user/editions/plasma/index.md",5166],"0e862883":[()=>n.e(172).then(n.bind(n,24673)),"@site/docs/user/contributing/testing-an-iso.md",24673],"14488e92":[()=>n.e(4815).then(n.bind(n,93980)),"@site/docs/user/quick-start/default-applications.md",93980],"14eb3368":[()=>Promise.all([n.e(3312),n.e(9817)]).then(n.bind(n,31745)),"@theme/DocCategoryGeneratedIndexPage",31745],"156eae2c":[()=>n.e(8692).then(n.t.bind(n,92354,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-networking-814.json",92354],17896441:[()=>Promise.all([n.e(3312),n.e(6937),n.e(7918)]).then(n.bind(n,11095)),"@theme/DocItem",11095],"1a698c37":[()=>Promise.all([n.e(3323),n.e(8917),n.e(6126)]).then(n.bind(n,99870)),"@site/docs/user/editions/index.mdx",99870],"1ae709a2":[()=>n.e(355).then(n.bind(n,49332)),"@site/docs/user/package-management/history-and-rollback.md",49332],"1b835d51":[()=>n.e(532).then(n.t.bind(n,769,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-3-b1c.json",769],"1df93b7f":[()=>Promise.all([n.e(3323),n.e(3237)]).then(n.bind(n,20780)),"@site/src/pages/index.tsx",20780],21944812:[()=>n.e(9873).then(n.bind(n,43042)),"@site/docs/user/software/desktops/index.md",43042],"257b9082":[()=>n.e(3192).then(n.bind(n,31874)),"@site/docs/user/software/development/containers.md",31874],"2598a3a5":[()=>n.e(5951).then(n.bind(n,70197)),"@site/docs/user/editions/mate/configuration.md",70197],"2609550e":[()=>n.e(3206).then(n.bind(n,23394)),"@site/docs/user/software/networking/samba.md",23394],"26308ea3":[()=>Promise.all([n.e(3312),n.e(6937),n.e(6485)]).then(n.bind(n,85612)),"@site/docs/packaging/submitting-a-pull-request.mdx",85612],"27d71881":[()=>n.e(7577).then(n.t.bind(n,19511,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-package-management-681.json",19511],"2a0f90eb":[()=>n.e(2817).then(n.t.bind(n,98247,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-solus-558.json",98247],"2a34ce22":[()=>n.e(6074).then(n.bind(n,21974)),"@site/docs/user/quick-start/installation/system-requirements.md",21974],"2a37c7d8":[()=>n.e(9995).then(n.bind(n,81754)),"@site/docs/user/editions/plasma/tips-and-tricks.md",81754],"2a9c4f4d":[()=>n.e(9474).then(n.t.bind(n,75994,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-clang-1c6.json",75994],"2b4abe09":[()=>n.e(2413).then(n.bind(n,45427)),"@site/docs/user/troubleshooting/index.md",45427],"2b61a93c":[()=>n.e(9897).then(n.bind(n,23065)),"@site/docs/user/editions/mate/index.md",23065],"2c3e84bd":[()=>n.e(8157).then(n.bind(n,12359)),"@site/docs/user/quick-start/installation/disks.md",12359],"334da572":[()=>n.e(5900).then(n.t.bind(n,70542,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-mobile-306.json",70542],"33f669c7":[()=>n.e(5854).then(n.t.bind(n,50536,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-software-1ab.json",50536],"33fc5bb8":[()=>Promise.all([n.e(3312),n.e(6937),n.e(5966),n.e(6614),n.e(8355)]).then(n.bind(n,37678)),"@theme/Blog/Pages/BlogAuthorsPostsPage",37678],"36994c47":[()=>n.e(9208).then(n.t.bind(n,94468,19)),"@generated/docusaurus-plugin-content-blog/default/__plugin.json",94468],"38920c38":[()=>n.e(5481).then(n.bind(n,50)),"@site/docs/user/hardware/peripherals/printers-and-scanners.md",50],"3a2db09e":[()=>n.e(9361).then(n.t.bind(n,57588,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-df9.json",57588],"3a93f7ba":[()=>n.e(7422).then(n.t.bind(n,76972,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-hwcaps-8b3.json",76972],"3bd0a7e9":[()=>n.e(247).then(n.t.bind(n,60032,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-advanced-configuration-b1b.json",60032],"3fdfc7ff":[()=>n.e(4608).then(n.bind(n,57884)),"@site/docs/user/package-management/basics.md",57884],"3ff05326":[()=>n.e(2775).then(n.bind(n,17430)),"@site/docs/packaging/package.yml.md",17430],"418a6276":[()=>n.e(6160).then(n.bind(n,71697)),"@site/devlog/2024-01-19-eopkg-is-dead.md?truncated=true",71697],"41a4de91":[()=>n.e(7682).then(n.bind(n,31593)),"@site/docs/user/software/third-party/index.md",31593],"424f562c":[()=>n.e(3122).then(n.bind(n,15054)),"@site/devlog/2024-02-09-Intro-to-optimizing-packages-on-solus.md?truncated=true",15054],"439d6d8d":[()=>n.e(4374).then(n.t.bind(n,4915,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-mate-495.json",4915],"43d43a8f":[()=>n.e(9156).then(n.t.bind(n,5410,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-localization-3b5.json",5410],"45e9d313":[()=>n.e(6114).then(n.bind(n,47124)),"@site/docs/packaging/testing-a-package.md",47124],"46a65d96":[()=>n.e(8092).then(n.bind(n,82758)),"@site/docs/user/package-management/repo-management.md",82758],"47b97f63":[()=>n.e(834).then(n.t.bind(n,54517,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-compatibility-048.json",54517],"4802fa93":[()=>n.e(1774).then(n.bind(n,48815)),"@site/devlog/2024-01-29-dont-call-me-mate.md",48815],"49b71c16":[()=>n.e(3783).then(n.bind(n,99937)),"@site/docs/packaging/packaging-practices.md",99937],"4e87380c":[()=>n.e(2585).then(n.t.bind(n,68801,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-gnu-f4d.json",68801],"513b6405":[()=>n.e(4278).then(n.bind(n,38033)),"@site/docs/packaging/prepare-for-packaging.md",38033],"528b6a6b":[()=>n.e(7822).then(n.bind(n,61661)),"@site/docs/user/software/utilities/ksysguard.md",61661],"533eefa9":[()=>n.e(4002).then(n.bind(n,99023)),"@site/docs/user/quick-start/installation/index.md",99023],"5685b4d8":[()=>n.e(1540).then(n.bind(n,17599)),"@site/docs/user/editions/xfce/configuration.md",17599],"5b7f3753":[()=>n.e(6413).then(n.bind(n,47512)),"@site/docs/packaging/git-basics.md",47512],"5e95c892":[()=>n.e(9661).then(n.bind(n,14399)),"@theme/DocsRoot",14399],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,36809)),"@generated/docusaurus.config",36809],"5efe994e":[()=>n.e(1598).then(n.t.bind(n,83532,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-llvm-8d1.json",83532],"5f194406":[()=>n.e(7607).then(n.bind(n,77882)),"@site/docs/user/contributing/community-guidelines.md",77882],"6146d358":[()=>n.e(7798).then(n.t.bind(n,90800,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-contributing-e4f.json",90800],"61c953b4":[()=>n.e(8032).then(n.bind(n,18421)),"@site/docs/packaging/procedures/maintainership.md",18421],"621db11d":[()=>Promise.all([n.e(3312),n.e(5966),n.e(3940)]).then(n.bind(n,44995)),"@theme/Blog/Pages/BlogAuthorsListPage",44995],"62d70de2":[()=>n.e(818).then(n.t.bind(n,5230,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-virtualization-413.json",5230],"633d53d7":[()=>n.e(425).then(n.t.bind(n,30080,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-procedures-1dc.json",30080],64699048:[()=>n.e(2151).then(n.bind(n,87063)),"@site/docs/user/software/development/index.md",87063],"6787574e":[()=>n.e(4500).then(n.bind(n,26240)),"@site/docs/user/intro.md",26240],"6873f895":[()=>n.e(8849).then(n.bind(n,83781)),"@site/docs/user/contributing/style.md",83781],"6875c492":[()=>Promise.all([n.e(3312),n.e(6937),n.e(5966),n.e(6614),n.e(8610)]).then(n.bind(n,23966)),"@theme/BlogTagsPostsPage",23966],"6cfe09a0":[()=>n.e(1174).then(n.bind(n,67189)),"@site/docs/user/software/networking/tigervnc.md",67189],"7071adf5":[()=>n.e(4796).then(n.bind(n,31386)),"@site/docs/packaging/troubleshooting-packaging.md",31386],"72054e31":[()=>n.e(7135).then(n.bind(n,83888)),"@site/devlog/2024-02-09-Intro-to-optimizing-packages-on-solus.md",83888],"72f2f84e":[()=>n.e(794).then(n.t.bind(n,23343,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-utilities-bb8.json",23343],"74470af4":[()=>n.e(1896).then(n.bind(n,5893)),"@site/docs/user/software/virtualization/virtualbox.md",5893],"75c41d11":[()=>n.e(3337).then(n.bind(n,75584)),"@site/docs/user/editions/xfce/tips-and-tricks.md",75584],"793c86b2":[()=>n.e(168).then(n.bind(n,41426)),"@site/docs/user/software/command-line/index.md",41426],"7a24477a":[()=>n.e(9135).then(n.bind(n,44308)),"@site/docs/user/contributing/getting-involved.md",44308],"7b0bdf40":[()=>n.e(29).then(n.t.bind(n,56548,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-eopkg-20b.json",56548],"7c1fb106":[()=>n.e(4605).then(n.bind(n,66334)),"@site/docs/packaging/appstream-metainfo.md",66334],"7c2abd66":[()=>n.e(586).then(n.t.bind(n,19739,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-moss-7c4.json",19739],"7e4100d6":[()=>n.e(6990).then(n.bind(n,18193)),"@site/docs/user/software/networking/wireshark.md",18193],"814f3328":[()=>n.e(2535).then(n.t.bind(n,45641,19)),"~blog/default/blog-post-list-prop-default.json",45641],"8490a22d":[()=>n.e(8575).then(n.bind(n,5734)),"@site/docs/packaging/advanced-config/local-repository.md",5734],"88a83a8c":[()=>n.e(1242).then(n.bind(n,65574)),"@site/docs/user/software/utilities/kwallet.md",65574],"8d193990":[()=>n.e(1539).then(n.bind(n,5436)),"@site/devlog/2024-01-19-eopkg-is-dead.md",5436],"8e3d5b32":[()=>n.e(8499).then(n.bind(n,15838)),"@site/docs/user/software/localization/ibus.md",15838],"8e861970":[()=>n.e(8026).then(n.bind(n,95751)),"@site/docs/packaging/procedures/request-a-package.md",95751],"8e886580":[()=>n.e(4978).then(n.bind(n,71137)),"@site/docs/user/software/development/rust.md",71137],"920ec10a":[()=>n.e(4725).then(n.t.bind(n,63438,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-glibc-23b.json",63438],"9284d474":[()=>n.e(7626).then(n.bind(n,8110)),"@site/docs/user/software/gaming/index.md",8110],"947d9ca4":[()=>n.e(1944).then(n.bind(n,10025)),"@site/docs/user/software/development/web.md",10025],"9485dea6":[()=>n.e(2358).then(n.bind(n,29421)),"@site/docs/user/hardware/compatibility/wifi.md",29421],"96af6484":[()=>n.e(6225).then(n.bind(n,53058)),"@site/docs/user/hardware/peripherals/mice-and-touchpads.md",53058],"97c623e4":[()=>n.e(6427).then(n.bind(n,42268)),"@site/docs/packaging/procedures/request-a-package-update.md",42268],"99bedda9":[()=>n.e(8639).then(n.bind(n,48345)),"@site/docs/user/hardware/index.md",48345],"9b400668":[()=>n.e(7670).then(n.t.bind(n,20767,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-x-86-64-v-3-dc8.json",20767],"9e4087bc":[()=>n.e(3608).then(n.bind(n,8635)),"@theme/BlogArchivePage",8635],a05bfad9:[()=>n.e(885).then(n.bind(n,12620)),"@site/docs/user/editions/budgie/tips-and-tricks.md",12620],a398ef57:[()=>n.e(2586).then(n.bind(n,45523)),"@site/docs/user/hardware/mobile/apple.md",45523],a52026b8:[()=>n.e(7862).then(n.bind(n,19253)),"@site/devlog/2024-01-13-welcome-devlog.md?truncated=true",19253],a6aa9e1f:[()=>Promise.all([n.e(3312),n.e(6937),n.e(5966),n.e(6614),n.e(3089)]).then(n.bind(n,33587)),"@theme/BlogListPage",33587],a7456010:[()=>n.e(5980).then(n.t.bind(n,79365,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",79365],a7bd4aaa:[()=>n.e(8518).then(n.bind(n,89615)),"@theme/DocVersionRoot",89615],a94703ab:[()=>Promise.all([n.e(3312),n.e(4368)]).then(n.bind(n,59779)),"@theme/DocRoot",59779],a9e19215:[()=>n.e(333).then(n.bind(n,71371)),"@site/docs/user/software/networking/xrdp.md",71371],ab89b7a6:[()=>n.e(5575).then(n.bind(n,83016)),"@site/docs/user/editions/xfce/index.md",83016],aba21aa0:[()=>n.e(3629).then(n.t.bind(n,41765,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",41765],acecf23e:[()=>n.e(7393).then(n.t.bind(n,81838,19)),"~blog/default/blogMetadata-default.json",81838],ad205e99:[()=>n.e(1617).then(n.bind(n,38491)),"@site/docs/packaging/stack-rebuilds.md",38491],b4302412:[()=>n.e(2081).then(n.bind(n,55892)),"@site/docs/user/editions/gnome/tips-and-tricks.md",55892],b6ca4f35:[()=>n.e(9214).then(n.t.bind(n,27983,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-packaging-55a.json",27983],baa66232:[()=>n.e(984).then(n.bind(n,17789)),"@site/docs/user/software/camera/droidcam.md",17789],baf1b6e8:[()=>n.e(9677).then(n.bind(n,14864)),"@site/docs/user/software/development/java.md",14864],be4ac66b:[()=>n.e(4869).then(n.bind(n,87190)),"@site/docs/user/hardware/compatibility/laptops.md",87190],be79d003:[()=>n.e(6012).then(n.bind(n,62262)),"@site/docs/packaging/update-dev-environment.md",62262],c15d9823:[()=>n.e(6642).then(n.t.bind(n,92506,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-bd9.json",92506],c55c138b:[()=>n.e(7465).then(n.bind(n,76323)),"@site/docs/packaging/packaging-changes.md",76323],c5de29d4:[()=>n.e(3851).then(n.bind(n,44158)),"@site/docs/packaging/creating-a-new-package.md",44158],c99ea947:[()=>n.e(7018).then(n.t.bind(n,7768,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-camera-f25.json",7768],c9c1a3f4:[()=>n.e(6121).then(n.bind(n,24080)),"@site/docs/user/editions/budgie/configuration.md",24080],cca891e2:[()=>n.e(9773).then(n.bind(n,7857)),"@site/docs/packaging/procedures/package-inclusion.md",7857],ccc49370:[()=>Promise.all([n.e(3312),n.e(6937),n.e(5966),n.e(6614),n.e(6103)]).then(n.bind(n,88987)),"@theme/BlogPostPage",88987],ce4855c1:[()=>n.e(3440).then(n.bind(n,66855)),"@site/docs/packaging/translation-instructions.md",66855],cec10a63:[()=>n.e(8422).then(n.bind(n,96928)),"@site/docs/user/editions/plasma/configuration.md",96928],d00f7e62:[()=>n.e(255).then(n.bind(n,67868)),"@site/docs/packaging/your-first-package-update.md",67868],d0d2faf6:[()=>n.e(4507).then(n.bind(n,79267)),"@site/docs/packaging/procedures/release-processes.md",79267],d4762887:[()=>n.e(3624).then(n.bind(n,1108)),"@site/docs/user/troubleshooting/installation.md",1108],d5670106:[()=>n.e(1950).then(n.bind(n,60908)),"@site/docs/user/troubleshooting/plasma.md",60908],d9c798e8:[()=>n.e(807).then(n.t.bind(n,37275,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-peripherals-173.json",37275],da62f019:[()=>n.e(1821).then(n.t.bind(n,98171,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-quick-start-1ee.json",98171],dabd6b33:[()=>n.e(1059).then(n.bind(n,37101)),"@site/docs/packaging/advanced-config/eopkg-configuration.md",37101],ddc41e4a:[()=>n.e(9451).then(n.bind(n,3619)),"@site/docs/user/software/sound/index.md",3619],e083e94b:[()=>n.e(3056).then(n.bind(n,83514)),"@site/docs/user/software/third-party/snap.md",83514],e4134e95:[()=>n.e(8621).then(n.t.bind(n,80700,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-devlog-dac.json",80700],e5595530:[()=>n.e(1648).then(n.bind(n,4183)),"@site/docs/user/quick-start/boot-management.md",4183],ea6d9109:[()=>n.e(812).then(n.t.bind(n,88930,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-web-23c.json",88930],eb074ba1:[()=>n.e(3705).then(n.bind(n,45247)),"@site/docs/user/software/configuration_files.md",45247],ec4e4367:[()=>n.e(4529).then(n.bind(n,76130)),"@site/docs/user/hardware/mobile/android.md",76130],ecdeb26c:[()=>n.e(1971).then(n.bind(n,35247)),"@site/devlog/2024-01-29-dont-call-me-mate.md?truncated=true",35247],ed2a5927:[()=>n.e(4560).then(n.bind(n,18653)),"@site/docs/user/quick-start/software-center/index.md",18653],ef8b811a:[()=>n.e(2644).then(n.t.bind(n,89441,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-authors-790.json",89441],f0629c21:[()=>n.e(3375).then(n.bind(n,53126)),"@site/docs/user/software/web/obs.md",53126],f1d13e1b:[()=>n.e(5462).then(n.bind(n,16467)),"@site/docs/user/editions/mate/tips-and-tricks.md",16467],f32bcb79:[()=>n.e(6515).then(n.t.bind(n,15631,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-firstpost-ddd.json",15631],f35b91b6:[()=>n.e(9749).then(n.bind(n,78677)),"@site/devlog/2024-01-13-welcome-devlog.md",78677],f3d58343:[()=>n.e(8812).then(n.t.bind(n,11741,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-authors-david-9d9.json",11741],f4aa4739:[()=>n.e(9170).then(n.bind(n,75340)),"@site/docs/user/editions/budgie/index.md",75340],f4c9601b:[()=>n.e(2595).then(n.bind(n,39910)),"@site/docs/user/quick-start/installation/secure-boot.md",39910],f6faa2b4:[()=>n.e(8143).then(n.bind(n,40396)),"@site/docs/user/hardware/peripherals/midi-keyboard.md",40396],f81c1134:[()=>n.e(4031).then(n.t.bind(n,4108,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-archive-f05.json",4108],f82cd581:[()=>n.e(8626).then(n.t.bind(n,56664,19)),"@generated/docusaurus-plugin-content-blog/default/p/blog-tags-hello-f96.json",56664],f8dd8223:[()=>n.e(7212).then(n.bind(n,4606)),"@site/docs/user/software/development/postgresql.md",4606],fb6dc457:[()=>n.e(5482).then(n.bind(n,77123)),"@site/docs/user/editions/gnome/configuration.md",77123],fb8d634e:[()=>n.e(999).then(n.bind(n,86591)),"@site/docs/user/editions/gnome/index.md",86591],fc733b73:[()=>n.e(6042).then(n.bind(n,28537)),"@site/docs/user/software/development/r-and-rstudio.md",28537]};var s=n(85893);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(44151),u=n(13736);function d(e,t){if("*"===e)return o()({loading:l,loader:()=>n.e(7734).then(n.bind(n,57734)),modules:["@theme/NotFound"],webpack:()=>[57734],render(e,t){const n=e.default;return(0,s.jsx)(u.z,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},p=[],f=[],g=(0,c.Z)(r);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),o().Map({loading:l,loader:d,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;delete o.__context;const l=o.__props;return delete o.__props,(0,s.jsx)(u.z,{value:i,children:(0,s.jsx)(a,{...o,...l,...n})})}})}const p=[{path:"/blog",component:d("/blog","cba"),exact:!0},{path:"/blog/archive",component:d("/blog/archive","182"),exact:!0},{path:"/blog/authors",component:d("/blog/authors","0b7"),exact:!0},{path:"/blog/authors/david",component:d("/blog/authors/david","386"),exact:!0},{path:"/blog/authors/joey",component:d("/blog/authors/joey","979"),exact:!0},{path:"/blog/don't-call-me-mate-pal",component:d("/blog/don't-call-me-mate-pal","4cd"),exact:!0},{path:"/blog/eopkg-is-dead-long-live-eopkg",component:d("/blog/eopkg-is-dead-long-live-eopkg","a0e"),exact:!0},{path:"/blog/solus-optimizing-packages",component:d("/blog/solus-optimizing-packages","3c8"),exact:!0},{path:"/blog/tags",component:d("/blog/tags","287"),exact:!0},{path:"/blog/tags/3",component:d("/blog/tags/3","2ba"),exact:!0},{path:"/blog/tags/clang",component:d("/blog/tags/clang","7cb"),exact:!0},{path:"/blog/tags/devlog",component:d("/blog/tags/devlog","e8c"),exact:!0},{path:"/blog/tags/eopkg",component:d("/blog/tags/eopkg","a41"),exact:!0},{path:"/blog/tags/firstpost",component:d("/blog/tags/firstpost","c48"),exact:!0},{path:"/blog/tags/glibc",component:d("/blog/tags/glibc","1b5"),exact:!0},{path:"/blog/tags/gnu",component:d("/blog/tags/gnu","94b"),exact:!0},{path:"/blog/tags/hello",component:d("/blog/tags/hello","d49"),exact:!0},{path:"/blog/tags/hwcaps",component:d("/blog/tags/hwcaps","6d6"),exact:!0},{path:"/blog/tags/llvm",component:d("/blog/tags/llvm","aff"),exact:!0},{path:"/blog/tags/lto",component:d("/blog/tags/lto","24f"),exact:!0},{path:"/blog/tags/mate",component:d("/blog/tags/mate","e08"),exact:!0},{path:"/blog/tags/moss",component:d("/blog/tags/moss","e04"),exact:!0},{path:"/blog/tags/optimization",component:d("/blog/tags/optimization","535"),exact:!0},{path:"/blog/tags/packaging",component:d("/blog/tags/packaging","07c"),exact:!0},{path:"/blog/tags/pgo",component:d("/blog/tags/pgo","a42"),exact:!0},{path:"/blog/tags/solus",component:d("/blog/tags/solus","873"),exact:!0},{path:"/blog/tags/x-86-64-v-3",component:d("/blog/tags/x-86-64-v-3","716"),exact:!0},{path:"/blog/welcome-solus-devlog-v1",component:d("/blog/welcome-solus-devlog-v1","418"),exact:!0},{path:"/docs",component:d("/docs","49b"),routes:[{path:"/docs",component:d("/docs","ef0"),routes:[{path:"/docs",component:d("/docs","861"),routes:[{path:"/docs/category/advanced-configuration",component:d("/docs/category/advanced-configuration","21a"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/category/camera",component:d("/docs/category/camera","eec"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/compatibility",component:d("/docs/category/compatibility","41d"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/contributing",component:d("/docs/category/contributing","524"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/localization",component:d("/docs/category/localization","976"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/mobile",component:d("/docs/category/mobile","8b8"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/networking",component:d("/docs/category/networking","2c7"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/package-management",component:d("/docs/category/package-management","540"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/peripherals",component:d("/docs/category/peripherals","b31"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/procedures",component:d("/docs/category/procedures","59d"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/category/quick-start",component:d("/docs/category/quick-start","16b"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/software",component:d("/docs/category/software","5c6"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/utilities",component:d("/docs/category/utilities","7bd"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/virtualization",component:d("/docs/category/virtualization","cd2"),exact:!0,sidebar:"userSidebar"},{path:"/docs/category/web",component:d("/docs/category/web","f03"),exact:!0,sidebar:"userSidebar"},{path:"/docs/packaging/",component:d("/docs/packaging/","9dd"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/advanced-config/eopkg-configuration",component:d("/docs/packaging/advanced-config/eopkg-configuration","4fb"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/advanced-config/local-repository",component:d("/docs/packaging/advanced-config/local-repository","092"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/appstream-metainfo",component:d("/docs/packaging/appstream-metainfo","901"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/creating-a-new-package",component:d("/docs/packaging/creating-a-new-package","551"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/git-basics",component:d("/docs/packaging/git-basics","d3f"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/monitoring.yml",component:d("/docs/packaging/monitoring.yml","cee"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/package.yml",component:d("/docs/packaging/package.yml","612"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/packaging-changes",component:d("/docs/packaging/packaging-changes","872"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/packaging-practices",component:d("/docs/packaging/packaging-practices","b60"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/prepare-for-packaging",component:d("/docs/packaging/prepare-for-packaging","88f"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/procedures/maintainership",component:d("/docs/packaging/procedures/maintainership","111"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/procedures/package-inclusion",component:d("/docs/packaging/procedures/package-inclusion","008"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/procedures/release-processes",component:d("/docs/packaging/procedures/release-processes","755"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/procedures/request-a-package",component:d("/docs/packaging/procedures/request-a-package","488"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/procedures/request-a-package-update",component:d("/docs/packaging/procedures/request-a-package-update","293"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/stack-rebuilds",component:d("/docs/packaging/stack-rebuilds","c7e"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/submitting-a-pull-request",component:d("/docs/packaging/submitting-a-pull-request","b81"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/testing-a-package",component:d("/docs/packaging/testing-a-package","e13"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/translation-instructions",component:d("/docs/packaging/translation-instructions","d32"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/troubleshooting-packaging",component:d("/docs/packaging/troubleshooting-packaging","713"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/update-dev-environment",component:d("/docs/packaging/update-dev-environment","661"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/updating-an-existing-package",component:d("/docs/packaging/updating-an-existing-package","531"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/packaging/your-first-package-update",component:d("/docs/packaging/your-first-package-update","26e"),exact:!0,sidebar:"packagingSidebar"},{path:"/docs/user/contributing/community-guidelines",component:d("/docs/user/contributing/community-guidelines","520"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/contributing/getting-involved",component:d("/docs/user/contributing/getting-involved","abf"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/contributing/style",component:d("/docs/user/contributing/style","202"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/contributing/testing-an-iso",component:d("/docs/user/contributing/testing-an-iso","d78"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/",component:d("/docs/user/editions/","275"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/budgie/",component:d("/docs/user/editions/budgie/","4e4"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/budgie/configuration",component:d("/docs/user/editions/budgie/configuration","4f7"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/budgie/tips-and-tricks",component:d("/docs/user/editions/budgie/tips-and-tricks","358"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/gnome/",component:d("/docs/user/editions/gnome/","ac6"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/gnome/configuration",component:d("/docs/user/editions/gnome/configuration","bc6"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/gnome/tips-and-tricks",component:d("/docs/user/editions/gnome/tips-and-tricks","d2d"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/mate/",component:d("/docs/user/editions/mate/","468"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/mate/configuration",component:d("/docs/user/editions/mate/configuration","1b0"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/mate/tips-and-tricks",component:d("/docs/user/editions/mate/tips-and-tricks","cd1"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/plasma/",component:d("/docs/user/editions/plasma/","a67"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/plasma/configuration",component:d("/docs/user/editions/plasma/configuration","8a4"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/plasma/tips-and-tricks",component:d("/docs/user/editions/plasma/tips-and-tricks","82b"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/xfce/",component:d("/docs/user/editions/xfce/","802"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/xfce/configuration",component:d("/docs/user/editions/xfce/configuration","3f1"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/editions/xfce/tips-and-tricks",component:d("/docs/user/editions/xfce/tips-and-tricks","cb8"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/",component:d("/docs/user/hardware/","61a"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/compatibility/laptops",component:d("/docs/user/hardware/compatibility/laptops","f9e"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/compatibility/wifi",component:d("/docs/user/hardware/compatibility/wifi","b71"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/mobile/android",component:d("/docs/user/hardware/mobile/android","542"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/mobile/apple",component:d("/docs/user/hardware/mobile/apple","640"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/peripherals/mice-and-touchpads",component:d("/docs/user/hardware/peripherals/mice-and-touchpads","787"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/peripherals/midi-keyboard",component:d("/docs/user/hardware/peripherals/midi-keyboard","763"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/hardware/peripherals/printers-and-scanners",component:d("/docs/user/hardware/peripherals/printers-and-scanners","925"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/intro",component:d("/docs/user/intro","7fc"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/package-management/basics",component:d("/docs/user/package-management/basics","8dd"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/package-management/history-and-rollback",component:d("/docs/user/package-management/history-and-rollback","b37"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/package-management/repo-management",component:d("/docs/user/package-management/repo-management","f74"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/privacy",component:d("/docs/user/privacy","451"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/quick-start/boot-management",component:d("/docs/user/quick-start/boot-management","fc5"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/quick-start/default-applications",component:d("/docs/user/quick-start/default-applications","c6a"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/quick-start/installation/",component:d("/docs/user/quick-start/installation/","cd1"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/quick-start/installation/disks",component:d("/docs/user/quick-start/installation/disks","266"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/quick-start/installation/secure-boot",component:d("/docs/user/quick-start/installation/secure-boot","d90"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/quick-start/installation/system-requirements",component:d("/docs/user/quick-start/installation/system-requirements","35d"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/quick-start/software-center/",component:d("/docs/user/quick-start/software-center/","085"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/camera/droidcam",component:d("/docs/user/software/camera/droidcam","b1e"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/command-line/",component:d("/docs/user/software/command-line/","958"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/configuration_files",component:d("/docs/user/software/configuration_files","fcf"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/desktops/",component:d("/docs/user/software/desktops/","d43"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/development/",component:d("/docs/user/software/development/","d23"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/development/containers",component:d("/docs/user/software/development/containers","e29"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/development/java",component:d("/docs/user/software/development/java","342"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/development/postgresql",component:d("/docs/user/software/development/postgresql","408"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/development/r-and-rstudio",component:d("/docs/user/software/development/r-and-rstudio","747"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/development/rust",component:d("/docs/user/software/development/rust","0b7"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/development/web",component:d("/docs/user/software/development/web","66a"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/gaming/",component:d("/docs/user/software/gaming/","1b3"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/localization/ibus",component:d("/docs/user/software/localization/ibus","d11"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/networking/samba",component:d("/docs/user/software/networking/samba","b11"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/networking/tigervnc",component:d("/docs/user/software/networking/tigervnc","f76"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/networking/wireshark",component:d("/docs/user/software/networking/wireshark","2e9"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/networking/xrdp",component:d("/docs/user/software/networking/xrdp","573"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/sound/",component:d("/docs/user/software/sound/","f00"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/third-party/",component:d("/docs/user/software/third-party/","05b"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/third-party/snap",component:d("/docs/user/software/third-party/snap","cf3"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/utilities/ksysguard",component:d("/docs/user/software/utilities/ksysguard","315"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/utilities/kwallet",component:d("/docs/user/software/utilities/kwallet","b7f"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/virtualization/virtualbox",component:d("/docs/user/software/virtualization/virtualbox","e07"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/software/web/obs",component:d("/docs/user/software/web/obs","266"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/troubleshooting/",component:d("/docs/user/troubleshooting/","91a"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/troubleshooting/boot-rescue",component:d("/docs/user/troubleshooting/boot-rescue","5b1"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/troubleshooting/installation",component:d("/docs/user/troubleshooting/installation","439"),exact:!0,sidebar:"userSidebar"},{path:"/docs/user/troubleshooting/plasma",component:d("/docs/user/troubleshooting/plasma","a6c"),exact:!0,sidebar:"userSidebar"}]}]}]},{path:"/",component:d("/","e5f"),exact:!0},{path:"*",component:d("*")}]},72278:(e,t,n)=>{var r,o;!function(){var a,i,s,l,c,u,d,p,f,g,m,h,b,y,v,w,k,S,_,x,E,O,P,j,C,T,I,A,N,L,R=function(e){var t=new R.Builder;return t.pipeline.add(R.trimmer,R.stopWordFilter,R.stemmer),t.searchPipeline.add(R.stemmer),e.call(t,t),t.build()};R.version="2.3.9",R.utils={},R.utils.warn=(a=this,function(e){a.console&&console.warn&&console.warn(e)}),R.utils.asString=function(e){return null==e?"":e.toString()},R.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r0){var l=R.utils.clone(t)||{};l.position=[i,s],l.index=o.length,o.push(new R.Token(n.slice(i,a),l))}i=a+1}}return o},R.tokenizer.separator=/[\s\-]+/,R.Pipeline=function(){this._stack=[]},R.Pipeline.registeredFunctions=Object.create(null),R.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&R.utils.warn("Overwriting existing registered function: "+t),e.label=t,R.Pipeline.registeredFunctions[e.label]=e},R.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||R.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},R.Pipeline.load=function(e){var t=new R.Pipeline;return e.forEach((function(e){var n=R.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)})),t},R.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach((function(e){R.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},R.Pipeline.prototype.after=function(e,t){R.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},R.Pipeline.prototype.before=function(e,t){R.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},R.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},R.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(ae&&(n=o),a!=e);)r=n-t,o=t+Math.floor(r/2),a=this.elements[2*o];return a==e||a>e?2*o:as?c+=2:i==s&&(t+=n[l+1]*r[c+1],l+=2,c+=2);return t},R.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},R.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var a,i=o.str.charAt(0);i in o.node.edges?a=o.node.edges[i]:(a=new R.TokenSet,o.node.edges[i]=a),1==o.str.length&&(a.final=!0),r.push({node:a,editsRemaining:o.editsRemaining,str:o.str.slice(1)})}if(0!=o.editsRemaining){if("*"in o.node.edges)var s=o.node.edges["*"];else{s=new R.TokenSet;o.node.edges["*"]=s}if(0==o.str.length&&(s.final=!0),r.push({node:s,editsRemaining:o.editsRemaining-1,str:o.str}),o.str.length>1&&r.push({node:o.node,editsRemaining:o.editsRemaining-1,str:o.str.slice(1)}),1==o.str.length&&(o.node.final=!0),o.str.length>=1){if("*"in o.node.edges)var l=o.node.edges["*"];else{l=new R.TokenSet;o.node.edges["*"]=l}1==o.str.length&&(l.final=!0),r.push({node:l,editsRemaining:o.editsRemaining-1,str:o.str.slice(1)})}if(o.str.length>1){var c,u=o.str.charAt(0),d=o.str.charAt(1);d in o.node.edges?c=o.node.edges[d]:(c=new R.TokenSet,o.node.edges[d]=c),1==o.str.length&&(c.final=!0),r.push({node:c,editsRemaining:o.editsRemaining-1,str:u+o.str.slice(2)})}}}return n},R.TokenSet.fromString=function(e){for(var t=new R.TokenSet,n=t,r=0,o=e.length;r=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},R.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},R.Index.prototype.search=function(e){return this.query((function(t){new R.QueryParser(e,t).parse()}))},R.Index.prototype.query=function(e){for(var t=new R.Query(this.fields),n=Object.create(null),r=Object.create(null),o=Object.create(null),a=Object.create(null),i=Object.create(null),s=0;s1?1:e},R.Builder.prototype.k1=function(e){this._k1=e},R.Builder.prototype.add=function(e,t){var n=e[this._ref],r=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var o=0;o=this.length)return R.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},R.QueryLexer.prototype.width=function(){return this.pos-this.start},R.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},R.QueryLexer.prototype.backup=function(){this.pos-=1},R.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=R.QueryLexer.EOS&&this.backup()},R.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(R.QueryLexer.TERM)),e.ignore(),e.more())return R.QueryLexer.lexText},R.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(R.QueryLexer.EDIT_DISTANCE),R.QueryLexer.lexText},R.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(R.QueryLexer.BOOST),R.QueryLexer.lexText},R.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(R.QueryLexer.TERM)},R.QueryLexer.termSeparator=R.tokenizer.separator,R.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==R.QueryLexer.EOS)return R.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return R.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(R.QueryLexer.TERM),R.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(R.QueryLexer.TERM),R.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(R.QueryLexer.PRESENCE),R.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(R.QueryLexer.PRESENCE),R.QueryLexer.lexText;if(t.match(R.QueryLexer.termSeparator))return R.QueryLexer.lexTerm}else e.escapeCharacter()}},R.QueryParser=function(e,t){this.lexer=new R.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},R.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=R.QueryParser.parseClause;e;)e=e(this);return this.query},R.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},R.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},R.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},R.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case R.QueryLexer.PRESENCE:return R.QueryParser.parsePresence;case R.QueryLexer.FIELD:return R.QueryParser.parseField;case R.QueryLexer.TERM:return R.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new R.QueryParseError(n,t.start,t.end)}},R.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=R.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=R.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new R.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(null==r){n="expecting term or field, found nothing";throw new R.QueryParseError(n,t.start,t.end)}switch(r.type){case R.QueryLexer.FIELD:return R.QueryParser.parseField;case R.QueryLexer.TERM:return R.QueryParser.parseTerm;default:n="expecting term or field, found '"+r.type+"'";throw new R.QueryParseError(n,r.start,r.end)}}},R.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new R.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var o=e.peekLexeme();if(null==o){r="expecting term, found nothing";throw new R.QueryParseError(r,t.start,t.end)}if(o.type===R.QueryLexer.TERM)return R.QueryParser.parseTerm;r="expecting term, found '"+o.type+"'";throw new R.QueryParseError(r,o.start,o.end)}},R.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(null!=n)switch(n.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new R.QueryParseError(r,n.start,n.end)}else e.nextClause()}},R.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new R.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var o=e.peekLexeme();if(null!=o)switch(o.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+o.type+"'";throw new R.QueryParseError(r,o.start,o.end)}else e.nextClause()}},R.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new R.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var o=e.peekLexeme();if(null!=o)switch(o.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+o.type+"'";throw new R.QueryParseError(r,o.start,o.end)}else e.nextClause()}},void 0===(o="function"==typeof(r=function(){return R})?r.call(t,n,t,e):r)||(e.exports=o)}()},3681:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>i});var r=n(67294),o=n(85893);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},43205:(e,t,n)=>{"use strict";var r=n(67294),o=n(20745),a=n(70405),i=n(73727),s=n(36809),l=n(29629);const c=[n(73369),n(87213),n(98356),n(47257)];var u=n(78179),d=n(16550),p=n(18790),f=n(85893);function g(e){let{children:t}=e;return(0,f.jsx)(f.Fragment,{children:t})}var m=n(79722),h=n(75276),b=n(23466),y=n(39581),v=n(96984),w=n(76862),k=n(95099),S=n(90356),_=n(48820),x=n(62362);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,h.Z)(),r=(0,w.l)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,f.jsxs)(m.Z,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,f.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,f.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function O(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.Z)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,h.Z)(),{pathname:r}=(0,d.TH)();return e+(0,_.Do)((0,b.ZP)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,f.jsxs)(m.Z,{children:[(0,f.jsx)("meta",{property:"og:url",content:o}),(0,f.jsx)("link",{rel:"canonical",href:o})]})}function P(){const{i18n:{currentLocale:e}}=(0,h.Z)(),{metadata:t,image:n}=(0,y.L)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(m.Z,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:k.h})]}),n&&(0,f.jsx)(v.d,{image:n}),(0,f.jsx)(O,{}),(0,f.jsx)(E,{}),(0,f.jsx)(x.Z,{tag:S.H,locale:e}),(0,f.jsx)(m.Z,{children:t.map(((e,t)=>(0,f.jsx)("meta",{...e},t)))})]})}const j=new Map;var C=n(3681),T=n(1124),I=n(1290);function A(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,I.Z)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),A("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function L(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,p.f)(u.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class R extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?A("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=A("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),L(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,f.jsx)(N,{previousLocation:this.previousLocation,location:t,children:(0,f.jsx)(d.AW,{location:t,render:()=>e})})}}const D=R,F="__docusaurus-base-url-issue-banner-container",M="__docusaurus-base-url-issue-banner",B="__docusaurus-base-url-issue-banner-suggestion-container";function z(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${F}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{let{route:t}=e;return!0===t.exact})))return j.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return j.set(e.pathname,t),{...e,pathname:t}}((0,d.TH)());return(0,f.jsx)(D,{location:e,children:Z})}function G(){return(0,f.jsx)(q.Z,{children:(0,f.jsx)(T.M,{children:(0,f.jsxs)(C.t,{children:[(0,f.jsxs)(g,{children:[(0,f.jsx)(H,{}),(0,f.jsx)(P,{}),(0,f.jsx)($,{}),(0,f.jsx)(W,{})]}),(0,f.jsx)(Q,{})]})})})}var Y=n(16887);const K=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var X=n(44151);const J=new Set,ee=new Set,te=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ne={prefetch:e=>{if(!(e=>!te()&&!ee.has(e)&&!J.has(e))(e))return!1;J.add(e);const t=(0,p.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(Y).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,X.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?K(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!te()&&!ee.has(e))(e)&&(ee.add(e),L(e))},re=Object.freeze(ne);function oe(e){let{children:t}=e;return"hash"===s.default.future.experimental_router?(0,f.jsx)(i.UT,{children:t}):(0,f.jsx)(i.VK,{children:t})}const ae=Boolean(!0);if(l.Z.canUseDOM){window.docusaurus=re;const e=document.getElementById("__docusaurus"),t=(0,f.jsx)(a.B6,{children:(0,f.jsx)(oe,{children:(0,f.jsx)(G,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(ae)window.docusaurusRoot=o.hydrateRoot(e,t,{onRecoverableError:n});else{const r=o.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};L(window.location.pathname).then((()=>{(0,r.startTransition)(i)}))}},1124:(e,t,n)=>{"use strict";n.d(t,{_:()=>d,M:()=>p});var r=n(67294),o=n(36809);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"user/intro","docs":[{"id":"packaging/advanced-config/eopkg-configuration","path":"/docs/packaging/advanced-config/eopkg-configuration","sidebar":"packagingSidebar"},{"id":"packaging/advanced-config/local-repository","path":"/docs/packaging/advanced-config/local-repository","sidebar":"packagingSidebar"},{"id":"packaging/appstream-metainfo","path":"/docs/packaging/appstream-metainfo","sidebar":"packagingSidebar"},{"id":"packaging/creating-a-new-package","path":"/docs/packaging/creating-a-new-package","sidebar":"packagingSidebar"},{"id":"packaging/git-basics","path":"/docs/packaging/git-basics","sidebar":"packagingSidebar"},{"id":"packaging/index","path":"/docs/packaging/","sidebar":"packagingSidebar"},{"id":"packaging/monitoring.yml","path":"/docs/packaging/monitoring.yml","sidebar":"packagingSidebar"},{"id":"packaging/package.yml","path":"/docs/packaging/package.yml","sidebar":"packagingSidebar"},{"id":"packaging/packaging-changes","path":"/docs/packaging/packaging-changes","sidebar":"packagingSidebar"},{"id":"packaging/packaging-practices","path":"/docs/packaging/packaging-practices","sidebar":"packagingSidebar"},{"id":"packaging/prepare-for-packaging","path":"/docs/packaging/prepare-for-packaging","sidebar":"packagingSidebar"},{"id":"packaging/procedures/maintainership","path":"/docs/packaging/procedures/maintainership","sidebar":"packagingSidebar"},{"id":"packaging/procedures/package-inclusion","path":"/docs/packaging/procedures/package-inclusion","sidebar":"packagingSidebar"},{"id":"packaging/procedures/release-processes","path":"/docs/packaging/procedures/release-processes","sidebar":"packagingSidebar"},{"id":"packaging/procedures/request-a-package","path":"/docs/packaging/procedures/request-a-package","sidebar":"packagingSidebar"},{"id":"packaging/procedures/request-a-package-update","path":"/docs/packaging/procedures/request-a-package-update","sidebar":"packagingSidebar"},{"id":"packaging/stack-rebuilds","path":"/docs/packaging/stack-rebuilds","sidebar":"packagingSidebar"},{"id":"packaging/submitting-a-pull-request","path":"/docs/packaging/submitting-a-pull-request","sidebar":"packagingSidebar"},{"id":"packaging/testing-a-package","path":"/docs/packaging/testing-a-package","sidebar":"packagingSidebar"},{"id":"packaging/translation-instructions","path":"/docs/packaging/translation-instructions","sidebar":"packagingSidebar"},{"id":"packaging/troubleshooting-packaging","path":"/docs/packaging/troubleshooting-packaging","sidebar":"packagingSidebar"},{"id":"packaging/update-dev-environment","path":"/docs/packaging/update-dev-environment","sidebar":"packagingSidebar"},{"id":"packaging/updating-an-existing-package","path":"/docs/packaging/updating-an-existing-package","sidebar":"packagingSidebar"},{"id":"packaging/your-first-package-update","path":"/docs/packaging/your-first-package-update","sidebar":"packagingSidebar"},{"id":"user/contributing/community-guidelines","path":"/docs/user/contributing/community-guidelines","sidebar":"userSidebar"},{"id":"user/contributing/getting-involved","path":"/docs/user/contributing/getting-involved","sidebar":"userSidebar"},{"id":"user/contributing/style","path":"/docs/user/contributing/style","sidebar":"userSidebar"},{"id":"user/contributing/testing-an-iso","path":"/docs/user/contributing/testing-an-iso","sidebar":"userSidebar"},{"id":"user/editions/budgie/configuration","path":"/docs/user/editions/budgie/configuration","sidebar":"userSidebar"},{"id":"user/editions/budgie/index","path":"/docs/user/editions/budgie/","sidebar":"userSidebar"},{"id":"user/editions/budgie/tips-and-tricks","path":"/docs/user/editions/budgie/tips-and-tricks","sidebar":"userSidebar"},{"id":"user/editions/gnome/configuration","path":"/docs/user/editions/gnome/configuration","sidebar":"userSidebar"},{"id":"user/editions/gnome/index","path":"/docs/user/editions/gnome/","sidebar":"userSidebar"},{"id":"user/editions/gnome/tips-and-tricks","path":"/docs/user/editions/gnome/tips-and-tricks","sidebar":"userSidebar"},{"id":"user/editions/index","path":"/docs/user/editions/","sidebar":"userSidebar"},{"id":"user/editions/mate/configuration","path":"/docs/user/editions/mate/configuration","sidebar":"userSidebar"},{"id":"user/editions/mate/index","path":"/docs/user/editions/mate/","sidebar":"userSidebar"},{"id":"user/editions/mate/tips-and-tricks","path":"/docs/user/editions/mate/tips-and-tricks","sidebar":"userSidebar"},{"id":"user/editions/plasma/configuration","path":"/docs/user/editions/plasma/configuration","sidebar":"userSidebar"},{"id":"user/editions/plasma/index","path":"/docs/user/editions/plasma/","sidebar":"userSidebar"},{"id":"user/editions/plasma/tips-and-tricks","path":"/docs/user/editions/plasma/tips-and-tricks","sidebar":"userSidebar"},{"id":"user/editions/xfce/configuration","path":"/docs/user/editions/xfce/configuration","sidebar":"userSidebar"},{"id":"user/editions/xfce/index","path":"/docs/user/editions/xfce/","sidebar":"userSidebar"},{"id":"user/editions/xfce/tips-and-tricks","path":"/docs/user/editions/xfce/tips-and-tricks","sidebar":"userSidebar"},{"id":"user/hardware/compatibility/laptops","path":"/docs/user/hardware/compatibility/laptops","sidebar":"userSidebar"},{"id":"user/hardware/compatibility/wifi","path":"/docs/user/hardware/compatibility/wifi","sidebar":"userSidebar"},{"id":"user/hardware/index","path":"/docs/user/hardware/","sidebar":"userSidebar"},{"id":"user/hardware/mobile/android","path":"/docs/user/hardware/mobile/android","sidebar":"userSidebar"},{"id":"user/hardware/mobile/apple","path":"/docs/user/hardware/mobile/apple","sidebar":"userSidebar"},{"id":"user/hardware/peripherals/mice-and-touchpads","path":"/docs/user/hardware/peripherals/mice-and-touchpads","sidebar":"userSidebar"},{"id":"user/hardware/peripherals/midi-keyboard","path":"/docs/user/hardware/peripherals/midi-keyboard","sidebar":"userSidebar"},{"id":"user/hardware/peripherals/printers-and-scanners","path":"/docs/user/hardware/peripherals/printers-and-scanners","sidebar":"userSidebar"},{"id":"user/intro","path":"/docs/user/intro","sidebar":"userSidebar"},{"id":"user/package-management/basics","path":"/docs/user/package-management/basics","sidebar":"userSidebar"},{"id":"user/package-management/history-and-rollback","path":"/docs/user/package-management/history-and-rollback","sidebar":"userSidebar"},{"id":"user/package-management/repo-management","path":"/docs/user/package-management/repo-management","sidebar":"userSidebar"},{"id":"user/privacy","path":"/docs/user/privacy","sidebar":"userSidebar"},{"id":"user/quick-start/boot-management","path":"/docs/user/quick-start/boot-management","sidebar":"userSidebar"},{"id":"user/quick-start/default-applications","path":"/docs/user/quick-start/default-applications","sidebar":"userSidebar"},{"id":"user/quick-start/installation/disks","path":"/docs/user/quick-start/installation/disks","sidebar":"userSidebar"},{"id":"user/quick-start/installation/index","path":"/docs/user/quick-start/installation/","sidebar":"userSidebar"},{"id":"user/quick-start/installation/secure-boot","path":"/docs/user/quick-start/installation/secure-boot","sidebar":"userSidebar"},{"id":"user/quick-start/installation/system-requirements","path":"/docs/user/quick-start/installation/system-requirements","sidebar":"userSidebar"},{"id":"user/quick-start/software-center/index","path":"/docs/user/quick-start/software-center/","sidebar":"userSidebar"},{"id":"user/software/camera/droidcam","path":"/docs/user/software/camera/droidcam","sidebar":"userSidebar"},{"id":"user/software/command-line/index","path":"/docs/user/software/command-line/","sidebar":"userSidebar"},{"id":"user/software/configuration_files","path":"/docs/user/software/configuration_files","sidebar":"userSidebar"},{"id":"user/software/desktops/index","path":"/docs/user/software/desktops/","sidebar":"userSidebar"},{"id":"user/software/development/containers","path":"/docs/user/software/development/containers","sidebar":"userSidebar"},{"id":"user/software/development/index","path":"/docs/user/software/development/","sidebar":"userSidebar"},{"id":"user/software/development/java","path":"/docs/user/software/development/java","sidebar":"userSidebar"},{"id":"user/software/development/postgresql","path":"/docs/user/software/development/postgresql","sidebar":"userSidebar"},{"id":"user/software/development/r-and-rstudio","path":"/docs/user/software/development/r-and-rstudio","sidebar":"userSidebar"},{"id":"user/software/development/rust","path":"/docs/user/software/development/rust","sidebar":"userSidebar"},{"id":"user/software/development/web","path":"/docs/user/software/development/web","sidebar":"userSidebar"},{"id":"user/software/gaming/index","path":"/docs/user/software/gaming/","sidebar":"userSidebar"},{"id":"user/software/localization/ibus","path":"/docs/user/software/localization/ibus","sidebar":"userSidebar"},{"id":"user/software/networking/samba","path":"/docs/user/software/networking/samba","sidebar":"userSidebar"},{"id":"user/software/networking/tigervnc","path":"/docs/user/software/networking/tigervnc","sidebar":"userSidebar"},{"id":"user/software/networking/wireshark","path":"/docs/user/software/networking/wireshark","sidebar":"userSidebar"},{"id":"user/software/networking/xrdp","path":"/docs/user/software/networking/xrdp","sidebar":"userSidebar"},{"id":"user/software/sound/index","path":"/docs/user/software/sound/","sidebar":"userSidebar"},{"id":"user/software/third-party/index","path":"/docs/user/software/third-party/","sidebar":"userSidebar"},{"id":"user/software/third-party/snap","path":"/docs/user/software/third-party/snap","sidebar":"userSidebar"},{"id":"user/software/utilities/ksysguard","path":"/docs/user/software/utilities/ksysguard","sidebar":"userSidebar"},{"id":"user/software/utilities/kwallet","path":"/docs/user/software/utilities/kwallet","sidebar":"userSidebar"},{"id":"user/software/virtualization/virtualbox","path":"/docs/user/software/virtualization/virtualbox","sidebar":"userSidebar"},{"id":"user/software/web/obs","path":"/docs/user/software/web/obs","sidebar":"userSidebar"},{"id":"user/troubleshooting/boot-rescue","path":"/docs/user/troubleshooting/boot-rescue","sidebar":"userSidebar"},{"id":"user/troubleshooting/index","path":"/docs/user/troubleshooting/","sidebar":"userSidebar"},{"id":"user/troubleshooting/installation","path":"/docs/user/troubleshooting/installation","sidebar":"userSidebar"},{"id":"user/troubleshooting/plasma","path":"/docs/user/troubleshooting/plasma","sidebar":"userSidebar"},{"id":"/category/quick-start","path":"/docs/category/quick-start","sidebar":"userSidebar"},{"id":"/category/contributing","path":"/docs/category/contributing","sidebar":"userSidebar"},{"id":"/category/compatibility","path":"/docs/category/compatibility","sidebar":"userSidebar"},{"id":"/category/mobile","path":"/docs/category/mobile","sidebar":"userSidebar"},{"id":"/category/peripherals","path":"/docs/category/peripherals","sidebar":"userSidebar"},{"id":"/category/package-management","path":"/docs/category/package-management","sidebar":"userSidebar"},{"id":"/category/software","path":"/docs/category/software","sidebar":"userSidebar"},{"id":"/category/camera","path":"/docs/category/camera","sidebar":"userSidebar"},{"id":"/category/localization","path":"/docs/category/localization","sidebar":"userSidebar"},{"id":"/category/networking","path":"/docs/category/networking","sidebar":"userSidebar"},{"id":"/category/utilities","path":"/docs/category/utilities","sidebar":"userSidebar"},{"id":"/category/virtualization","path":"/docs/category/virtualization","sidebar":"userSidebar"},{"id":"/category/web","path":"/docs/category/web","sidebar":"userSidebar"},{"id":"/category/advanced-configuration","path":"/docs/category/advanced-configuration","sidebar":"packagingSidebar"},{"id":"/category/procedures","path":"/docs/category/procedures","sidebar":"packagingSidebar"}],"draftIds":[],"sidebars":{"userSidebar":{"link":{"path":"/docs/user/intro","label":"user/intro"}},"packagingSidebar":{"link":{"path":"/docs/packaging/","label":"packaging/index"}}}}],"breadcrumbs":true}},"@cmfcmf/docusaurus-search-local":{"default":{"titleBoost":5,"contentBoost":1,"tagsBoost":3,"parentCategoriesBoost":2,"indexDocSidebarParentCategories":0,"maxSearchResults":8}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(57529);const l=JSON.parse('{"docusaurusVersion":"3.5.2","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.5.2"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.5.2"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.5.2"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.5.2"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.5.2"},"@cmfcmf/docusaurus-search-local":{"type":"package","name":"@cmfcmf/docusaurus-search-local","version":"1.2.0"},"docusaurus-plugin-ideal-image":{"type":"package","name":"@docusaurus/plugin-ideal-image","version":"3.5.2"}}}');var c=n(85893);const u={siteConfig:o.default,siteMetadata:l,globalData:a,i18n:i,codeTranslations:s},d=r.createContext(u);function p(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},40903:(e,t,n)=>{"use strict";n.d(t,{Z:()=>m});var r=n(67294),o=n(29629),a=n(79722),i=n(48820),s=n(48714),l=n(13736),c=n(85893);function u(e){let{error:t,tryAgain:n}=e;return(0,c.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,c.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,c.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,c.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,i.BN)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function p(e){let{children:t}=e;return(0,c.jsx)(l.z,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function f(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)(p,{children:(0,c.jsxs)(m,{fallback:()=>(0,c.jsx)(u,{error:t,tryAgain:n}),children:[(0,c.jsx)(a.Z,{children:(0,c.jsx)("title",{children:"Page Error"})}),(0,c.jsx)(s.Z,{children:(0,c.jsx)(u,{error:t,tryAgain:n})})]})})}const g=e=>(0,c.jsx)(f,{...e});class m extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??g)(e)}return e??null}}},29629:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},79722:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});n(67294);var r=n(70405),o=n(85893);function a(e){return(0,o.jsx)(r.ql,{...e})}},38208:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(67294),o=n(73727),a=n(48820),i=n(75276),s=n(41117),l=n(29629),c=n(79202),u=n(23466),d=n(85893);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:g,isActive:m,"data-noBrokenLinkCheck":h,autoAddBaseUrl:b=!0,...y}=e;const{siteConfig:v}=(0,i.Z)(),{trailingSlash:w,baseUrl:k}=v,S=v.future.experimental_router,{withBaseUrl:_}=(0,u.Cg)(),x=(0,c.Z)(),E=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>E.current));const O=p||f;const P=(0,s.Z)(O),j=O?.replace("pathname://","");let C=void 0!==j?(T=j,b&&(e=>e.startsWith("/"))(T)?_(T):T):void 0;var T;"hash"===S&&C?.startsWith("./")&&(C=C?.slice(1)),C&&P&&(C=(0,a.Do)(C,{trailingSlash:w,baseUrl:k}));const I=(0,r.useRef)(!1),A=n?o.OL:o.rU,N=l.Z.canUseIntersectionObserver,L=(0,r.useRef)(),R=()=>{I.current||null==C||(window.docusaurus.preload(C),I.current=!0)};(0,r.useEffect)((()=>(!N&&P&&l.Z.canUseDOM&&null!=C&&window.docusaurus.prefetch(C),()=>{N&&L.current&&L.current.disconnect()})),[L,C,N,P]);const D=C?.startsWith("#")??!1,F=!y.target||"_self"===y.target,M=!C||!P||!F||D&&"hash"!==S;h||!D&&M||x.collectLink(C),y.id&&x.collectAnchor(y.id);const B={};return M?(0,d.jsx)("a",{ref:E,href:C,...O&&!P&&{target:"_blank",rel:"noopener noreferrer"},...y,...B}):(0,d.jsx)(A,{...y,onMouseEnter:R,onTouchStart:R,innerRef:e=>{E.current=e,N&&e&&P&&(L.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(L.current.unobserve(e),L.current.disconnect(),null!=C&&window.docusaurus.prefetch(C))}))})),L.current.observe(e))},to:C,...n&&{isActive:m,activeClassName:g},...B})}const f=r.forwardRef(p)},55361:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c,I:()=>l});var r=n(67294),o=n(85893);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(57529);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(s({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const i=s({message:t,id:n});return(0,o.jsx)(o.Fragment,{children:a(i,r)})}},73070:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},41117:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>o,b:()=>r})},23466:(e,t,n)=>{"use strict";n.d(t,{Cg:()=>i,ZP:()=>s});var r=n(67294),o=n(75276),a=n(41117);function i(){const{siteConfig:e}=(0,o.Z)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router,s=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:o=!1,absolute:i=!1}={},router:s}=e;if(!r||r.startsWith("#")||(0,a.b)(r))return r;if("hash"===s)return r.startsWith("/")?`.${r}`:`./${r}`;if(o)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const l=r.startsWith(n)?r:n+r.replace(/^\//,"");return i?t+l:l}({siteUrl:n,baseUrl:t,url:e,options:r,router:i})),[n,t,i]);return{withBaseUrl:s}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},79202:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(67294);n(85893);const o=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),a=()=>(0,r.useContext)(o);function i(){return a()}},75276:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(67294),o=n(1124);function a(){return(0,r.useContext)(o._)}},2591:(e,t,n)=>{"use strict";n.d(t,{OD:()=>a,eZ:()=>i});var r=n(75276),o=n(73070);function a(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,r.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}function i(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=a(e),i=r?.[t];if(!i&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return i}},45025:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(67294),o=n(3681);function a(){return(0,r.useContext)(o._)}},1290:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294);const o=n(29629).Z.canUseDOM?r.useLayoutEffect:r.useEffect},3675:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(67294),o=n(13736);function a(){const e=r.useContext(o._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}},44151:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[a,i]=n;const s=o?`${o}.${a}`:a;r(i)?e(i,s):t[s]=i}))}(e),t}},13736:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>i});var r=n(67294),o=n(85893);const a=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(a),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,o.jsx)(a.Provider,{value:s,children:t})}},5055:(e,t,n)=>{"use strict";n.d(t,{J:()=>y,L5:()=>h,Oh:()=>v});var r=n(67294),o=n(48878),a=n(73070),i=n(39581),s=n(1606),l=n(20585),c=n(85893);const u=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,s.WA)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,s.WA)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,s.WA)(u(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=r.createContext(null);function g(){const e=(0,o._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,s]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[a,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function m(e){let{children:t}=e;const n=g();return(0,c.jsx)(f.Provider,{value:n,children:t})}function h(e){let{children:t}=e;return(0,c.jsx)(m,{children:t})}function b(){const e=(0,r.useContext)(f);if(!e)throw new l.i6("DocsPreferredVersionContextProvider");return e}function y(e){void 0===e&&(e=a.m);const t=(0,o.zh)(e),[n,i]=b(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function v(){const e=(0,o._r)(),[t]=b();function n(n){const r=e[n],{preferredVersionName:o}=t[n];return r.versions.find((e=>e.name===o))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},90447:(e,t,n)=>{"use strict";n.d(t,{J:()=>a,z:()=>i});var r=n(48878),o=n(5055);function a(e,t){return`docs-${e}-${t}`}function i(){const e=(0,r._r)(),t=(0,r.WS)(),n=(0,o.Oh)();return[...Object.keys(e).map((function(r){const o=t?.activePlugin.pluginId===r?t.activeVersion:void 0,i=n[r],s=e[r].versions.find((e=>e.isLast));return a(r,(o??i??s).name)}))]}},40217:(e,t,n)=>{"use strict";n.d(t,{V:()=>c,b:()=>l});var r=n(67294),o=n(20585),a=n(85893);const i=Symbol("EmptyContext"),s=r.createContext(i);function l(e){let{children:t,name:n,items:o}=e;const i=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return(0,a.jsx)(s.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(s);if(e===i)throw new o.i6("DocsSidebarProvider");return e}},68879:(e,t,n)=>{"use strict";n.d(t,{LM:()=>f,MN:()=>O,SN:()=>E,_F:()=>b,f:()=>v,jA:()=>g,lO:()=>S,oz:()=>_,s1:()=>k,vY:()=>x,xz:()=>p});var r=n(67294),o=n(16550),a=n(18790),i=n(48878),s=n(51997),l=n(79113),c=n(5055),u=n(72950),d=n(40217);function p(e){const t=(0,u.E)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function f(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=f(t);if(e)return e}}(e):void 0:e.href}function g(){const{pathname:e}=(0,o.TH)(),t=(0,d.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=w({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const m=(e,t)=>void 0!==e&&(0,s.Mg)(e,t),h=(e,t)=>e.some((e=>b(e,t)));function b(e,t){return"link"===e.type?m(e.href,t):"category"===e.type&&(m(e.href,t)||h(e.items,t))}function y(e,t){switch(e.type){case"category":return b(e,t)||e.items.some((e=>y(e,t)));case"link":return!e.unlisted||b(e,t);default:return!0}}function v(e,t){return(0,r.useMemo)((()=>e.filter((e=>y(e,t)))),[e,t])}function w(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const o=[];return function e(t){for(const a of t)if("category"===a.type&&((0,s.Mg)(a.href,n)||e(a.items))||"link"===a.type&&(0,s.Mg)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function k(){const e=(0,d.V)(),{pathname:t}=(0,o.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?w({sidebarItems:e.items,pathname:t}):null}function S(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,c.J)(e),o=(0,i.yW)(e);return(0,r.useMemo)((()=>(0,l.jj)([t,n,o].filter(Boolean))),[t,n,o])}function _(e,t){const n=S(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function x(e,t){const n=S(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,l.jj)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function E(e){let{route:t}=e;const n=(0,o.TH)(),r=(0,u.E)(),i=t.routes,s=i.find((e=>(0,o.LX)(n.pathname,e)));if(!s)return null;const l=s.sidebar,c=l?r.docsSidebars[l]:void 0;return{docElement:(0,a.H)(i),sidebarName:l,sidebarItems:c}}function O(e){return e.filter((e=>!("category"===e.type||"link"===e.type)||!!f(e)))}},72950:(e,t,n)=>{"use strict";n.d(t,{E:()=>l,q:()=>s});var r=n(67294),o=n(20585),a=n(85893);const i=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(null===e)throw new o.i6("DocsVersionProvider");return e}},48878:(e,t,n)=>{"use strict";n.d(t,{MN:()=>l.MN,Iw:()=>y,gA:()=>g,WS:()=>m,_r:()=>p,jA:()=>l.jA,Jo:()=>v,z1:()=>u.z,zh:()=>f,J:()=>c.J,yW:()=>b,gB:()=>h});var r=n(16550),o=n(2591);const a=e=>e.versions.find((e=>e.isLast));function i(e,t){return[...e.versions].sort(((e,t)=>e.path===t.path?0:e.path.includes(t.path)?-1:t.path.includes(e.path)?1:0)).find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}function s(e,t){const n=i(e,t),o=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}var l=n(68879),c=n(5055),u=n(90447);const d={},p=()=>(0,o.OD)("docusaurus-plugin-content-docs")??d,f=e=>{try{return(0,o.eZ)("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function g(e){void 0===e&&(e={});const t=p(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return a}(t,n,e)}function m(e){void 0===e&&(e={});const t=g(e),{pathname:n}=(0,r.TH)();if(!t)return;return{activePlugin:t,activeVersion:i(t.pluginData,n)}}function h(e){return f(e).versions}function b(e){const t=f(e);return a(t)}function y(e){const t=f(e),{pathname:n}=(0,r.TH)();return s(t,n)}function v(e){const t=f(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=a(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},98356:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(74865),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},87213:(e,t,n)=>{"use strict";n.r(t);var r=n(14965),o=n(36809);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(96854),n(24249)(`./prism-${e}`)})),delete globalThis.Prism}(r.p1)},42704:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});n(67294);var r=n(36905),o=n(55361),a=n(39581),i=n(38208),s=n(79202);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(85893);function u(e){let{as:t,id:n,...u}=e;const d=(0,s.Z)(),{navbar:{hideOnScroll:p}}=(0,a.L)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const f=(0,o.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,c.jsxs)(t,{...u,className:(0,r.Z)("anchor",p?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.Z,{className:"hash-link",to:`#${n}`,"aria-label":f,title:f,children:"\u200b"})]})}},99391:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});n(67294);const r={iconExternalLink:"iconExternalLink_nPIU"};var o=n(85893);function a(e){let{width:t=13.5,height:n=13.5}=e;return(0,o.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,o.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},48714:(e,t,n)=>{"use strict";n.d(t,{Z:()=>di});var r=n(67294),o=n(36905),a=n(40903),i=n(96984),s=n(16550),l=n(55361),c=n(89062),u=n(85893);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,s.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const g=(0,l.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function m(e){const t=e.children??g,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":g,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var h=n(50563),b=n(95099);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(m,{className:y.skipToContent})}var w=n(39581),k=n(25461);function S(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:a,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:o,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const _={closeButton:"closeButton_CVFx"};function x(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,l.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.Z)("clean-btn close",_.closeButton,e.className),children:(0,u.jsx)(S,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function O(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.Z)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const P={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function j(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,k.n)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,u.jsxs)("div",{className:P.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,u.jsx)("div",{className:P.announcementBarPlaceholder}),(0,u.jsx)(O,{className:P.announcementBarContent}),a&&(0,u.jsx)(x,{onClick:n,className:P.announcementBarClose})]})}var C=n(44160),T=n(18119);var I=n(20585),A=n(5689);const N=r.createContext(null);function L(e){let{children:t}=e;const n=function(){const e=(0,C.e)(),t=(0,A.HY)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,I.D9)(a);return(0,r.useEffect)((()=>{a&&!i&&o(!0)}),[a,i]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return(0,u.jsx)(N.Provider,{value:n,children:t})}function R(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function D(){const e=(0,r.useContext)(N);if(!e)throw new I.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,A.HY)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:R(a)})),[o,a,t])}function F(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:a}=D();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,o.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":a}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var M=n(61503),B=n(45025);function z(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function U(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const $={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function H(e){let{className:t,buttonClassName:n,value:r,onChange:a}=e;const i=(0,B.Z)(),s=(0,l.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,l.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,o.Z)($.toggle,t),children:(0,u.jsxs)("button",{className:(0,o.Z)("clean-btn",$.toggleButton,!i&&$.toggleButtonDisabled,n),type:"button",onClick:()=>a("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite",children:[(0,u.jsx)(z,{className:(0,o.Z)($.toggleIcon,$.lightToggleIcon)}),(0,u.jsx)(U,{className:(0,o.Z)($.toggleIcon,$.darkToggleIcon)})]})})}const q=r.memo(H),V={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function Q(e){let{className:t}=e;const n=(0,w.L)().navbar.style,r=(0,w.L)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,M.I)();return r?null:(0,u.jsx)(q,{className:t,buttonClassName:"dark"===n?V.darkNavbarColorModeToggle:void 0,value:o,onChange:a})}var Z=n(82546);function W(){return(0,u.jsx)(Z.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function G(){const e=(0,C.e)();return(0,u.jsx)("button",{type:"button","aria-label":(0,l.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(S,{color:"var(--ifm-color-emphasis-600)"})})}function Y(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(W,{}),(0,u.jsx)(Q,{className:"margin-right--md"}),(0,u.jsx)(G,{})]})}var K=n(38208),X=n(23466),J=n(41117);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(99391);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:a,html:i,isDropdownLink:s,prependBaseUrlToHref:l,...c}=e;const d=(0,X.ZP)(r),p=(0,X.ZP)(t),f=(0,X.ZP)(o,{forcePrependBaseUrl:!0}),g=a&&o&&!(0,J.Z)(o),m=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[a,g&&(0,u.jsx)(te.Z,{...s&&{width:12,height:12}})]})};return o?(0,u.jsx)(K.Z,{href:l?f:o,...c,...m}):(0,u.jsx)(K.Z,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},...c,...m})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const a=(0,u.jsx)(ne,{className:(0,o.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:a}):a}function oe(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,o.Z)("menu__link",t),...r})})}function ae(e){let{mobile:t=!1,position:n,...r}=e;const o=t?oe:re;return(0,u.jsx)(o,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(93841),se=n(51997),le=n(75276);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,se.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:a,onClick:i,...s}=e;const l=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),(0,u.jsxs)("div",{ref:l,className:(0,o.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,o.Z)("navbar__link",a),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:s.children??s.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(_a,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:a,onClick:i,...l}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:g}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&g(!d)}),[c,d,g]),(0,u.jsxs)("li",{className:(0,o.Z)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsx)(ne,{role:"button",className:(0,o.Z)(ce.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),f()},children:l.children??l.label}),(0,u.jsx)(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(_a,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?pe:de;return(0,u.jsx)(r,{...n})}var ge=n(76862);function me(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const he="iconLanguage_nlXk";var be=n(73935);function ye(e,t){var n=void 0;return function(){for(var r=arguments.length,o=new Array(r),a=0;ae.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function Ie(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Ae(e){for(var t=1;t=3||2===n&&r>=4||1===n&&r>=10}(e);function n(n,r,o){if(t&&void 0!==o){var a=o[0].__autocomplete_algoliaCredentials,i={"X-Algolia-Application-Id":a.appId,"X-Algolia-API-Key":a.apiKey};e.apply(void 0,[n].concat(je(r),[{headers:i}]))}else e.apply(void 0,[n].concat(je(r)))}return{init:function(t,n){e("init",{appId:t,apiKey:n})},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&n("clickedObjectIDsAfterSearch",Le(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&n("clickedObjectIDs",Le(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["clickedFilters"].concat(n))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&n("convertedObjectIDsAfterSearch",Le(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&n("convertedObjectIDs",Le(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["convertedFilters"].concat(n))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&t.reduce((function(e,t){var n=t.items,r=Te(t,Oe);return[].concat(je(e),je(function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:20,n=[],r=0;r0&&e.apply(void 0,["viewedFilters"].concat(n))}}}function De(e){var t=e.items.reduce((function(e,t){var n;return e[t.__autocomplete_indexName]=(null!==(n=e[t.__autocomplete_indexName])&&void 0!==n?n:[]).concat(t),e}),{});return Object.keys(t).map((function(e){return{index:e,items:t[e],algoliaSource:["autocomplete"]}}))}function Fe(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function Me(e){return Me="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Me(e)}function Be(e){return function(e){if(Array.isArray(e))return ze(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return ze(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return ze(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ze(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&Qe({onItemsChange:r,items:n,insights:s,state:t}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,n=e.onSelect,r=e.onActive;i("addAlgoliaAgent","insights-plugin"),t({algoliaInsightsPlugin:{__algoliaSearchParameters:{clickAnalytics:!0},insights:s}}),n((function(e){var t=e.item,n=e.state,r=e.event;Fe(t)&&o({state:n,event:r,insights:s,item:t,insightsEvents:[$e({eventName:"Item Selected"},Se({item:t,items:l.current}))]})})),r((function(e){var t=e.item,n=e.state,r=e.event;Fe(t)&&a({state:n,event:r,insights:s,item:t,insightsEvents:[$e({eventName:"Item Active"},Se({item:t,items:l.current}))]})}))},onStateChange:function(e){var t=e.state;c({state:t})},__autocomplete_pluginOptions:e}}function We(e){return We="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},We(e)}function Ge(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Ye(e,t,n){return(t=function(e){var t=function(e,t){if("object"!==We(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!==We(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===We(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Ke(e,t,n){var r,o=t.initialState;return{getState:function(){return o},dispatch:function(r,a){var i=function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n0},reshape:function(e){return e.sources}},e),{},{id:null!==(n=e.id)&&void 0!==n?n:"autocomplete-".concat(ot++),plugins:o,initialState:ft({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var n;null===(n=e.onStateChange)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onStateChange)||void 0===n?void 0:n.call(e,t)}))},onSubmit:function(t){var n;null===(n=e.onSubmit)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onSubmit)||void 0===n?void 0:n.call(e,t)}))},onReset:function(t){var n;null===(n=e.onReset)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onReset)||void 0===n?void 0:n.call(e,t)}))},getSources:function(n){return Promise.all([].concat(ut(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return function(e,t){var n=[];return Promise.resolve(e(t)).then((function(e){return Array.isArray(e),Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,n.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));n.push(e.sourceId);var t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:ke,onResolve:ke};Object.keys(t).forEach((function(e){t[e].__default=!0}));var r=it(it({},t),e);return Promise.resolve(r)})))}))}(e,n)}))).then((function(e){return Xe(e)})).then((function(e){return e.map((function(e){return ft(ft({},e),{},{onSelect:function(n){e.onSelect(n),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,n)}))},onActive:function(n){e.onActive(n),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,n)}))},onResolve:function(n){e.onResolve(n),t.forEach((function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,n)}))}})}))}))},navigator:ft({navigate:function(e){var t=e.itemUrl;r.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,n=r.open(t,"_blank","noopener");null==n||n.focus()},navigateNewWindow:function(e){var t=e.itemUrl;r.open(t,"_blank","noopener")}},e.navigator)})}function ht(e){return ht="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ht(e)}function bt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function yt(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Vt,Qt,Zt,Wt=null,Gt=(Vt=-1,Qt=-1,Zt=void 0,function(e){var t=++Vt;return Promise.resolve(e).then((function(e){return Zt&&t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var rn=/((gt|sm)-|galaxy nexus)|samsung[- ]/i;function on(e){return on="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},on(e)}var an=["props","refresh","store"],sn=["inputElement","formElement","panelElement"],ln=["inputElement"],cn=["inputElement","maxLength"],un=["sourceIndex"],dn=["sourceIndex"],pn=["item","source","sourceIndex"];function fn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function gn(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function bn(e){var t=e.props,n=e.refresh,r=e.store,o=hn(e,an),a=function(e,t){return void 0!==t?"".concat(e,"-").concat(t):e};return{getEnvironmentProps:function(e){var n=e.inputElement,o=e.formElement,a=e.panelElement;function i(e){!r.getState().isOpen&&r.pendingRequests.isEmpty()||e.target===n||!1===[o,a].some((function(t){return n=t,r=e.target,n===r||n.contains(r);var n,r}))&&(r.dispatch("blur",null),t.debug||r.pendingRequests.cancelAll())}return gn({onTouchStart:i,onMouseDown:i,onTouchMove:function(e){!1!==r.getState().isOpen&&n===t.environment.document.activeElement&&e.target!==n&&n.blur()}},hn(e,sn))},getRootProps:function(e){return gn({role:"combobox","aria-expanded":r.getState().isOpen,"aria-haspopup":"listbox","aria-owns":r.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label")},e)},getFormProps:function(e){e.inputElement;return gn({action:"",noValidate:!0,role:"search",onSubmit:function(a){var i;a.preventDefault(),t.onSubmit(gn({event:a,refresh:n,state:r.getState()},o)),r.dispatch("submit",null),null===(i=e.inputElement)||void 0===i||i.blur()},onReset:function(a){var i;a.preventDefault(),t.onReset(gn({event:a,refresh:n,state:r.getState()},o)),r.dispatch("reset",null),null===(i=e.inputElement)||void 0===i||i.focus()}},hn(e,ln))},getLabelProps:function(e){var n=e||{},r=n.sourceIndex,o=hn(n,un);return gn({htmlFor:"".concat(a(t.id,r),"-input"),id:"".concat(a(t.id,r),"-label")},o)},getInputProps:function(e){var a;function i(e){(t.openOnFocus||Boolean(r.getState().query))&&Yt(gn({event:e,props:t,query:r.getState().completion||r.getState().query,refresh:n,store:r},o)),r.dispatch("focus",null)}var s=e||{},l=(s.inputElement,s.maxLength),c=void 0===l?512:l,u=hn(s,cn),d=Mt(r.getState()),p=function(e){return Boolean(e&&e.match(rn))}((null===(a=t.environment.navigator)||void 0===a?void 0:a.userAgent)||""),f=null!=d&&d.itemUrl&&!p?"go":"search";return gn({"aria-autocomplete":"both","aria-activedescendant":r.getState().isOpen&&null!==r.getState().activeItemId?"".concat(t.id,"-item-").concat(r.getState().activeItemId):void 0,"aria-controls":r.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label"),value:r.getState().completion||r.getState().query,id:"".concat(t.id,"-input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:f,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:c,type:"search",onChange:function(e){Yt(gn({event:e,props:t,query:e.currentTarget.value.slice(0,c),refresh:n,store:r},o))},onKeyDown:function(e){!function(e){var t=e.event,n=e.props,r=e.refresh,o=e.store,a=nn(e,Xt);if("ArrowUp"===t.key||"ArrowDown"===t.key){var i=function(){var e=n.environment.document.getElementById("".concat(n.id,"-item-").concat(o.getState().activeItemId));e&&(e.scrollIntoViewIfNeeded?e.scrollIntoViewIfNeeded(!1):e.scrollIntoView(!1))},s=function(){var e=Mt(o.getState());if(null!==o.getState().activeItemId&&e){var n=e.item,i=e.itemInputValue,s=e.itemUrl,l=e.source;l.onActive(en({event:t,item:n,itemInputValue:i,itemUrl:s,refresh:r,source:l,state:o.getState()},a))}};t.preventDefault(),!1===o.getState().isOpen&&(n.openOnFocus||Boolean(o.getState().query))?Yt(en({event:t,props:n,query:o.getState().query,refresh:r,store:o},a)).then((function(){o.dispatch(t.key,{nextActiveItemId:n.defaultActiveItemId}),s(),setTimeout(i,0)})):(o.dispatch(t.key,{}),s(),i())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(n.debug||o.pendingRequests.cancelAll());t.preventDefault();var l=Mt(o.getState()),c=l.item,u=l.itemInputValue,d=l.itemUrl,p=l.source;if(t.metaKey||t.ctrlKey)void 0!==d&&(p.onSelect(en({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:p,state:o.getState()},a)),n.navigator.navigateNewTab({itemUrl:d,item:c,state:o.getState()}));else if(t.shiftKey)void 0!==d&&(p.onSelect(en({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:p,state:o.getState()},a)),n.navigator.navigateNewWindow({itemUrl:d,item:c,state:o.getState()}));else if(t.altKey);else{if(void 0!==d)return p.onSelect(en({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:p,state:o.getState()},a)),void n.navigator.navigate({itemUrl:d,item:c,state:o.getState()});Yt(en({event:t,nextState:{isOpen:!1},props:n,query:u,refresh:r,store:o},a)).then((function(){p.onSelect(en({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:p,state:o.getState()},a))}))}}}(gn({event:e,props:t,refresh:n,store:r},o))},onFocus:i,onBlur:ke,onClick:function(n){e.inputElement!==t.environment.document.activeElement||r.getState().isOpen||i(n)}},u)},getPanelProps:function(e){return gn({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){r.dispatch("mouseleave",null)}},e)},getListProps:function(e){var n=e||{},r=n.sourceIndex,o=hn(n,dn);return gn({role:"listbox","aria-labelledby":"".concat(a(t.id,r),"-label"),id:"".concat(a(t.id,r),"-list")},o)},getItemProps:function(e){var i=e.item,s=e.source,l=e.sourceIndex,c=hn(e,pn);return gn({id:"".concat(a(t.id,l),"-item-").concat(i.__autocomplete_id),role:"option","aria-selected":r.getState().activeItemId===i.__autocomplete_id,onMouseMove:function(e){if(i.__autocomplete_id!==r.getState().activeItemId){r.dispatch("mousemove",i.__autocomplete_id);var t=Mt(r.getState());if(null!==r.getState().activeItemId&&t){var a=t.item,s=t.itemInputValue,l=t.itemUrl,c=t.source;c.onActive(gn({event:e,item:a,itemInputValue:s,itemUrl:l,refresh:n,source:c,state:r.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var a=s.getItemInputValue({item:i,state:r.getState()}),l=s.getItemUrl({item:i,state:r.getState()});(l?Promise.resolve():Yt(gn({event:e,nextState:{isOpen:!1},props:t,query:a,refresh:n,store:r},o))).then((function(){s.onSelect(gn({event:e,item:i,itemInputValue:a,itemUrl:l,refresh:n,source:s,state:r.getState()},o))}))}},c)}}}var yn=[{segment:"autocomplete-core",version:"1.9.2"}];function vn(e){return vn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},vn(e)}function wn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function kn(e){for(var t=1;t=n?null===r?null:0:o}function On(e){return On="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},On(e)}function Pn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function jn(e){for(var t=1;t=5&&((o||!e&&5===r)&&(i.push(r,0,o,n),r=6),e&&(i.push(r,e,0,n),r=6)),o=""},l=0;l"===t?(r=1,o=""):o=t+o[0]:a?t===a?a="":o+=t:'"'===t||"'"===t?a=t:">"===t?(s(),r=1):r&&("="===t?(r=5,n=o,o=""):"/"===t&&(r<5||">"===e[l][c+1])?(s(),3===r&&(i=i[0]),r=i,(i=i[0]).push(2,0,r),r=0):" "===t||"\t"===t||"\n"===t||"\r"===t?(s(),r=2):o+=t),3===r&&"!--"===o&&(r=4,i=i[0])}return s(),i}(e)),t),arguments,[])).length>1?t:t[0]}var $n=function(e){var t=e.environment,n=t.document.createElementNS("http://www.w3.org/2000/svg","svg");n.setAttribute("class","aa-SubmitIcon"),n.setAttribute("viewBox","0 0 24 24"),n.setAttribute("width","20"),n.setAttribute("height","20"),n.setAttribute("fill","currentColor");var r=t.document.createElementNS("http://www.w3.org/2000/svg","path");return r.setAttribute("d","M16.041 15.856c-0.034 0.026-0.067 0.055-0.099 0.087s-0.060 0.064-0.087 0.099c-1.258 1.213-2.969 1.958-4.855 1.958-1.933 0-3.682-0.782-4.95-2.050s-2.050-3.017-2.050-4.95 0.782-3.682 2.050-4.95 3.017-2.050 4.95-2.050 3.682 0.782 4.95 2.050 2.050 3.017 2.050 4.95c0 1.886-0.745 3.597-1.959 4.856zM21.707 20.293l-3.675-3.675c1.231-1.54 1.968-3.493 1.968-5.618 0-2.485-1.008-4.736-2.636-6.364s-3.879-2.636-6.364-2.636-4.736 1.008-6.364 2.636-2.636 3.879-2.636 6.364 1.008 4.736 2.636 6.364 3.879 2.636 6.364 2.636c2.125 0 4.078-0.737 5.618-1.968l3.675 3.675c0.391 0.391 1.024 0.391 1.414 0s0.391-1.024 0-1.414z"),n.appendChild(r),n},Hn=function(e){var t=e.environment,n=t.document.createElementNS("http://www.w3.org/2000/svg","svg");n.setAttribute("class","aa-ClearIcon"),n.setAttribute("viewBox","0 0 24 24"),n.setAttribute("width","18"),n.setAttribute("height","18"),n.setAttribute("fill","currentColor");var r=t.document.createElementNS("http://www.w3.org/2000/svg","path");return r.setAttribute("d","M5.293 6.707l5.293 5.293-5.293 5.293c-0.391 0.391-0.391 1.024 0 1.414s1.024 0.391 1.414 0l5.293-5.293 5.293 5.293c0.391 0.391 1.024 0.391 1.414 0s0.391-1.024 0-1.414l-5.293-5.293 5.293-5.293c0.391-0.391 0.391-1.024 0-1.414s-1.024-0.391-1.414 0l-5.293 5.293-5.293-5.293c-0.391-0.391-1.024-0.391-1.414 0s-0.391 1.024 0 1.414z"),n.appendChild(r),n},qn=function(e){var t=e.environment.document.createElementNS("http://www.w3.org/2000/svg","svg");return t.setAttribute("class","aa-LoadingIcon"),t.setAttribute("viewBox","0 0 100 100"),t.setAttribute("width","20"),t.setAttribute("height","20"),t.innerHTML='\n \n',t},Vn=["ontouchstart","ontouchend","ontouchmove","ontouchcancel"];function Qn(e,t,n){e[t]=null===n?"":"number"!=typeof n?n:n+"px"}function Zn(e){this._listeners[e.type](e)}function Wn(e,t,n){var r,o,a=e[t];if("style"===t)if("string"==typeof n)e.style=n;else if(null===n)e.style="";else for(t in n)a&&n[t]===a[t]||Qn(e.style,t,n[t]);else"o"===t[0]&&"n"===t[1]?(r=t!==(t=t.replace(/Capture$/,"")),((o=t.toLowerCase())in e||Vn.includes(o))&&(t=o),t=t.slice(2),e._listeners||(e._listeners={}),e._listeners[t]=n,n?a||e.addEventListener(t,Zn,r):e.removeEventListener(t,Zn,r)):"list"!==t&&"tagName"!==t&&"form"!==t&&"type"!==t&&"size"!==t&&"download"!==t&&"href"!==t&&t in e?e[t]=null==n?"":n:"function"!=typeof n&&"dangerouslySetInnerHTML"!==t&&(null==n||!1===n&&!/^ar/.test(t)?e.removeAttribute(t):e.setAttribute(t,n))}function Gn(e){return"onChange"===e?"onInput":e}function Yn(e,t){for(var n in t)Wn(e,Gn(n),t[n])}function Kn(e,t){for(var n in t)"o"===n[0]&&"n"===n[1]||Wn(e,Gn(n),t[n])}var Xn=["children"];function Jn(e){return function(e){if(Array.isArray(e))return er(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return er(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return er(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function er(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function nr(e){return function(t,n){var r=n.children,o=void 0===r?[]:r,a=tr(n,Xn),i=e.document.createElement(t);return Yn(i,a),i.append.apply(i,Jn(o)),i}}function rr(e){return rr="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},rr(e)}var or=["autocompleteScopeApi","environment","classNames","getInputProps","getInputPropsCore","isDetached","state"];function ar(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function ir(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var cr=function(e){var t=e.autocompleteScopeApi,n=e.environment,r=(e.classNames,e.getInputProps),o=e.getInputPropsCore,a=e.isDetached,i=e.state,s=lr(e,or),l=nr(n)("input",s),c=r(ir({state:i,props:o({inputElement:l}),inputElement:l},t));return Yn(l,ir(ir({},c),{},{onKeyDown:function(e){a&&"Tab"===e.key||c.onKeyDown(e)}})),l};function ur(e){return ur="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ur(e)}function dr(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function pr(e){for(var t=1;t2&&(i.children=arguments.length>3?mr.call(arguments,2):n),"function"==typeof e&&null!=e.defaultProps)for(a in e.defaultProps)void 0===i[a]&&(i[a]=e.defaultProps[a]);return Cr(e,i,r,o,null)}function Cr(e,t,n,r,o){var a={type:e,props:t,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==o?++br:o};return null==o&&null!=hr.vnode&&hr.vnode(a),a}function Tr(e){return e.children}function Ir(e,t){this.props=e,this.context=t}function Ar(e,t){if(null==t)return e.__?Ar(e.__,e.__.__k.indexOf(e)+1):null;for(var n;tt&&yr.sort(kr));Rr.__r=0}function Dr(e,t,n,r,o,a,i,s,l,c){var u,d,p,f,g,m,h,b=r&&r.__k||_r,y=b.length;for(n.__k=[],u=0;u0?Cr(f.type,f.props,f.key,f.ref?f.ref:null,f.__v):f)){if(f.__=n,f.__b=n.__b+1,null===(p=b[u])||p&&f.key==p.key&&f.type===p.type)b[u]=void 0;else for(d=0;d=0;t--)if((n=e.__k[t])&&(r=Br(n)))return r;return null}function zr(e,t,n){"-"===t[0]?e.setProperty(t,null==n?"":n):e[t]=null==n?"":"number"!=typeof n||xr.test(t)?n:n+"px"}function Ur(e,t,n,r,o){var a;e:if("style"===t)if("string"==typeof n)e.style.cssText=n;else{if("string"==typeof r&&(e.style.cssText=r=""),r)for(t in r)n&&t in n||zr(e.style,t,"");if(n)for(t in n)r&&n[t]===r[t]||zr(e.style,t,n[t])}else if("o"===t[0]&&"n"===t[1])a=t!==(t=t.replace(/Capture$/,"")),t=t.toLowerCase()in e?t.toLowerCase().slice(2):t.slice(2),e.l||(e.l={}),e.l[t+a]=n,n?r||e.addEventListener(t,a?Hr:$r,a):e.removeEventListener(t,a?Hr:$r,a);else if("dangerouslySetInnerHTML"!==t){if(o)t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if("width"!==t&&"height"!==t&&"href"!==t&&"list"!==t&&"form"!==t&&"tabIndex"!==t&&"download"!==t&&"rowSpan"!==t&&"colSpan"!==t&&t in e)try{e[t]=null==n?"":n;break e}catch(e){}"function"==typeof n||(null==n||!1===n&&"-"!==t[4]?e.removeAttribute(t):e.setAttribute(t,n))}}function $r(e){return this.l[e.type+!1](hr.event?hr.event(e):e)}function Hr(e){return this.l[e.type+!0](hr.event?hr.event(e):e)}function qr(e,t,n,r,o,a,i,s,l){var c,u,d,p,f,g,m,h,b,y,v,w,k,S,_,x=t.type;if(void 0!==t.constructor)return null;null!=n.__h&&(l=n.__h,s=t.__e=n.__e,t.__h=null,a=[s]),(c=hr.__b)&&c(t);try{e:if("function"==typeof x){if(h=t.props,b=(c=x.contextType)&&r[c.__c],y=c?b?b.props.value:c.__:r,n.__c?m=(u=t.__c=n.__c).__=u.__E:("prototype"in x&&x.prototype.render?t.__c=u=new x(h,y):(t.__c=u=new Ir(h,y),u.constructor=x,u.render=Gr),b&&b.sub(u),u.props=h,u.state||(u.state={}),u.context=y,u.__n=r,d=u.__d=!0,u.__h=[],u._sb=[]),null==u.__s&&(u.__s=u.state),null!=x.getDerivedStateFromProps&&(u.__s==u.state&&(u.__s=Or({},u.__s)),Or(u.__s,x.getDerivedStateFromProps(h,u.__s))),p=u.props,f=u.state,u.__v=t,d)null==x.getDerivedStateFromProps&&null!=u.componentWillMount&&u.componentWillMount(),null!=u.componentDidMount&&u.__h.push(u.componentDidMount);else{if(null==x.getDerivedStateFromProps&&h!==p&&null!=u.componentWillReceiveProps&&u.componentWillReceiveProps(h,y),!u.__e&&null!=u.shouldComponentUpdate&&!1===u.shouldComponentUpdate(h,u.__s,y)||t.__v===n.__v){for(t.__v!==n.__v&&(u.props=h,u.state=u.__s,u.__d=!1),u.__e=!1,t.__e=n.__e,t.__k=n.__k,t.__k.forEach((function(e){e&&(e.__=t)})),v=0;v0&&void 0!==arguments[0]?arguments[0]:[];return{get:function(){return e},add:function(t){var n=e[e.length-1];(null==n?void 0:n.isHighlighted)===t.isHighlighted?e[e.length-1]={value:n.value+t.value,isHighlighted:n.isHighlighted}:e.push(t)}}}(n?[{value:n,isHighlighted:!1}]:[]);return t.forEach((function(e){var t=e.split(Jr);r.add({value:t[0],isHighlighted:!0}),""!==t[1]&&r.add({value:t[1],isHighlighted:!1})})),r.get()}function to(e){return function(e){if(Array.isArray(e))return no(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return no(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return no(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function no(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n",""":'"',"'":"'"},io=new RegExp(/\w/i),so=/&(amp|quot|lt|gt|#39);/g,lo=RegExp(so.source);function co(e,t){var n,r,o,a=e[t],i=(null===(n=e[t+1])||void 0===n?void 0:n.isHighlighted)||!0,s=(null===(r=e[t-1])||void 0===r?void 0:r.isHighlighted)||!0;return io.test((o=a.value)&&lo.test(o)?o.replace(so,(function(e){return ao[e]})):o)||s!==i?a.isHighlighted:s}function uo(e){return uo="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},uo(e)}function po(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function fo(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var To={clearButton:"aa-ClearButton",detachedCancelButton:"aa-DetachedCancelButton",detachedContainer:"aa-DetachedContainer",detachedFormContainer:"aa-DetachedFormContainer",detachedOverlay:"aa-DetachedOverlay",detachedSearchButton:"aa-DetachedSearchButton",detachedSearchButtonIcon:"aa-DetachedSearchButtonIcon",detachedSearchButtonPlaceholder:"aa-DetachedSearchButtonPlaceholder",detachedSearchButtonQuery:"aa-DetachedSearchButtonQuery",form:"aa-Form",input:"aa-Input",inputWrapper:"aa-InputWrapper",inputWrapperPrefix:"aa-InputWrapperPrefix",inputWrapperSuffix:"aa-InputWrapperSuffix",item:"aa-Item",label:"aa-Label",list:"aa-List",loadingIndicator:"aa-LoadingIndicator",panel:"aa-Panel",panelLayout:"aa-PanelLayout aa-Panel--scrollable",root:"aa-Autocomplete",source:"aa-Source",sourceFooter:"aa-SourceFooter",sourceHeader:"aa-SourceHeader",sourceNoResults:"aa-SourceNoResults",submitButton:"aa-SubmitButton"},Io=function(e,t){var n=e.children;(0,e.render)(n,t)},Ao={createElement:jr,Fragment:Tr,render:Yr};function No(e){var t=e.panelPlacement,n=e.container,r=e.form,o=e.environment,a=n.getBoundingClientRect(),i=(o.pageYOffset||o.document.documentElement.scrollTop||o.document.body.scrollTop||0)+a.top+a.height;switch(t){case"start":return{top:i,left:a.left};case"end":return{top:i,right:o.document.documentElement.clientWidth-(a.left+a.width)};case"full-width":return{top:i,left:0,right:0,width:"unset",maxWidth:"unset"};case"input-wrapper-width":var s=r.getBoundingClientRect();return{top:i,left:s.left,right:o.document.documentElement.clientWidth-(s.left+s.width),width:"unset",maxWidth:"unset"};default:throw new Error("[Autocomplete] The `panelPlacement` value ".concat(JSON.stringify(t)," is not valid."))}}function Lo(e){return Lo="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Lo(e)}function Ro(){return Ro=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function ea(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function ta(e){for(var t=1;t0;if(!p.value.core.openOnFocus&&!t.query)return n;var r=Boolean(c.current||p.value.renderer.renderNoResults);return!n&&r||n},__autocomplete_metadata:{userAgents:Bo,options:e}}))})),m=Dn(ta({collections:[],completion:null,context:{},isOpen:!1,query:"",activeItemId:null,status:"idle"},p.value.core.initialState)),h={getEnvironmentProps:p.value.renderer.getEnvironmentProps,getFormProps:p.value.renderer.getFormProps,getInputProps:p.value.renderer.getInputProps,getItemProps:p.value.renderer.getItemProps,getLabelProps:p.value.renderer.getLabelProps,getListProps:p.value.renderer.getListProps,getPanelProps:p.value.renderer.getPanelProps,getRootProps:p.value.renderer.getRootProps},b={setActiveItemId:g.value.setActiveItemId,setQuery:g.value.setQuery,setCollections:g.value.setCollections,setIsOpen:g.value.setIsOpen,setStatus:g.value.setStatus,setContext:g.value.setContext,refresh:g.value.refresh,navigator:g.value.navigator},y=s((function(){return Un.bind(p.value.renderer.renderer.createElement)})),v=s((function(){return function(e){var t=e.autocomplete,n=e.autocompleteScopeApi,r=e.classNames,o=e.environment,a=e.isDetached,i=e.placeholder,s=void 0===i?"Search":i,l=e.propGetters,c=e.setIsModalOpen,u=e.state,d=e.translations,p=nr(o),f=l.getRootProps(pr({state:u,props:t.getRootProps({})},n)),g=p("div",pr({class:r.root},f)),m=p("div",{class:r.detachedContainer,onMouseDown:function(e){e.stopPropagation()}}),h=p("div",{class:r.detachedOverlay,children:[m],onMouseDown:function(){c(!1),t.setIsOpen(!1)}}),b=l.getLabelProps(pr({state:u,props:t.getLabelProps({})},n)),y=p("button",{class:r.submitButton,type:"submit",title:d.submitButtonTitle,children:[$n({environment:o})]}),v=p("label",pr({class:r.label,children:[y]},b)),w=p("button",{class:r.clearButton,type:"reset",title:d.clearButtonTitle,children:[Hn({environment:o})]}),k=p("div",{class:r.loadingIndicator,children:[qn({environment:o})]}),S=cr({class:r.input,environment:o,state:u,getInputProps:l.getInputProps,getInputPropsCore:t.getInputProps,autocompleteScopeApi:n,isDetached:a}),_=p("div",{class:r.inputWrapperPrefix,children:[v,k]}),x=p("div",{class:r.inputWrapperSuffix,children:[w]}),E=p("div",{class:r.inputWrapper,children:[S]}),O=l.getFormProps(pr({state:u,props:t.getFormProps({inputElement:S})},n)),P=p("form",pr({class:r.form,children:[_,E,x]},O)),j=l.getPanelProps(pr({state:u,props:t.getPanelProps({})},n)),C=p("div",pr({class:r.panel},j)),T=p("div",{class:r.detachedSearchButtonQuery,textContent:u.query}),I=p("div",{class:r.detachedSearchButtonPlaceholder,hidden:Boolean(u.query),textContent:s});if(a){var A=p("div",{class:r.detachedSearchButtonIcon,children:[$n({environment:o})]}),N=p("button",{type:"button",class:r.detachedSearchButton,onClick:function(){c(!0)},children:[A,I,T]}),L=p("button",{type:"button",class:r.detachedCancelButton,textContent:d.detachedCancelButtonText,onTouchStart:function(e){e.stopPropagation()},onClick:function(){t.setIsOpen(!1),c(!1)}}),R=p("div",{class:r.detachedFormContainer,children:[P,L]});m.appendChild(R),g.appendChild(N)}else g.appendChild(P);return{detachedContainer:m,detachedOverlay:h,detachedSearchButtonQuery:T,detachedSearchButtonPlaceholder:I,inputWrapper:E,input:S,root:g,form:P,label:v,submitButton:y,clearButton:w,loadingIndicator:k,panel:C}}({autocomplete:g.value,autocompleteScopeApi:b,classNames:p.value.renderer.classNames,environment:p.value.core.environment,isDetached:f.value,placeholder:p.value.core.placeholder,propGetters:h,setIsModalOpen:_,state:m.current,translations:p.value.renderer.translations})}));function w(){Yn(v.value.panel,{style:f.value?{}:No({panelPlacement:p.value.renderer.panelPlacement,container:v.value.root,form:v.value.form,environment:p.value.core.environment})})}function k(e){m.current=e;var t={autocomplete:g.value,autocompleteScopeApi:b,classNames:p.value.renderer.classNames,components:p.value.renderer.components,container:p.value.renderer.container,html:y.value,dom:v.value,panelContainer:f.value?v.value.detachedContainer:p.value.renderer.panelContainer,propGetters:h,state:m.current,renderer:p.value.renderer.renderer},n=!Fn(e)&&!c.current&&p.value.renderer.renderNoResults||p.value.renderer.render;!function(e){var t=e.autocomplete,n=e.autocompleteScopeApi,r=e.dom,o=e.propGetters,a=e.state;Kn(r.root,o.getRootProps(Fo({state:a,props:t.getRootProps({})},n))),Kn(r.input,o.getInputProps(Fo({state:a,props:t.getInputProps({inputElement:r.input}),inputElement:r.input},n))),Yn(r.label,{hidden:"stalled"===a.status}),Yn(r.loadingIndicator,{hidden:"stalled"!==a.status}),Yn(r.clearButton,{hidden:!a.query}),Yn(r.detachedSearchButtonQuery,{textContent:a.query}),Yn(r.detachedSearchButtonPlaceholder,{hidden:Boolean(a.query)})}(t),function(e,t){var n=t.autocomplete,r=t.autocompleteScopeApi,o=t.classNames,a=t.html,i=t.dom,s=t.panelContainer,l=t.propGetters,c=t.state,u=t.components,d=t.renderer;if(c.isOpen){s.contains(i.panel)||"loading"===c.status||s.appendChild(i.panel),i.panel.classList.toggle("aa-Panel--stalled","stalled"===c.status);var p=c.collections.filter((function(e){var t=e.source,n=e.items;return t.templates.noResults||n.length>0})).map((function(e,t){var i=e.source,s=e.items;return d.createElement("section",{key:t,className:o.source,"data-autocomplete-source-id":i.sourceId},i.templates.header&&d.createElement("div",{className:o.sourceHeader},i.templates.header({components:u,createElement:d.createElement,Fragment:d.Fragment,items:s,source:i,state:c,html:a})),i.templates.noResults&&0===s.length?d.createElement("div",{className:o.sourceNoResults},i.templates.noResults({components:u,createElement:d.createElement,Fragment:d.Fragment,source:i,state:c,html:a})):d.createElement("ul",Ro({className:o.list},l.getListProps(Fo({state:c,props:n.getListProps({sourceIndex:t})},r))),s.map((function(e){var s=n.getItemProps({item:e,source:i,sourceIndex:t});return d.createElement("li",Ro({key:s.id,className:o.item},l.getItemProps(Fo({state:c,props:s},r))),i.templates.item({components:u,createElement:d.createElement,Fragment:d.Fragment,item:e,state:c,html:a}))}))),i.templates.footer&&d.createElement("div",{className:o.sourceFooter},i.templates.footer({components:u,createElement:d.createElement,Fragment:d.Fragment,items:s,source:i,state:c,html:a})))})),f=d.createElement(d.Fragment,null,d.createElement("div",{className:o.panelLayout},p),d.createElement("div",{className:"aa-GradientBottom"})),g=p.reduce((function(e,t){return e[t.props["data-autocomplete-source-id"]]=t,e}),{});e(Fo(Fo({children:f,state:c,sections:p,elements:g},d),{},{components:u,html:a},r),i.panel)}else s.contains(i.panel)&&s.removeChild(i.panel)}(n,t)}function S(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};o();var t,n,r=p.value.renderer,i=r.components,s=Jo(r,Ko);u.current=qo(s,p.value.core,{components:(t=i,n=function(e){return!e.value.hasOwnProperty("__autocomplete_componentName")},Object.entries(t).reduce((function(e,t){var r=Go(t,2),o=r[0],a=r[1];return n({key:o,value:a})?Zo(Zo({},e),{},Wo({},o,a)):e}),{})),initialState:m.current},e),l(),a(),g.value.refresh().then((function(){k(m.current)}))}function _(e){requestAnimationFrame((function(){var t=p.value.core.environment.document.body.contains(v.value.detachedOverlay);e!==t&&(e?(p.value.core.environment.document.body.appendChild(v.value.detachedOverlay),p.value.core.environment.document.body.classList.add("aa-Detached"),v.value.input.focus()):(p.value.core.environment.document.body.removeChild(v.value.detachedOverlay),p.value.core.environment.document.body.classList.remove("aa-Detached")))}))}return r((function(){var e=g.value.getEnvironmentProps({formElement:v.value.form,panelElement:v.value.panel,inputElement:v.value.input});return Yn(p.value.core.environment,e),function(){Yn(p.value.core.environment,Object.keys(e).reduce((function(e,t){return ta(ta({},e),{},na({},t,void 0))}),{}))}})),r((function(){var e=f.value?p.value.core.environment.document.body:p.value.renderer.panelContainer,t=f.value?v.value.detachedOverlay:v.value.panel;return f.value&&m.current.isOpen&&_(!0),k(m.current),function(){e.contains(t)&&e.removeChild(t)}})),r((function(){var e=p.value.renderer.container;return e.appendChild(v.value.root),function(){e.removeChild(v.value.root)}})),r((function(){var e=Mn((function(e){k(e.state)}),0);return d.current=function(t){var n=t.state,r=t.prevState;(f.value&&r.isOpen!==n.isOpen&&_(n.isOpen),f.value||!n.isOpen||r.isOpen||w(),n.query!==r.query)&&p.value.core.environment.document.querySelectorAll(".aa-Panel--scrollable").forEach((function(e){0!==e.scrollTop&&(e.scrollTop=0)}));e({state:n})},function(){d.current=void 0}})),r((function(){var e=Mn((function(){var e=f.value;f.value=p.value.core.environment.matchMedia(p.value.renderer.detachedMediaQuery).matches,e!==f.value?S({}):requestAnimationFrame(w)}),20);return p.value.core.environment.addEventListener("resize",e),function(){p.value.core.environment.removeEventListener("resize",e)}})),r((function(){if(!f.value)return function(){};function e(e){v.value.detachedContainer.classList.toggle("aa-DetachedContainer--modal",e)}function t(t){e(t.matches)}var n=p.value.core.environment.matchMedia(getComputedStyle(p.value.core.environment.document.documentElement).getPropertyValue("--aa-detached-modal-media-query"));e(n.matches);var r=Boolean(n.addEventListener);return r?n.addEventListener("change",t):n.addListener(t),function(){r?n.removeEventListener("change",t):n.removeListener(t)}})),r((function(){return requestAnimationFrame(w),function(){}})),ta(ta({},b),{},{update:S,destroy:function(){o()}})}var oa=n(79722);const aa=n(72278),ia=aa;var sa=n(813),la=n.n(sa);function ca(){const e=(0,s.TH)(),t=(0,s.k6)(),{siteConfig:{baseUrl:n}}=(0,le.Z)(),[o,a]=(0,r.useState)({terms:[],isDocsOrBlog:!1});return(0,r.useEffect)((()=>{if(!e.state?.cmfcmfhighlight||0===e.state.cmfcmfhighlight.terms.length)return;a(e.state.cmfcmfhighlight);const{cmfcmfhighlight:n,...r}=e.state;t.replace({...e,state:r})}),[e.state?.cmfcmfhighlight,t,e]),(0,r.useEffect)((()=>{if(0===o.terms.length)return;const e=o.isDocsOrBlog?document.getElementsByTagName("article")[0]:document.getElementsByTagName("main")[0];if(!e)return;const t=new(la())(e),n={ignoreJoiners:!0};return t.mark(o.terms,n),()=>t.unmark(n)}),[o,n]),null}var ua=n(2591),da=n(90356);function pa(e){let{document:t}=e;const[n,r]=t.sectionRoute.split("#");let o=n;return r&&(o+="#"+r),o}const fa={documents:[],index:ia((function(){this.ref("id"),this.field("title"),this.field("content")}))};const ga=()=>{const e=(0,B.Z)(),[t,o]=(0,r.useState)((()=>!!e&&"dark"===document.documentElement.getAttribute("data-theme")));(0,r.useEffect)((()=>{const e=new MutationObserver((()=>{o("dark"===document.documentElement.getAttribute("data-theme"))}));return e.observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]}),()=>e.disconnect()}),[]);const{siteConfig:{baseUrl:a}}=(0,le.Z)(),{titleBoost:i,contentBoost:c,tagsBoost:u,parentCategoriesBoost:d,indexDocSidebarParentCategories:p,maxSearchResults:f}=(0,ua.eZ)("@cmfcmf/docusaurus-search-local"),g=(0,s.k6)(),{tags:m}=function(){const{i18n:e}=(0,le.Z)(),t=n(48878).z1(),r=[da.H,...t];return{locale:e.currentLocale,tags:r}}(),h=(0,r.useRef)(m);(0,r.useEffect)((()=>{h.current=m}),[m]);const b=(0,r.useRef)({}),y=async e=>{const t=b.current[e];switch(t?.state){case"ready":return t;case void 0:{const t=[];b.current[e]={state:"loading",callbacks:t};const n=await async function(e,t){{let r;try{const n=await fetch(`${e}search-index-${t}.json`);if(!n.ok)return fa;r=await n.json()}catch(n){return fa}return{documents:r.documents,index:ia.Index.load(r.index)}}}(a,e);return t.forEach((e=>e(n))),b.current[e]={state:"ready",...n}}case"loading":return new Promise((e=>{t.callbacks.push(e)}))}},v=(0,l.I)({message:"cmfcmf/d-s-l.searchBar.placeholder",description:"Placeholder shown in the searchbar"}),w=(0,r.useRef)(null),k=(0,r.useRef)(null);return(0,r.useEffect)((()=>{if(w.current)return k.current=ra({container:w.current,placeholder:v,renderer:{createElement:r.createElement,Fragment:r.Fragment,render:be.render},navigator:{navigate(e){let{item:t,itemUrl:n}=e;g.push(n,{cmfcmfhighlight:{terms:t.terms,isDocsOrBlog:"docs"===t.document.type||"blog"===t.document.type}})}},detachedMediaQuery:"",defaultActiveItemId:0,translations:{clearButtonTitle:(0,l.I)({message:"cmfcmf/d-s-l.searchBar.clearButtonTitle",description:"Title of the button to clear the current search input"}),detachedCancelButtonText:(0,l.I)({message:"cmfcmf/d-s-l.searchBar.detachedCancelButtonText",description:"Text of the button to close the detached search window"}),submitButtonTitle:(0,l.I)({message:"cmfcmf/d-s-l.searchBar.submitButtonTitle",description:"Title of the button to submit a new search"})},getSources(e){let{query:t}=e;return[{sourceId:"search-results",templates:{item(e){let{item:t}=e;const n=pa(t);return r.createElement("a",{href:n,className:"aa-ItemLink",onClick:e=>{e.preventDefault(),g.push(n,{cmfcmfhighlight:{terms:t.terms,isDocsOrBlog:"docs"===t.document.type||"blog"===t.document.type}})}},r.createElement("div",{className:"aa-ItemContent"},r.createElement("div",{className:"aa-ItemContentBody"},r.createElement("div",{className:"aa-ItemContentTitle"},t.document.sectionTitle),t.document.pageTitle!==t.document.sectionTitle&&r.createElement("div",{className:"aa-ItemContentDescription"},t.document.pageTitle))),r.createElement("div",{className:"aa-ItemActions"},r.createElement("button",{className:"aa-ItemActionButton aa-DesktopOnly aa-ActiveOnly",type:"button",title:"Select"},r.createElement("svg",{viewBox:"0 0 24 24",width:"20",height:"20",fill:"currentColor"},r.createElement("path",{d:"M18.984 6.984h2.016v6h-15.188l3.609 3.609-1.406 1.406-6-6 6-6 1.406 1.406-3.609 3.609h13.172v-4.031z"})))))},noResults:()=>r.createElement("div",{className:"aa-ItemContent"},r.createElement("div",{className:"aa-ItemContentBody"},(0,l.I)({message:"cmfcmf/d-s-l.searchBar.noResults",description:"message shown if no results are found"})))},getItemUrl(e){let{item:t}=e;return pa(t)},async getItems(){const e=h.current,n=await Promise.all(e.map((e=>y(e)))),r=(e=>aa.tokenizer(e).map((e=>e.str)))(t);return n.flatMap((e=>{let{index:t,documents:n}=e;return t.query((e=>{e.term(r,{fields:["title"],boost:i}),e.term(r,{fields:["title"],boost:i,wildcard:ia.Query.wildcard.TRAILING}),e.term(r,{fields:["content"],boost:c}),e.term(r,{fields:["content"],boost:c,wildcard:ia.Query.wildcard.TRAILING}),e.term(r,{fields:["tags"],boost:u}),e.term(r,{fields:["tags"],boost:u,wildcard:ia.Query.wildcard.TRAILING}),p&&(e.term(r,{fields:["sidebarParentCategories"],boost:d}),e.term(r,{fields:["sidebarParentCategories"],boost:d,wildcard:ia.Query.wildcard.TRAILING}))})).slice(0,f).map((e=>({document:n.find((t=>t.id.toString()===e.ref)),score:e.score,terms:r})))})).sort(((e,t)=>t.score-e.score)).slice(0,f)}}]}}),()=>k.current?.destroy()}),[f]),r.createElement(r.Fragment,null,r.createElement(oa.Z,null,r.createElement("body",{"data-theme":t?"dark":"light"})),r.createElement(ca,null),r.createElement("div",{className:"dsla-search-wrapper"},r.createElement("div",{className:"dsla-search-field",ref:w,"data-tags":m.join(",")})))},ma={navbarSearchContainer:"navbarSearchContainer_Bca1"};function ha(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,o.Z)(n,ma.navbarSearchContainer),children:t})}var ba=n(48878),ya=n(68879);var va=n(5055);function wa(e,t){return t.alternateDocVersions[e.name]??function(e){return e.docs.find((t=>t.id===e.mainDocId))}(e)}const ka={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:o="",...a}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,le.Z)(),p=(0,ge.l)(),{search:f,hash:g}=(0,s.TH)(),m=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${g}${o}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],h=t?(0,l.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(fe,{...a,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(me,{className:he}),h]}),items:m})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(ha,{className:n,children:(0,u.jsx)(ga,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:a=!1}=e;const i=a?"li":"div";return(0,u.jsx)(i,{className:(0,o.Z)({navbar__item:!r&&!a,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,ba.Iw)(r),i=(0,ya.vY)(t,r),s=a?.path===i?.path;return null===i||i.unlisted&&!s?null:(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>s||!!a?.sidebar&&a.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,ba.Iw)(r),i=(0,ya.oz)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>a?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const a=(0,ya.lO)(r)[0],i=t??a.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(a).path;return(0,u.jsx)(ae,{...o,label:i,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:a,...i}=e;const{search:c,hash:d}=(0,s.TH)(),p=(0,ba.Iw)(n),f=(0,ba.gB)(n),{savePreferredVersionName:g}=(0,va.J)(n),m=[...o,...f.map((function(e){const t=wa(e,p);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>g(e.name)}})),...a],h=(0,ya.lO)(n)[0],b=t&&m.length>1?(0,l.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):h.label,y=t&&m.length>1?void 0:wa(h,p).path;return m.length<=1?(0,u.jsx)(ae,{...i,mobile:t,label:b,to:y,isActive:r?()=>!1:void 0}):(0,u.jsx)(fe,{...i,mobile:t,label:b,to:y,items:m,isActive:r?()=>!1:void 0})}},Sa=ka;function _a(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=Sa[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(o,{...n})}function xa(){const e=(0,C.e)(),t=(0,w.L)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(_a,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ea(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(l.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function Oa(){const e=0===(0,w.L)().navbar.items.length,t=D();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Ea,{onClick:()=>t.hide()}),t.content]})}function Pa(){const e=(0,C.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,u.jsx)(F,{header:(0,u.jsx)(Y,{}),primaryMenu:(0,u.jsx)(xa,{}),secondaryMenu:(0,u.jsx)(Oa,{})}):null}const ja={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ca(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.Z)("navbar-sidebar__backdrop",e.className)})}function Ta(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,w.L)(),i=(0,C.e)(),{navbarRef:s,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,T.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=s?n(!1):i+c{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:s,"aria-label":(0,l.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.Z)("navbar","navbar--fixed-top",n&&[ja.navbarHideable,!d&&ja.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Ca,{onClick:i.toggle}),(0,u.jsx)(Pa,{})]})}var Ia=n(48820);const Aa={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function Na(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(l.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function La(e){let{error:t}=e;const n=(0,Ia.BN)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:Aa.errorBoundaryError,children:n})}class Ra extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Da="right";function Fa(e){let{width:t=30,height:n=30,className:r,...o}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...o,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function Ma(){const{toggle:e,shown:t}=(0,C.e)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,l.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(Fa,{})})}const Ba={colorModeToggle:"colorModeToggle_DEke"};function za(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(Ra,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(_a,{...e})},t)))})}function Ua(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function $a(){const e=(0,C.e)(),t=(0,w.L)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??Da)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return(0,u.jsx)(Ua,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(Ma,{}),(0,u.jsx)(W,{}),(0,u.jsx)(za,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(za,{items:r}),(0,u.jsx)(Q,{className:Ba.colorModeToggle}),!o&&(0,u.jsx)(ha,{children:(0,u.jsx)(ga,{})})]})})}function Ha(){return(0,u.jsx)(Ta,{children:(0,u.jsx)($a,{})})}function qa(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:a,...i}=t,s=(0,X.ZP)(n),l=(0,X.ZP)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(K.Z,{className:"footer__link-item",...r?{href:a?l:r}:{to:s},...i,children:[o,r&&!(0,J.Z)(r)&&(0,u.jsx)(te.Z,{})]})}function Va(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(qa,{item:t})},t.href??t.to)}function Qa(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(Va,{item:e},t)))})]})}function Za(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(Qa,{column:e},t)))})}function Wa(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function Ga(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(qa,{item:t})}function Ya(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(Ga,{item:e}),t.length!==n+1&&(0,u.jsx)(Wa,{})]},n)))})})}function Ka(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(Za,{columns:t}):(0,u.jsx)(Ya,{links:t})}var Xa=n(64553);const Ja={footerLogoLink:"footerLogoLink_BH7S"};function ei(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.Cg)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(Xa.Z,{className:(0,o.Z)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function ti(e){let{logo:t}=e;return t.href?(0,u.jsx)(K.Z,{href:t.href,className:Ja.footerLogoLink,target:t.target,children:(0,u.jsx)(ei,{logo:t})}):(0,u.jsx)(ei,{logo:t})}function ni(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function ri(e){let{style:t,links:n,logo:r,copyright:a}=e;return(0,u.jsx)("footer",{className:(0,o.Z)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||a)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),a]})]})})}function oi(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(ri,{style:o,links:n&&n.length>0&&(0,u.jsx)(Ka,{links:n}),logo:r&&(0,u.jsx)(ti,{logo:r}),copyright:t&&(0,u.jsx)(ni,{copyright:t})})}const ai=r.memo(oi),ii=(0,I.Qc)([M.S,k.p,T.OC,va.L5,i.VC,function(e){let{children:t}=e;return(0,u.jsx)(A.n2,{children:(0,u.jsx)(C.M,{children:(0,u.jsx)(L,{children:t})})})}]);function si(e){let{children:t}=e;return(0,u.jsx)(ii,{children:t})}var li=n(42704);function ci(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(li.Z,{as:"h1",className:"hero__title",children:(0,u.jsx)(l.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(Na,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(La,{error:t})})]})})})}const ui={mainWrapper:"mainWrapper_z2l0"};function di(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,b.t)(),(0,u.jsxs)(si,{children:[(0,u.jsx)(i.d,{title:s,description:l}),(0,u.jsx)(v,{}),(0,u.jsx)(j,{}),(0,u.jsx)(Ha,{}),(0,u.jsx)("div",{id:d,className:(0,o.Z)(h.k.wrapper.main,ui.mainWrapper,r),children:(0,u.jsx)(a.Z,{fallback:e=>(0,u.jsx)(ci,{...e}),children:t})}),!n&&(0,u.jsx)(ai,{})]})}},82546:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});n(67294);var r=n(38208),o=n(23466),a=n(75276),i=n(39581),s=n(64553),l=n(85893);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,o.ZP)(t.src),dark:(0,o.ZP)(t.srcDark||t.src)},i=(0,l.jsx)(s.Z,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,a.Z)(),{navbar:{title:n,logo:s}}=(0,i.L)(),{imageClassName:u,titleClassName:d,...p}=e,f=(0,o.ZP)(s?.href||"/"),g=n?"":t,m=s?.alt??g;return(0,l.jsxs)(r.Z,{to:f,...p,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(c,{logo:s,alt:m,imageClassName:u}),null!=n&&(0,l.jsx)("b",{className:d,children:n})]})}},62362:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});n(67294);var r=n(79722),o=n(85893);function a(e){let{locale:t,version:n,tag:a}=e;const i=t;return(0,o.jsxs)(r.Z,{children:[t&&(0,o.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,o.jsx)("meta",{name:"docusaurus_version",content:n}),a&&(0,o.jsx)("meta",{name:"docusaurus_tag",content:a}),i&&(0,o.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,o.jsx)("meta",{name:"docsearch:version",content:n}),a&&(0,o.jsx)("meta",{name:"docsearch:docusaurus_tag",content:a})]})}},64553:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(67294),o=n(788),a=n(45025),i=n(61503);const s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(85893);function c(e){let{className:t,children:n}=e;const c=(0,a.Z)(),{colorMode:u}=(0,i.I)();return(0,l.jsx)(l.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const a=n({theme:e,className:(0,o.Z)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:a},e)}))})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,l.jsx)(c,{className:n,children:e=>{let{theme:n,className:a}=e;return(0,l.jsx)("img",{src:t[n],alt:r,className:a,...o})}})}},93841:(e,t,n)=>{"use strict";n.d(t,{u:()=>c,z:()=>b});var r=n(67294),o=n(29629),a=n(1290),i=n(68048),s=n(85893);const l="ease-in-out";function c(e){let{initialState:t}=e;const[n,o]=(0,r.useState)(t??!1),a=(0,r.useCallback)((()=>{o((e=>!e))}),[]);return{collapsed:n,setCollapsed:o,toggleCollapsed:a}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:o}=e;const a=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=o?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${o?.easing??l}`,height:`${t}px`}}function s(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return p(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,o])}function g(e){if(!o.Z.canUseDOM)return e?u:d}function m(e){let{as:t="div",collapsed:n,children:o,animation:a,onCollapseTransitionEnd:i,className:l,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:a}),(0,s.jsx)(t,{ref:u,style:c?void 0:g(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(u.current,n),i?.(n))},className:l,children:o})}function h(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[l,c]=(0,r.useState)(t);return(0,a.Z)((()=>{t||i(!0)}),[t]),(0,a.Z)((()=>{o&&c(t)}),[o,t]),o?(0,s.jsx)(m,{...n,collapsed:l}):null}function b(e){let{lazy:t,...n}=e;const r=t?h:m;return(0,s.jsx)(r,{...n})}},25461:(e,t,n)=>{"use strict";n.d(t,{n:()=>m,p:()=>g});var r=n(67294),o=n(45025),a=n(1606),i=n(20585),s=n(39581),l=n(85893);const c=(0,a.WA)("docusaurus.announcement.dismiss"),u=(0,a.WA)("docusaurus.announcement.id"),d=()=>"true"===c.get(),p=e=>c.set(String(e)),f=r.createContext(null);function g(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.L)(),t=(0,o.Z)(),[n,a]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{a(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&p(!1),!r&&d()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,l.jsx)(f.Provider,{value:n,children:t})}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},61503:(e,t,n)=>{"use strict";n.d(t,{I:()=>b,S:()=>h});var r=n(67294),o=n(29629),a=n(20585),i=n(1606),s=n(39581),l=n(85893);const c=r.createContext(void 0),u="theme",d=(0,i.WA)(u),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,g=e=>o.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{d.set(f(e))};function h(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.L)(),[o,a]=(0,r.useState)(g(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(a(t),o&&m(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:i,get isDarkTheme(){return o===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[o,i])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function b(){const e=(0,r.useContext)(c);if(null==e)throw new a.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},44160:(e,t,n)=>{"use strict";n.d(t,{M:()=>p,e:()=>f});var r=n(67294),o=n(5689),a=n(62550),i=n(39222),s=n(39581),l=n(20585),c=n(85893);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,o.HY)(),{items:t}=(0,s.L)().navbar;return 0===t.length&&!e.component}(),t=(0,a.i)(),n=!e&&"mobile"===t,[l,c]=(0,r.useState)(!1);(0,i.Rb)((()=>{if(l)return c(!1),!1}));const u=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:l})),[e,n,u,l])}function p(e){let{children:t}=e;const n=d();return(0,c.jsx)(u.Provider,{value:n,children:t})}function f(){const e=r.useContext(u);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},5689:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>c,n2:()=>s});var r=n(67294),o=n(20585),a=n(85893);const i=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(!e)throw new o.i6("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const a=(0,r.useContext)(i);if(!a)throw new o.i6("NavbarSecondaryMenuContentProvider");const[,s]=a,l=(0,o.Ql)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},95099:(e,t,n)=>{"use strict";n.d(t,{h:()=>o,t:()=>a});var r=n(67294);const o="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},62550:(e,t,n)=>{"use strict";n.d(t,{i:()=>s});var r=n(67294),o=n(29629);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,s]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){s(function(e){if(!o.Z.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?a.desktop:a.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},50563:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",blogAuthorsListPage:"blog-authors-list-page",blogAuthorsPostsPage:"blog-authors-posts-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",draftBanner:"theme-draft-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},68048:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},39222:(e,t,n)=>{"use strict";n.d(t,{Rb:()=>i,_X:()=>l});var r=n(67294),o=n(16550),a=n(20585);function i(e){!function(e){const t=(0,o.k6)(),n=(0,a.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){const t=(0,o.k6)();return(0,r.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}function l(e){return s((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}},79113:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function o(e){return Array.from(new Set(e))}function a(e,t){const n={};let r=0;for(const o of e){const e=t(o,r);n[e]??=[],n[e].push(o),r+=1}return n}n.d(t,{jj:()=>o,lx:()=>r,vM:()=>a})},96984:(e,t,n)=>{"use strict";n.d(t,{FG:()=>p,d:()=>u,VC:()=>f});var r=n(67294),o=n(788),a=n(79722),i=n(3675),s=n(23466),l=n(75276);var c=n(85893);function u(e){let{title:t,description:n,keywords:r,image:o,children:i}=e;const u=function(e){const{siteConfig:t}=(0,l.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.Cg)(),p=o?d(o,{absolute:!0}):void 0;return(0,c.jsxs)(a.Z,{children:[t&&(0,c.jsx)("title",{children:u}),t&&(0,c.jsx)("meta",{property:"og:title",content:u}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,c.jsx)("meta",{property:"og:image",content:p}),p&&(0,c.jsx)("meta",{name:"twitter:image",content:p}),i]})}const d=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(d),s=(0,o.Z)(i,t);return(0,c.jsxs)(d.Provider,{value:s,children:[(0,c.jsx)(a.Z,{children:(0,c.jsx)("html",{className:s})}),n]})}function f(e){let{children:t}=e;const n=(0,i.Z)(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const a=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(p,{className:(0,o.Z)(r,a),children:t})}},20585:(e,t,n)=>{"use strict";n.d(t,{D9:()=>s,Qc:()=>u,Ql:()=>c,i6:()=>l,zX:()=>i});var r=n(67294),o=n(1290),a=n(85893);function i(e){const t=(0,r.useRef)(e);return(0,o.Z)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,r.useRef)();return(0,o.Z)((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,a.jsx)(a.Fragment,{children:e.reduceRight(((e,t)=>(0,a.jsx)(t,{children:e})),n)})}}},51997:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>s});var r=n(67294),o=n(78179),a=n(75276);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,a.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>e.routes??[])))}(n)}({routes:o.Z,baseUrl:e})),[e])}},18119:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>m,OC:()=>u,RF:()=>f,o5:()=>g});var r=n(67294),o=n(29629),a=n(45025),i=n(1290),s=n(20585),l=n(85893);const c=r.createContext(void 0);function u(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function d(){const e=(0,r.useContext)(c);if(null==e)throw new s.i6("ScrollControllerProvider");return e}const p=()=>o.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=d(),o=(0,r.useRef)(p()),a=(0,s.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=p();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function g(){const e=d(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),o=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,i.Z)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:o}}function m(){const e=(0,r.useRef)(null),t=(0,a.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&ot&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},90356:(e,t,n)=>{"use strict";n.d(t,{H:()=>r});const r="default"},1606:(e,t,n)=>{"use strict";n.d(t,{WA:()=>u,Nk:()=>d});var r=n(67294);const o=JSON.parse('{"d":"localStorage","u":""}'),a=o.d;function i(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function s(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,l||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),l=!0),null}var t}let l=!1;const c={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(e,t){const n=`${e}${o.u}`;if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(n);const r=s(t?.persistence);return null===r?c:{get:()=>{try{return r.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=r.getItem(n);r.setItem(n,e),i({key:n,oldValue:t,newValue:e,storage:r})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=r.getItem(n);r.removeItem(n),i({key:n,oldValue:e,newValue:null,storage:r})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===r&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}function d(e,t){const n=(0,r.useRef)((()=>null===e?c:u(e,t))).current(),o=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,r.useSyncExternalStore)(o,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},76862:(e,t,n)=>{"use strict";n.d(t,{l:()=>i});var r=n(75276),o=n(16550),a=n(48820);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:s}}=(0,r.Z)(),{pathname:l}=(0,o.TH)(),c=(0,a.Do)(l,{trailingSlash:n,baseUrl:e}),u=s===i?e:e.replace(`/${s}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},89062:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(67294),o=n(16550),a=n(20585);function i(e){const t=(0,o.TH)(),n=(0,a.D9)(t),i=(0,a.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},39581:(e,t,n)=>{"use strict";n.d(t,{L:()=>o});var r=n(75276);function o(){return(0,r.Z)().siteConfig.themeConfig}},38761:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addTrailingSlash=o,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[i]=e.split(/[#?]/),s="/"===i||i===r?i:(l=i,c=n,c?o(l):a(l));var l,c;return e.replace(i,s)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=a;const r=n(67518);function o(e){return e.endsWith("/")?e:`${e}/`}function a(e){return(0,r.removeSuffix)(e,"/")}},39007:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=function e(t){if(t.cause)return[t,...e(t.cause)];return[t]}},48820:(e,t,n)=>{"use strict";t.BN=t.Do=t.uR=void 0;const r=n(97582);t.uR="__blog-post-container";var o=n(38761);Object.defineProperty(t,"Do",{enumerable:!0,get:function(){return r.__importDefault(o).default}});var a=n(67518);var i=n(39007);Object.defineProperty(t,"BN",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},67518:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){if(""===t)return e;return e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},99318:(e,t,n)=>{"use strict";n.d(t,{lX:()=>w,q_:()=>O,ob:()=>f,PP:()=>j,Ep:()=>p});var r=n(83117);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r=0;p--){var f=i[p];"."===f?a(i,p):".."===f?(a(i,p),d++):d&&(a(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&o(i[0])||i.unshift("");var g=i.join("/");return n&&"/"!==g.substr(-1)&&(g+="/"),g};var s=n(38776);function l(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function f(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.Z)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function g(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=f(e,t,m(),w.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(w.entries[w.index]=o,d({action:r,location:o}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(21296),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,g=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(g){var o=f(n);o&&o!==g&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),m=l(n),h=0;h{"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,o=n?Symbol.for("react.portal"):60106,a=n?Symbol.for("react.fragment"):60107,i=n?Symbol.for("react.strict_mode"):60108,s=n?Symbol.for("react.profiler"):60114,l=n?Symbol.for("react.provider"):60109,c=n?Symbol.for("react.context"):60110,u=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,p=n?Symbol.for("react.forward_ref"):60112,f=n?Symbol.for("react.suspense"):60113,g=n?Symbol.for("react.suspense_list"):60120,m=n?Symbol.for("react.memo"):60115,h=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,y=n?Symbol.for("react.fundamental"):60117,v=n?Symbol.for("react.responder"):60118,w=n?Symbol.for("react.scope"):60119;function k(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case u:case d:case a:case s:case i:case f:return e;default:switch(e=e&&e.$$typeof){case c:case p:case h:case m:case l:return e;default:return t}}case o:return t}}}function S(e){return k(e)===d}t.AsyncMode=u,t.ConcurrentMode=d,t.ContextConsumer=c,t.ContextProvider=l,t.Element=r,t.ForwardRef=p,t.Fragment=a,t.Lazy=h,t.Memo=m,t.Portal=o,t.Profiler=s,t.StrictMode=i,t.Suspense=f,t.isAsyncMode=function(e){return S(e)||k(e)===u},t.isConcurrentMode=S,t.isContextConsumer=function(e){return k(e)===c},t.isContextProvider=function(e){return k(e)===l},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return k(e)===p},t.isFragment=function(e){return k(e)===a},t.isLazy=function(e){return k(e)===h},t.isMemo=function(e){return k(e)===m},t.isPortal=function(e){return k(e)===o},t.isProfiler=function(e){return k(e)===s},t.isStrictMode=function(e){return k(e)===i},t.isSuspense=function(e){return k(e)===f},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===a||e===d||e===s||e===i||e===f||e===g||"object"==typeof e&&null!==e&&(e.$$typeof===h||e.$$typeof===m||e.$$typeof===l||e.$$typeof===c||e.$$typeof===p||e.$$typeof===y||e.$$typeof===v||e.$$typeof===w||e.$$typeof===b)},t.typeOf=k},21296:(e,t,n)=>{"use strict";e.exports=n(96103)},41143:e=>{"use strict";e.exports=function(e,t,n,r,o,a,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,a,i,s],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},813:function(e){e.exports=function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n1&&void 0!==arguments[1])||arguments[1],o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=o,this.iframesTimeout=a}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach((function(t){var n=e.filter((function(e){return e.contains(t)})).length>0;-1!==e.indexOf(t)||n||e.push(t)})),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var o=e.contentWindow;if(r=o.document,!o||!r)throw new Error("iframe inaccessible")}catch(a){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,o=!1,a=null,i=function i(){if(!o){o=!0,clearTimeout(a);try{r.isIframeBlank(e)||(e.removeEventListener("load",i),r.getIframeContents(e,t,n))}catch(s){n()}}};e.addEventListener("load",i),a=setTimeout(i,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(r){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,(function(){return!0}),(function(e){r++,n.waitForIframes(e.querySelector("html"),(function(){--r||t()}))}),(function(e){e||t()}))}},{key:"forEachIframe",value:function(t,n,r){var o=this,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},i=t.querySelectorAll("iframe"),s=i.length,l=0;i=Array.prototype.slice.call(i);var c=function(){--s<=0&&a(l)};s||c(),i.forEach((function(t){e.matches(t,o.exclude)?c():o.onIframeReady(t,(function(e){n(t)&&(l++,r(e)),c()}),c)}))}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:(null===t||e.nextNode())&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var o=!1,a=!1;return r.forEach((function(e,t){e.val===n&&(o=t,a=e.handled)})),this.compareNodeIframe(e,t,n)?(!1!==o||a?!1===o||a||(r[o].handled=!0):r.push({val:n,handled:!0}),!0):(!1===o&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var o=this;e.forEach((function(e){e.handled||o.getIframeContents(e.val,(function(e){o.createInstanceOnIframe(e).forEachNode(t,n,r)}))}))}},{key:"iterateThroughNodes",value:function(e,t,n,r,o){for(var a=this,i=this.createIterator(t,e,r),s=[],l=[],c=void 0,u=void 0,d=function(){var e=a.getIteratorNode(i);return u=e.prevNode,c=e.node};d();)this.iframes&&this.forEachIframe(t,(function(e){return a.checkIframeFilter(c,u,e,s)}),(function(t){a.createInstanceOnIframe(t).forEachNode(e,(function(e){return l.push(e)}),r)})),l.push(c);l.forEach((function(e){n(e)})),this.iframes&&this.handleOpenIframes(s,e,n,r),o()}},{key:"forEachNode",value:function(e,t,n){var r=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},a=this.getContexts(),i=a.length;i||o(),a.forEach((function(a){var s=function(){r.iterateThroughNodes(e,a,t,n,(function(){--i<=0&&o()}))};r.iframes?r.waitForIframes(a,s):s()}))}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var o=!1;return n.every((function(t){return!r.call(e,t)||(o=!0,!1)})),o}return!1}}]),e}(),a=function(){function a(e){t(this,a),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(a,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createRegExp",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e)}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var o in t)if(t.hasOwnProperty(o)){var a=t[o],i="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(o):this.escapeStr(o),s="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(a):this.escapeStr(a);""!==i&&""!==s&&(e=e.replace(new RegExp("("+this.escapeStr(i)+"|"+this.escapeStr(s)+")","gm"+n),r+"("+this.processSynomyms(i)+"|"+this.processSynomyms(s)+")"+r))}return e}},{key:"processSynomyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,(function(e){return"\\"===e.charAt(0)?"?":"\x01"}))).replace(/(?:\\)*\*/g,(function(e){return"\\"===e.charAt(0)?"*":"\x02"}))}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,(function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"}))}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["a\xe0\xe1\u1ea3\xe3\u1ea1\u0103\u1eb1\u1eaf\u1eb3\u1eb5\u1eb7\xe2\u1ea7\u1ea5\u1ea9\u1eab\u1ead\xe4\xe5\u0101\u0105","A\xc0\xc1\u1ea2\xc3\u1ea0\u0102\u1eb0\u1eae\u1eb2\u1eb4\u1eb6\xc2\u1ea6\u1ea4\u1ea8\u1eaa\u1eac\xc4\xc5\u0100\u0104","c\xe7\u0107\u010d","C\xc7\u0106\u010c","d\u0111\u010f","D\u0110\u010e","e\xe8\xe9\u1ebb\u1ebd\u1eb9\xea\u1ec1\u1ebf\u1ec3\u1ec5\u1ec7\xeb\u011b\u0113\u0119","E\xc8\xc9\u1eba\u1ebc\u1eb8\xca\u1ec0\u1ebe\u1ec2\u1ec4\u1ec6\xcb\u011a\u0112\u0118","i\xec\xed\u1ec9\u0129\u1ecb\xee\xef\u012b","I\xcc\xcd\u1ec8\u0128\u1eca\xce\xcf\u012a","l\u0142","L\u0141","n\xf1\u0148\u0144","N\xd1\u0147\u0143","o\xf2\xf3\u1ecf\xf5\u1ecd\xf4\u1ed3\u1ed1\u1ed5\u1ed7\u1ed9\u01a1\u1edf\u1ee1\u1edb\u1edd\u1ee3\xf6\xf8\u014d","O\xd2\xd3\u1ece\xd5\u1ecc\xd4\u1ed2\u1ed0\u1ed4\u1ed6\u1ed8\u01a0\u1ede\u1ee0\u1eda\u1edc\u1ee2\xd6\xd8\u014c","r\u0159","R\u0158","s\u0161\u015b\u0219\u015f","S\u0160\u015a\u0218\u015e","t\u0165\u021b\u0163","T\u0164\u021a\u0162","u\xf9\xfa\u1ee7\u0169\u1ee5\u01b0\u1eeb\u1ee9\u1eed\u1eef\u1ef1\xfb\xfc\u016f\u016b","U\xd9\xda\u1ee6\u0168\u1ee4\u01af\u1eea\u1ee8\u1eec\u1eee\u1ef0\xdb\xdc\u016e\u016a","y\xfd\u1ef3\u1ef7\u1ef9\u1ef5\xff","Y\xdd\u1ef2\u1ef6\u1ef8\u1ef4\u0178","z\u017e\u017c\u017a","Z\u017d\u017b\u0179"]:["a\xe0\xe1\u1ea3\xe3\u1ea1\u0103\u1eb1\u1eaf\u1eb3\u1eb5\u1eb7\xe2\u1ea7\u1ea5\u1ea9\u1eab\u1ead\xe4\xe5\u0101\u0105A\xc0\xc1\u1ea2\xc3\u1ea0\u0102\u1eb0\u1eae\u1eb2\u1eb4\u1eb6\xc2\u1ea6\u1ea4\u1ea8\u1eaa\u1eac\xc4\xc5\u0100\u0104","c\xe7\u0107\u010dC\xc7\u0106\u010c","d\u0111\u010fD\u0110\u010e","e\xe8\xe9\u1ebb\u1ebd\u1eb9\xea\u1ec1\u1ebf\u1ec3\u1ec5\u1ec7\xeb\u011b\u0113\u0119E\xc8\xc9\u1eba\u1ebc\u1eb8\xca\u1ec0\u1ebe\u1ec2\u1ec4\u1ec6\xcb\u011a\u0112\u0118","i\xec\xed\u1ec9\u0129\u1ecb\xee\xef\u012bI\xcc\xcd\u1ec8\u0128\u1eca\xce\xcf\u012a","l\u0142L\u0141","n\xf1\u0148\u0144N\xd1\u0147\u0143","o\xf2\xf3\u1ecf\xf5\u1ecd\xf4\u1ed3\u1ed1\u1ed5\u1ed7\u1ed9\u01a1\u1edf\u1ee1\u1edb\u1edd\u1ee3\xf6\xf8\u014dO\xd2\xd3\u1ece\xd5\u1ecc\xd4\u1ed2\u1ed0\u1ed4\u1ed6\u1ed8\u01a0\u1ede\u1ee0\u1eda\u1edc\u1ee2\xd6\xd8\u014c","r\u0159R\u0158","s\u0161\u015b\u0219\u015fS\u0160\u015a\u0218\u015e","t\u0165\u021b\u0163T\u0164\u021a\u0162","u\xf9\xfa\u1ee7\u0169\u1ee5\u01b0\u1eeb\u1ee9\u1eed\u1eef\u1ef1\xfb\xfc\u016f\u016bU\xd9\xda\u1ee6\u0168\u1ee4\u01af\u1eea\u1ee8\u1eec\u1eee\u1ef0\xdb\xdc\u016e\u016a","y\xfd\u1ef3\u1ef7\u1ef9\u1ef5\xffY\xdd\u1ef2\u1ef6\u1ef8\u1ef4\u0178","z\u017e\u017c\u017aZ\u017d\u017b\u0179"],r=[];return e.split("").forEach((function(o){n.every((function(n){if(-1!==n.indexOf(o)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0}))})),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\xa1\xbf",r=this.opt.accuracy,o="string"==typeof r?r:r.value,a="string"==typeof r?[]:r.limiters,i="";switch(a.forEach((function(e){i+="|"+t.escapeStr(e)})),o){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(i="\\s"+(i||this.escapeStr(n)))+"]*"+e+"[^"+i+"]*)";case"exactly":return"(^|\\s"+i+")("+e+")(?=$|\\s"+i+")"}}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach((function(e){t.opt.separateWordSearch?e.split(" ").forEach((function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)})):e.trim()&&-1===n.indexOf(e)&&n.push(e)})),{keywords:n.sort((function(e,t){return t.length-e.length})),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort((function(e,t){return e.start-t.start})).forEach((function(e){var o=t.callNoMatchOnInvalidRanges(e,r),a=o.start,i=o.end;o.valid&&(e.start=a,e.length=i-a,n.push(e),r=i)})),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,o=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?o=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:o}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,o=!0,a=n.length,i=t-a,s=parseInt(e.start,10)-i;return(r=(s=s>a?a:s)+parseInt(e.length,10))>a&&(r=a,this.log("End range automatically set to the max value of "+a)),s<0||r-s<0||s>a||r>a?(o=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(s,r).replace(/\s+/g,"")&&(o=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:s,end:r,valid:o}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,(function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})}),(function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}),(function(){e({value:n,nodes:r})}))}},{key:"matchesExclude",value:function(e){return o.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",o=e.splitText(t),a=o.splitText(n-t),i=document.createElement(r);return i.setAttribute("data-markjs","true"),this.opt.className&&i.setAttribute("class",this.opt.className),i.textContent=o.textContent,o.parentNode.replaceChild(i,o),a}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,o){var a=this;e.nodes.every((function(i,s){var l=e.nodes[s+1];if(void 0===l||l.start>t){if(!r(i.node))return!1;var c=t-i.start,u=(n>i.end?i.end:n)-i.start,d=e.value.substr(0,i.start),p=e.value.substr(u+i.start);if(i.node=a.wrapRangeInTextNode(i.node,c,u),e.value=d+p,e.nodes.forEach((function(t,n){n>=s&&(e.nodes[n].start>0&&n!==s&&(e.nodes[n].start-=u),e.nodes[n].end-=u)})),n-=u,o(i.node.previousSibling,i.start),!(n>i.end))return!1;t=i.end}return!0}))}},{key:"wrapMatches",value:function(e,t,n,r,o){var a=this,i=0===t?0:t+1;this.getTextNodes((function(t){t.nodes.forEach((function(t){t=t.node;for(var o=void 0;null!==(o=e.exec(t.textContent))&&""!==o[i];)if(n(o[i],t)){var s=o.index;if(0!==i)for(var l=1;l{"use strict";n.r(t)},47257:(e,t,n)=>{"use strict";n.r(t)},74865:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function o(e,t,n){return en?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),c=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,u,d)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){l(a,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),s=e?"-100":a(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},57874:()=>{!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var o=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],a=r.variable[1].inside,i=0;i{!function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],o=[];/^\w+$/.test(n)||o.push(/\w+/.exec(n)[0]),"diff"===n&&o.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:o,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(Prism)},29525:()=>{Prism.languages.ini={comment:{pattern:/(^[ \f\t\v]*)[#;][^\n\r]*/m,lookbehind:!0},section:{pattern:/(^[ \f\t\v]*)\[[^\n\r\]]*\]?/m,lookbehind:!0,inside:{"section-name":{pattern:/(^\[[ \f\t\v]*)[^ \f\t\v\]]+(?:[ \f\t\v]+[^ \f\t\v\]]+)*/,lookbehind:!0,alias:"selector"},punctuation:/\[|\]/}},key:{pattern:/(^[ \f\t\v]*)[^ \f\n\r\t\v=]+(?:[ \f\t\v]+[^ \f\n\r\t\v=]+)*(?=[ \f\t\v]*=)/m,lookbehind:!0,alias:"attr-name"},value:{pattern:/(=[ \f\t\v]*)[^ \f\n\r\t\v]+(?:[ \f\t\v]+[^ \f\n\r\t\v]+)*/,lookbehind:!0,alias:"attr-value",inside:{"inner-value":{pattern:/^("|').+(?=\1$)/,lookbehind:!0}}},punctuation:/=/}},96854:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,s=i.length;-1!==n.code.indexOf(o=t(r,s));)++s;return i[s]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(s){for(var l=0;l=a.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=a[o],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),g=p.indexOf(f);if(g>-1){++o;var m=p.substring(0,g),h=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(g+f.length),y=[];m&&y.push.apply(y,i([m])),y.push(h),b&&y.push.apply(y,i([b])),"string"==typeof c?s.splice.apply(s,[l,1].concat(y)):c.content=y}}else c.content&&i(c.content)}return s}(n.tokens)}}}})}(Prism)},86862:()=>{!function(e){var t=e.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:null},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/};t.string[0].inside={function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:t},boolean:t.boolean,variable:t.variable}}(Prism)},24249:(e,t,n)=>{var r={"./prism-bash":57874,"./prism-diff":40728,"./prism-ini":29525,"./prism-powershell":86862};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=24249},92703:(e,t,n)=>{"use strict";var r=n(50414);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},45697:(e,t,n)=>{e.exports=n(92703)()},50414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},64448:(e,t,n)=>{"use strict";var r=n(67294),o=n(63840);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n