First version
This commit is contained in:
commit
f1b96af3f2
28 changed files with 1303 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
public
|
||||
resources
|
||||
.hugo_build.lock
|
22
assets/icons/email.svg
Normal file
22
assets/icons/email.svg
Normal file
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg height="800px" width="800px" version="1.1" id="_x32_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
viewBox="0 0 512 512" xml:space="preserve" class="icon icon-tabler icon-tabler-brand-github">
|
||||
<g>
|
||||
<path fill="currentColor" d="M510.746,110.361c-2.128-10.754-6.926-20.918-13.926-29.463c-1.422-1.794-2.909-3.39-4.535-5.009
|
||||
c-12.454-12.52-29.778-19.701-47.531-19.701H67.244c-17.951,0-34.834,7-47.539,19.708c-1.608,1.604-3.099,3.216-4.575,5.067
|
||||
c-6.97,8.509-11.747,18.659-13.824,29.428C0.438,114.62,0,119.002,0,123.435v265.137c0,9.224,1.874,18.206,5.589,26.745
|
||||
c3.215,7.583,8.093,14.772,14.112,20.788c1.516,1.509,3.022,2.901,4.63,4.258c12.034,9.966,27.272,15.45,42.913,15.45h377.51
|
||||
c15.742,0,30.965-5.505,42.967-15.56c1.604-1.298,3.091-2.661,4.578-4.148c5.818-5.812,10.442-12.49,13.766-19.854l0.438-1.05
|
||||
c3.646-8.377,5.497-17.33,5.497-26.628V123.435C512,119.06,511.578,114.649,510.746,110.361z M34.823,99.104
|
||||
c0.951-1.392,2.165-2.821,3.714-4.382c7.689-7.685,17.886-11.914,28.706-11.914h377.51c10.915,0,21.115,4.236,28.719,11.929
|
||||
c1.313,1.327,2.567,2.8,3.661,4.272l2.887,3.88l-201.5,175.616c-6.212,5.446-14.21,8.443-22.523,8.443
|
||||
c-8.231,0-16.222-2.99-22.508-8.436L32.19,102.939L34.823,99.104z M26.755,390.913c-0.109-0.722-0.134-1.524-0.134-2.341V128.925
|
||||
l156.37,136.411L28.199,400.297L26.755,390.913z M464.899,423.84c-6.052,3.492-13.022,5.344-20.145,5.344H67.244
|
||||
c-7.127,0-14.094-1.852-20.142-5.344l-6.328-3.668l159.936-139.379l17.528,15.246c10.514,9.128,23.922,14.16,37.761,14.16
|
||||
c13.89,0,27.32-5.032,37.827-14.16l17.521-15.253L471.228,420.18L464.899,423.84z M485.372,388.572
|
||||
c0,0.803-0.015,1.597-0.116,2.304l-1.386,9.472L329.012,265.409l156.36-136.418V388.572z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.9 KiB |
8
assets/icons/linkedin.svg
Normal file
8
assets/icons/linkedin.svg
Normal file
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||
<g>
|
||||
<path fill="currentColor" d="M12 9.55C12.917 8.613 14.111 8 15.5 8a5.5 5.5 0 0 1 5.5 5.5V21h-2v-7.5a3.5 3.5 0 0 0-7 0V21h-2V8.5h2v1.05zM5 6.5a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm-1 2h2V21H4V8.5z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 448 B |
BIN
assets/img/avatar.webp
Normal file
BIN
assets/img/avatar.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.3 KiB |
10
assets/jsconfig.json
Normal file
10
assets/jsconfig.json
Normal file
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"baseUrl": ".",
|
||||
"paths": {
|
||||
"*": [
|
||||
"../../../../../../../home/florian/.cache/hugo_cache/modules/filecache/modules/pkg/mod/github.com/!cai!jimmy/hugo-theme-stack/v3@v3.27.0/assets/*"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
3
assets/scss/custom.scss
Normal file
3
assets/scss/custom.scss
Normal file
|
@ -0,0 +1,3 @@
|
|||
/*
|
||||
You can add your own custom styles here.
|
||||
*/
|
6
config/_default/_languages.toml
Normal file
6
config/_default/_languages.toml
Normal file
|
@ -0,0 +1,6 @@
|
|||
# Rename this file to languages.toml to enable multilingual support
|
||||
[fr]
|
||||
languageName = "Français"
|
||||
languagedirection = "ltr"
|
||||
title = "Florian RICHER"
|
||||
weight = 1
|
18
config/_default/config.toml
Normal file
18
config/_default/config.toml
Normal file
|
@ -0,0 +1,18 @@
|
|||
# Change baseurl before deploy
|
||||
baseurl = "https://demo.stack.jimmycai.com"
|
||||
languageCode = "fr-fr"
|
||||
title = "Florian RICHER"
|
||||
|
||||
# Theme i18n support
|
||||
# Available values: en, fr, id, ja, ko, pt-br, zh-cn, zh-tw, es, de, nl, it, th, el, uk, ar
|
||||
defaultContentLanguage = "fr"
|
||||
|
||||
# Set hasCJKLanguage to true if DefaultContentLanguage is in [zh-cn ja ko]
|
||||
# This will make .Summary and .WordCount behave correctly for CJK languages.
|
||||
hasCJKLanguage = false
|
||||
|
||||
# Change it to your Disqus shortname before using
|
||||
disqusShortname = "hugo-theme-stack"
|
||||
|
||||
[pagination]
|
||||
pagerSize = 5
|
26
config/_default/markup.toml
Normal file
26
config/_default/markup.toml
Normal file
|
@ -0,0 +1,26 @@
|
|||
# Markdown renderer configuration
|
||||
[goldmark.renderer]
|
||||
unsafe = true
|
||||
|
||||
[goldmark.extensions.passthrough]
|
||||
enable = true
|
||||
|
||||
# LaTeX math support
|
||||
# https://gohugo.io/content-management/mathematics/
|
||||
[goldmark.extensions.passthrough.delimiters]
|
||||
block = [['\[', '\]'], ['$$', '$$']]
|
||||
inline = [['\(', '\)']]
|
||||
|
||||
[tableOfContents]
|
||||
endLevel = 4
|
||||
ordered = true
|
||||
startLevel = 2
|
||||
|
||||
[highlight]
|
||||
noClasses = false
|
||||
codeFences = true
|
||||
guessSyntax = true
|
||||
lineNoStart = 1
|
||||
lineNos = true
|
||||
lineNumbersInTable = true
|
||||
tabWidth = 4
|
32
config/_default/menu.toml
Normal file
32
config/_default/menu.toml
Normal file
|
@ -0,0 +1,32 @@
|
|||
# Configure main menu and social menu
|
||||
#[[main]]
|
||||
#identifier = "home"
|
||||
#name = "Home"
|
||||
#url = "/"
|
||||
#[main.params]
|
||||
#icon = "home"
|
||||
#newtab = true
|
||||
|
||||
[[social]]
|
||||
identifier = "github"
|
||||
name = "GitHub"
|
||||
url = "https://github.com/mrdev023"
|
||||
|
||||
[social.params]
|
||||
icon = "brand-github"
|
||||
|
||||
[[social]]
|
||||
identifier = "linkedin"
|
||||
name = "Linkedin"
|
||||
url = "https://www.linkedin.com/in/florian-richer-80960b129/"
|
||||
|
||||
[social.params]
|
||||
icon = "linkedin"
|
||||
|
||||
[[social]]
|
||||
identifier = "email"
|
||||
name = "Email"
|
||||
url = "mailto:florian.richer@protonmail.com"
|
||||
|
||||
[social.params]
|
||||
icon = "email"
|
2
config/_default/module.toml
Normal file
2
config/_default/module.toml
Normal file
|
@ -0,0 +1,2 @@
|
|||
[[imports]]
|
||||
path = "github.com/CaiJimmy/hugo-theme-stack/v3"
|
150
config/_default/params.toml
Normal file
150
config/_default/params.toml
Normal file
|
@ -0,0 +1,150 @@
|
|||
# Pages placed under these sections will be shown on homepage and archive page.
|
||||
mainSections = ["post"]
|
||||
# Output page's full content in RSS.
|
||||
rssFullContent = true
|
||||
favicon = "/favicon.png"
|
||||
|
||||
[footer]
|
||||
since = 2020
|
||||
customText = ""
|
||||
|
||||
[dateFormat]
|
||||
published = "Jan 02, 2006"
|
||||
lastUpdated = "Jan 02, 2006 15:04 MST"
|
||||
|
||||
[sidebar]
|
||||
emoji = "🍥"
|
||||
subtitle = "Développeur d´application Web et Mobile."
|
||||
|
||||
[sidebar.avatar]
|
||||
enabled = true
|
||||
local = true
|
||||
src = "img/avatar.webp"
|
||||
|
||||
[article]
|
||||
headingAnchor = false
|
||||
math = false
|
||||
readingTime = true
|
||||
|
||||
[article.license]
|
||||
enabled = true
|
||||
default = "Licensed under CC BY-NC-SA 4.0"
|
||||
|
||||
## Widgets
|
||||
[[widgets.homepage]]
|
||||
type = "search"
|
||||
|
||||
[[widgets.homepage]]
|
||||
type = "archives"
|
||||
|
||||
[widgets.homepage.params]
|
||||
limit = 5
|
||||
|
||||
[[widgets.homepage]]
|
||||
type = "categories"
|
||||
|
||||
[widgets.homepage.params]
|
||||
limit = 10
|
||||
|
||||
[[widgets.homepage]]
|
||||
type = "tag-cloud"
|
||||
|
||||
[widgets.homepage.params]
|
||||
limit = 10
|
||||
|
||||
[[widgets.page]]
|
||||
type = "toc"
|
||||
|
||||
[opengraph.twitter]
|
||||
site = ""
|
||||
card = "summary_large_image"
|
||||
|
||||
[defaultImage.opengraph]
|
||||
enabled = false
|
||||
local = false
|
||||
src = ""
|
||||
|
||||
[colorScheme]
|
||||
toggle = true
|
||||
default = "auto"
|
||||
|
||||
[imageProcessing.cover]
|
||||
enabled = true
|
||||
|
||||
[imageProcessing.content]
|
||||
enabled = true
|
||||
|
||||
## Comments
|
||||
[comments]
|
||||
enabled = true
|
||||
provider = "disqus"
|
||||
|
||||
[comments.disqusjs]
|
||||
shortname = ""
|
||||
apiUrl = ""
|
||||
apiKey = ""
|
||||
admin = ""
|
||||
adminLabel = ""
|
||||
|
||||
[comments.utterances]
|
||||
repo = ""
|
||||
issueTerm = "pathname"
|
||||
label = ""
|
||||
|
||||
[comments.remark42]
|
||||
host = ""
|
||||
site = ""
|
||||
locale = ""
|
||||
|
||||
[comments.vssue]
|
||||
platform = ""
|
||||
owner = ""
|
||||
repo = ""
|
||||
clientId = ""
|
||||
clientSecret = ""
|
||||
autoCreateIssue = false
|
||||
|
||||
[comments.waline]
|
||||
serverURL = ""
|
||||
lang = ""
|
||||
visitor = ""
|
||||
avatar = ""
|
||||
emoji = ["https://cdn.jsdelivr.net/gh/walinejs/emojis/weibo"]
|
||||
requiredMeta = ["name", "email", "url"]
|
||||
placeholder = ""
|
||||
|
||||
[comments.waline.locale]
|
||||
admin = "Admin"
|
||||
|
||||
[comments.twikoo]
|
||||
envId = ""
|
||||
region = ""
|
||||
path = ""
|
||||
lang = ""
|
||||
|
||||
[comments.cactus]
|
||||
defaultHomeserverUrl = "https://matrix.cactus.chat:8448"
|
||||
serverName = "cactus.chat"
|
||||
siteName = ""
|
||||
|
||||
[comments.giscus]
|
||||
repo = ""
|
||||
repoID = ""
|
||||
category = ""
|
||||
categoryID = ""
|
||||
mapping = ""
|
||||
lightTheme = ""
|
||||
darkTheme = ""
|
||||
reactionsEnabled = 1
|
||||
emitMetadata = 0
|
||||
|
||||
[comments.gitalk]
|
||||
owner = ""
|
||||
admin = ""
|
||||
repo = ""
|
||||
clientID = ""
|
||||
clientSecret = ""
|
||||
|
||||
[comments.cusdis]
|
||||
host = ""
|
||||
id = ""
|
3
config/_default/permalinks.toml
Normal file
3
config/_default/permalinks.toml
Normal file
|
@ -0,0 +1,3 @@
|
|||
# Permalinks format of each content section
|
||||
post = "/p/:slug/"
|
||||
page = "/:slug/"
|
12
config/_default/related.toml
Normal file
12
config/_default/related.toml
Normal file
|
@ -0,0 +1,12 @@
|
|||
# Related contents configuration
|
||||
includeNewer = true
|
||||
threshold = 60
|
||||
toLower = false
|
||||
|
||||
[[indices]]
|
||||
name = "tags"
|
||||
weight = 100
|
||||
|
||||
[[indices]]
|
||||
name = "categories"
|
||||
weight = 200
|
8
content/_index.md
Normal file
8
content/_index.md
Normal file
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
menu:
|
||||
main:
|
||||
name: Home
|
||||
weight: 1
|
||||
params:
|
||||
icon: home
|
||||
---
|
10
content/categories/linux/_index.md
Normal file
10
content/categories/linux/_index.md
Normal file
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
title: Linux
|
||||
description:
|
||||
image:
|
||||
|
||||
# Badge style
|
||||
style:
|
||||
background: "#2a9d8f"
|
||||
color: "#fff"
|
||||
---
|
10
content/categories/nix/_index.md
Normal file
10
content/categories/nix/_index.md
Normal file
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
title: Nix
|
||||
description:
|
||||
image:
|
||||
|
||||
# Badge style
|
||||
style:
|
||||
background: "#8ea885"
|
||||
color: "#fff"
|
||||
---
|
11
content/page/archives/index.md
Normal file
11
content/page/archives/index.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Archives"
|
||||
date: 2022-03-06
|
||||
layout: "archives"
|
||||
slug: "archives"
|
||||
menu:
|
||||
main:
|
||||
weight: 2
|
||||
params:
|
||||
icon: archives
|
||||
---
|
33
content/page/links/index.md
Normal file
33
content/page/links/index.md
Normal file
|
@ -0,0 +1,33 @@
|
|||
---
|
||||
title: Links
|
||||
links:
|
||||
- title: GitHub
|
||||
description: GitHub is the world's largest software development platform.
|
||||
website: https://github.com
|
||||
image: https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png
|
||||
menu:
|
||||
main:
|
||||
weight: 4
|
||||
params:
|
||||
icon: link
|
||||
|
||||
comments: false
|
||||
---
|
||||
|
||||
To use this feature, add `links` section to frontmatter.
|
||||
|
||||
This page's frontmatter:
|
||||
|
||||
```yaml
|
||||
links:
|
||||
- title: GitHub
|
||||
description: GitHub is the world's largest software development platform.
|
||||
website: https://github.com
|
||||
image: https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png
|
||||
- title: TypeScript
|
||||
description: TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.
|
||||
website: https://www.typescriptlang.org
|
||||
image: ts-logo-128.jpg
|
||||
```
|
||||
|
||||
`image` field accepts both local and external images.
|
13
content/page/search/index.md
Normal file
13
content/page/search/index.md
Normal file
|
@ -0,0 +1,13 @@
|
|||
---
|
||||
title: "Search"
|
||||
slug: "search"
|
||||
layout: "search"
|
||||
outputs:
|
||||
- html
|
||||
- json
|
||||
menu:
|
||||
main:
|
||||
weight: 3
|
||||
params:
|
||||
icon: search
|
||||
---
|
374
content/post/kde_contribution/index.md
Normal file
374
content/post/kde_contribution/index.md
Normal file
|
@ -0,0 +1,374 @@
|
|||
---
|
||||
title: Ma première contribution à KDE
|
||||
description: Ma première configuration et ma première contribution à l'environnement mobile (Plasma-Mobile).
|
||||
slug: kde-first-contrib
|
||||
date: 2024-01-12 00:00:00+0000
|
||||
categories:
|
||||
- Linux
|
||||
tags:
|
||||
- KDE
|
||||
weight: 1 # You can add weight to some posts to override the default sorting (date descending)
|
||||
---
|
||||
|
||||
## Rapide rappel à propos de KDE
|
||||
|
||||
KDE est un projet qui a pour but de développer des logiciels open-source. Le projet comporte plusieurs éléments les plus connus.
|
||||
|
||||
- [KF5 ou KF6](https://develop.kde.org/products/frameworks/) est un ensemble de librairies utilisées pour le développement de l'ensemble des logiciels de KDE. Il est basé sur la librairie [QT](https://www.qt.io/).
|
||||
> _Exemple_ : Kirigami que l'on peut voir comme un "flutter".
|
||||
>
|
||||
> _Note:_
|
||||
>
|
||||
> KF5 => Basé sur QT5
|
||||
>
|
||||
> KF6 => Basé sur QT6
|
||||
|
||||
- [Plasma Shell](https://kde.org/fr/plasma-desktop/) est l'environnement de bureau développé pour Linux.
|
||||
|
||||
## Ma configuration
|
||||
|
||||
Pour développer sur KDE, KDE fournis un utilitaire assez puissant `kdesrc-build`.
|
||||
Il permet de configurer l'IDE, compiler, exécuter et gérer les dépendances avec l'aide d'une seule ligne de commande.
|
||||
|
||||
Pour le configurer, il suffit de suivre la procédure sur ce [lien](https://community.kde.org/Get_Involved/development/Set_up_a_development_environment).
|
||||
|
||||
### Mes premières difficultés
|
||||
|
||||
Il faut savoir que quand j'ai commencé à vouloir contribuer au projet KDE. Le projet était en train de migrer de QT5 à QT6.
|
||||
Donc, les configurations nécessaires pour compiler correctement la version 6 était nettement plus compliqué que maintenant.
|
||||
Il n'y avait aucune documentation pour migrer la configuration fournie de base, il fallait fouiller sur Github ou sur les blogs pour réussir
|
||||
à avoir la configuration.
|
||||
Aujourd'hui, il suffit juste de suivre le lien ci-dessus et on peut directement travailler sur KDE 6.
|
||||
|
||||
Pour le développement sur KDE Plasma 6, j'ai dû faire quelques réajustements sur le fichier `~/.config/kdesrc-buildrc`.
|
||||
|
||||
J'ai changé la branche par défaut avec l'option `branch-group kf6-qt6`.
|
||||
Elle permet de cloner les repositories correctement et d'ajouter l'option cmake `-DBUILD_WITH_QT6=on`.
|
||||
J'ai aussi changé les fichiers de configuration utilisées pour obtenir le résultat ci-dessous.
|
||||
|
||||
```
|
||||
global
|
||||
branch-group kf6-qt6
|
||||
[...]
|
||||
end global
|
||||
|
||||
include ~/kde/src/kdesrc-build/data/build-include/kf6-common-options.ksb
|
||||
include ~/kde/src/kdesrc-build/data/build-include/kf6-frameworks.ksb
|
||||
include ~/kde/src/kdesrc-build/data/build-include/kf6-workspace.ksb
|
||||
include ~/kde/src/kdesrc-build/data/build-include/kf6-applications.ksb
|
||||
include ~/kde/src/kdesrc-build/data/build-include/kf6-kdepim.ksb
|
||||
```
|
||||
|
||||
### Configurations utiles
|
||||
|
||||
#### Désactiver l'arrêt de la compilation lors d'une erreur de compilation.
|
||||
|
||||
En général, `kdesrc-build` s'adapte et retire tous les projets qui dépendent de la dépendance qui n'a pas réussi à compiler.
|
||||
Le projet était encore en cours de développement donc les erreurs de compilations étaient très régulières.
|
||||
J'ai tout simplement désactivé avec l'option `stop-on-failure false`.
|
||||
|
||||
#### Activer le support des LSP
|
||||
|
||||
C'est très pratique si on utilise VSCode ou même n'importe quel outil qui supporte les [LSP](https://microsoft.github.io/language-server-protocol/).
|
||||
|
||||
Il suffit d'activer les options:
|
||||
|
||||
* `compile-commands-linking` => `true`
|
||||
* `compile-commands-export` => `true`
|
||||
|
||||
#### Générer les projets VSCode
|
||||
|
||||
Il va générer automatiquement les workspaces VSCode avec les extensions recommander et le paramètrage par défaut.
|
||||
Ça permet de travailler dans de très bonne condition avec VSCode.
|
||||
|
||||
Il suffit de l'activer avec `generate-vscode-project-config true`
|
||||
|
||||
#### Options utiles pour la commande kdesrc-build
|
||||
|
||||
* `-D` : Pour ne pas inclure les dépendances dans la compilation
|
||||
> Exemple: kdesrc-build -D kate
|
||||
|
||||
* `-S` : Pour ne pas mettre à jour les sources
|
||||
> Exemple: kdesrc-build -S kate
|
||||
|
||||
## Ma contribution
|
||||
|
||||
J'ai contribué sur le support de la lampe torche pour l'environnement Plasma Mobile.
|
||||
La lampe torche fonctionnait uniquement sur les [pinephones](https://pine64.org/devices/pinephone/) en utilisant le fichier en dure `/sys/devices/platform/led-controller/leds/white:flash/brightness`
|
||||
([Source](https://invent.kde.org/plasma/plasma-mobile/-/blob/f970aa7acf2e9794ab4ed6b75e8f549bece83561/quicksettings/flashlight/flashlightutil.cpp#L17)).
|
||||
J'ai réécris le module pour que ça fonctionne de manière générale sur tous les téléphones.
|
||||
|
||||
### Rappel sur le fonctionnement du noyau Linux autour des leds
|
||||
|
||||
Pour comprendre comment la fonctionnalité, un petit rappel s'impose autour du fonctionnement des leds avec le noyau Linux.
|
||||
Dès qu'une led est détecté par le noyau, il va mettre à disposition plusieurs fichiers.
|
||||
On les trouvent dans le dossier correspondant au driver et aussi à l'emplacement physique sur la carte mère ou sur le SOC.
|
||||
Mais on peut aussi les trouver plus facilement dans le répertoire `/sys/class/leds/`.
|
||||
|
||||
> sys => Fichiers système
|
||||
> class => Trier par class.
|
||||
> leds => La class `leds`. On peut trouver aussi par appareil `bluetooth`, puce `tpm`, ...
|
||||
|
||||
On disposent de plusieurs fichiers importants :
|
||||
|
||||
* `brightness` : Permet de changer ou de récupérer l'intensité de la led actuelle.
|
||||
* `max_brightness` : Permet de connaitre l'intensité max de la led.
|
||||
* `color` : Ce fichier n'existe pas tout le temps mais permet d'avoir la couleur de la led.
|
||||
* Le reste des fichiers ne sont pas important pour nous.
|
||||
|
||||
### Explication du fonctionnement de mon code petit à petit
|
||||
|
||||
Tout d'abord, il faut savoir que j'utilise la libraire Udev. Il est prévu que je migre vers la librairie [Solid](https://invent.kde.org/frameworks/solid) une fois le support des leds ajoutées.
|
||||
Udev pour faire simple, c'est une librairie qui permet d'interagir avec les appareils assez directement sans intermédiaire.
|
||||
La librairie permet également de lister, filtrer, détecter si un appareil est connecté/déconnecté, ....
|
||||
|
||||
Pour commencer, je dois d'abord instancier Udev avec pour l'utiliser par la suite.
|
||||
```cpp
|
||||
struct udev *udev = udev_new();
|
||||
```
|
||||
|
||||
Ensuite, je liste tous les périphériques qui m'intéressent donc ceux appartenant à la class `leds`.
|
||||
Pour ça, il me suffit de créer un énumerateur sur lequel on appliquera tous les filtres.
|
||||
> On peut voir une class comme une catégorie d'appareils.
|
||||
|
||||
```cpp
|
||||
struct udev_enumerate *enumerate = udev_enumerate_new(udev);
|
||||
```
|
||||
|
||||
J'applique le filtre pour lister uniquement ceux qui appartiennent à la class `leds`.
|
||||
|
||||
```cpp
|
||||
#define TORCH_SUBSYSTEM "leds"
|
||||
...
|
||||
udev_enumerate_add_match_subsystem(enumerate, TORCH_SUBSYSTEM);
|
||||
```
|
||||
|
||||
J'applique le filtre pour lister uniquement ceux qui ont dans le nom `flash` ou `torch`.
|
||||
|
||||
```cpp
|
||||
udev_enumerate_add_match_sysname(enumerate, "*:torch");
|
||||
udev_enumerate_add_match_sysname(enumerate, "*:flash");
|
||||
```
|
||||
|
||||
Puis je lance le scan avec mes filtres.
|
||||
|
||||
```cpp
|
||||
udev_enumerate_scan_devices(enumerate);
|
||||
```
|
||||
|
||||
Au début, il faut savoir que je prenais le premier appareil avec le code ci-dessous mais certain téléphone ont une torche de couleur jaune et blanche.
|
||||
Certain utilisateur malheureusement ne pouvait pas utiliser la fonctionnalité.
|
||||
|
||||
```cpp
|
||||
struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate);
|
||||
struct udev_list_entry *entry = udev_list_entry_get_next(devices);
|
||||
```
|
||||
|
||||
[Source](https://invent.kde.org/plasma/plasma-mobile/-/blob/5c6a97caa52d549c0cb02b17fc65a3a7d729d237/quicksettings/flashlight/flashlightutil.cpp)
|
||||
|
||||
Donc, j'ai changé le code avec le code ci-dessous qui permet d'itérer sur tous les appareils.
|
||||
|
||||
```cpp
|
||||
struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate);
|
||||
struct udev_list_entry *entry = nullptr;
|
||||
|
||||
struct udev_device *device = nullptr;
|
||||
|
||||
udev_list_entry_foreach(entry, devices)
|
||||
{
|
||||
[...]
|
||||
}
|
||||
```
|
||||
|
||||
Pour chaque appareil, j'ai récuperé le répertoire ou se situe l'appareil avec le code ci-dessous
|
||||
qui me renvoie par exemple: `/sys/devices/platform/led-controller/leds/white:flash`.
|
||||
|
||||
```cpp
|
||||
const char *path = udev_list_entry_get_name(entry);
|
||||
```
|
||||
|
||||
J'instancie une instance udev_device pour interagir avec lui depuis le répertoire.
|
||||
|
||||
```cpp
|
||||
struct udev_device *device = udev_device_new_from_syspath(udev, path);
|
||||
```
|
||||
|
||||
Et à partir de là, il me suffit de lire les fichiers dont j'ai besoin.
|
||||
|
||||
```cpp
|
||||
const char *maxBrightness = udev_device_get_sysattr_value(device, "[NOM DU FICHIER]");
|
||||
```
|
||||
|
||||
Je lis d'abord le fichier 'color' et je regarde si la couleur est blanche sinon je continue.
|
||||
Si je ne trouve pas de led de couleur blanche, je prends la dernière valeur récupérée.
|
||||
|
||||
Une fois pour chaque appareil trouvé, il me reste plus qu'à récupérer les infos dont j'ai besoin.
|
||||
Donc, la luminosité maximale `max_brightness` et la luminosité actuelle `brightness` pour correctement initialiser l'interface de Plasma Mobile.
|
||||
|
||||
Quand je souhaite changer la valeur, je dois d'abord convertir la valeur entière en chaîne de charactère.
|
||||
|
||||
```cpp
|
||||
const_cast<char *>(m_torchEnabled ? "0" : m_maxBrightness)
|
||||
```
|
||||
|
||||
Ensuite, je change la luminosité
|
||||
|
||||
```cpp
|
||||
udev_device_set_sysattr_value(m_device, "brightness", nouvelle_valeur_en_char_*);
|
||||
```
|
||||
|
||||
### Fichier final
|
||||
|
||||
[Source](https://invent.kde.org/plasma/plasma-mobile/-/blob/d162f96a63600d5b45bb8294afdb84efd85833f9/quicksettings/flashlight/flashlightutil.cpp)
|
||||
```cpp
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2020 Han Young <hanyoung@protonmail.com>
|
||||
* SPDX-FileCopyrightText: 2022 by Devin Lin <devin@kde.org>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include "flashlightutil.h"
|
||||
|
||||
#include <cstring>
|
||||
#include <fcntl.h>
|
||||
#include <libudev.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <QDebug>
|
||||
#include <QFileInfo>
|
||||
|
||||
#define TORCH_SUBSYSTEM "leds"
|
||||
|
||||
FlashlightUtil::FlashlightUtil(QObject *parent)
|
||||
: QObject{parent}
|
||||
, m_device{nullptr}
|
||||
, m_isAvailable{false}
|
||||
{
|
||||
findTorchDevice();
|
||||
}
|
||||
|
||||
FlashlightUtil::~FlashlightUtil()
|
||||
{
|
||||
if (m_device != nullptr) {
|
||||
udev_device_unref(m_device);
|
||||
}
|
||||
}
|
||||
|
||||
void FlashlightUtil::toggleTorch()
|
||||
{
|
||||
if (!isAvailable()) {
|
||||
qWarning() << "Flashlight not available";
|
||||
return;
|
||||
}
|
||||
|
||||
int ret = udev_device_set_sysattr_value(m_device, "brightness", const_cast<char *>(m_torchEnabled ? "0" : m_maxBrightness));
|
||||
if (ret < 0) {
|
||||
qWarning() << "Flashlight can't be toggled";
|
||||
return;
|
||||
}
|
||||
|
||||
m_torchEnabled = !m_torchEnabled;
|
||||
Q_EMIT torchChanged(m_torchEnabled);
|
||||
}
|
||||
|
||||
bool FlashlightUtil::torchEnabled() const
|
||||
{
|
||||
return m_torchEnabled;
|
||||
}
|
||||
|
||||
bool FlashlightUtil::isAvailable() const
|
||||
{
|
||||
return m_isAvailable;
|
||||
}
|
||||
|
||||
void FlashlightUtil::findTorchDevice()
|
||||
{
|
||||
if (m_device != nullptr) {
|
||||
udev_device_unref(m_device);
|
||||
}
|
||||
m_device = nullptr;
|
||||
m_isAvailable = false;
|
||||
|
||||
struct udev *udev = udev_new();
|
||||
struct udev_enumerate *enumerate = udev_enumerate_new(udev);
|
||||
|
||||
udev_enumerate_add_match_subsystem(enumerate, TORCH_SUBSYSTEM);
|
||||
udev_enumerate_add_match_sysname(enumerate, "*:torch");
|
||||
udev_enumerate_add_match_sysname(enumerate, "*:flash");
|
||||
udev_enumerate_scan_devices(enumerate);
|
||||
|
||||
struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate);
|
||||
struct udev_list_entry *entry = nullptr;
|
||||
|
||||
struct udev_device *device = nullptr;
|
||||
|
||||
udev_list_entry_foreach(entry, devices)
|
||||
{
|
||||
const char *path = udev_list_entry_get_name(entry);
|
||||
|
||||
if (path == nullptr) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (device != nullptr) {
|
||||
udev_device_unref(device); // Use to free memory from previous loop iteration
|
||||
}
|
||||
|
||||
device = udev_device_new_from_syspath(udev, path);
|
||||
|
||||
if (device == nullptr) {
|
||||
continue;
|
||||
}
|
||||
|
||||
qInfo() << "Found flashlight device : " << path;
|
||||
|
||||
const char *color = udev_device_get_sysattr_value(device, "color");
|
||||
|
||||
if (color == nullptr) {
|
||||
continue;
|
||||
}
|
||||
|
||||
qInfo() << "Flash color : " << color;
|
||||
|
||||
if (std::strcmp(color, "white") == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (device == nullptr) {
|
||||
qWarning() << "No flashlight device found";
|
||||
return;
|
||||
}
|
||||
|
||||
const char *maxBrightness = udev_device_get_sysattr_value(device, "max_brightness");
|
||||
|
||||
if (maxBrightness == nullptr) {
|
||||
qWarning() << "Failed to read max_brightness from udev device";
|
||||
return;
|
||||
}
|
||||
|
||||
qInfo() << "Flash maxBrightness : " << maxBrightness;
|
||||
|
||||
const char *brightness = udev_device_get_sysattr_value(device, "brightness");
|
||||
|
||||
if (brightness == nullptr) {
|
||||
qWarning() << "Failed to read brightness from udev device";
|
||||
return;
|
||||
}
|
||||
|
||||
qInfo() << "Flash brightness : " << brightness;
|
||||
|
||||
m_maxBrightness = maxBrightness;
|
||||
m_device = device;
|
||||
m_isAvailable = true;
|
||||
m_torchEnabled = std::strcmp(brightness, "0") != 0;
|
||||
|
||||
udev_enumerate_unref(enumerate);
|
||||
udev_unref(udev);
|
||||
}
|
||||
```
|
||||
|
||||
### Info utile pour débugger KDE Plama Mobile depuis Postmarket OS
|
||||
|
||||
Le fichier de log se situe dans `~/.local/state/tinydm.log`
|
292
content/post/nix_flake/index.md
Normal file
292
content/post/nix_flake/index.md
Normal file
|
@ -0,0 +1,292 @@
|
|||
---
|
||||
title: Découverte de Nix et de Flake
|
||||
description: Installation de pmbootstrap et compilation d'un paquet Postmarket OS
|
||||
slug: nix-flake
|
||||
date: 2024-10-04 00:00:00+0000
|
||||
categories:
|
||||
- Nix
|
||||
tags:
|
||||
- Nix
|
||||
- Flake
|
||||
weight: 1 # You can add weight to some posts to override the default sorting (date descending)
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
## Introduction
|
||||
|
||||
Nix est un gestionnaire de paquets basé sur le langage Nix. Il permet de gérer facilement une configuration système, d'un projet ou même d'un package (logiciel) et surtout de s'assurer de la reproductibilité de la configuration. Cependant, par défaut, Nix ne permet pas de "lock" la version de la configuration sur l'ensemble des machines. C'est pour cela que les développeurs développent Flake.
|
||||
|
||||
Flake est une feature experimentale qui permet de lock les dépendances sur une version très précise.
|
||||
Un peu comme le Gemfile.lock ou même le package-lock.json.
|
||||
|
||||
Grâce au coté déclaratif de Nix, on peut par exemple facilement tester un outils sans l'installer de manière permanente sur sa machine avec :
|
||||
|
||||
```bash
|
||||
nix run nixpkgs#cowsay Salut # Lance directement la commande cowsay avec l'argument Salut
|
||||
|
||||
nix shell nixpkgs#cowsay # Prépare un shell avec la commande cowsay dedans
|
||||
cowsay Salut # La commande est disponible
|
||||
exit # On revient sur notre shell de base
|
||||
|
||||
nix-collect-garbage # On nettoie les dépendances inutiles (Supprime cowsay)
|
||||
```
|
||||
|
||||
Ou même configurer son shell existant pour pouvoir développer sur un logiciel
|
||||
|
||||
```bash
|
||||
nix develop nixpkgs#cowsay # Prépare le shell actuel avec toutes les dépendances nécessaires pour compiler et exécuter cowsay
|
||||
```
|
||||
> **Attention: Ne clone pas les sources**
|
||||
|
||||
## Lexique
|
||||
|
||||
- `attribute set` => Fonctionne un peu comme un Hash en Ruby ou un object en JS
|
||||
- `package` => Représente un logiciel, binaire, script, librairies installable sur le système.
|
||||
- `derivation` => Représentation d'un package en Nix. Les fonctions `mkShell`, `writeScriptBin`, `buildGoModule`, `buildNpmPackage`, `buildRustPackage`, ... sont juste une surcouche pour faciliter la construction d'une dérivation. Derrière, ils appelent tous la fonctions `mkDerivation`. (Ex pour `buildGoPackage` https://github.com/NixOS/nixpkgs/blob/master/pkgs/build-support/go/module.nix )
|
||||
- `nix` => Gestionnaire de package et le language de programmation
|
||||
- `flake` => Configuration reproductible localisé sur un repo git (projet).
|
||||
> Attention: Le flake.nix ou flake.lock doit-être ajouté dans git avec un `git add flake.nix flake.lock` car sinon vous ne pourrait pas utiliser le Flake.
|
||||
|
||||
## Structure d'un Flake
|
||||
|
||||
### Introduction
|
||||
|
||||
On va ce baser sur cette exemple ci-dessous pour expliquer chaque partie du Flake.
|
||||
|
||||
|
||||
```nix
|
||||
{
|
||||
description = "Ma description";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
};
|
||||
|
||||
outputs = { self, nixpkgs, flake-utils }:
|
||||
flake-utils.lib.eachDefaultSystem (system:
|
||||
let
|
||||
pkgs = import nixpkgs { inherit system; };
|
||||
in
|
||||
{
|
||||
devShells = rec {
|
||||
default = pkgs.mkShell {
|
||||
inputsFrom = with pkgs; [openssl];
|
||||
packages = with pkgs; [redis minio];
|
||||
shellHook = ''
|
||||
echo "Votre shell est configuré"
|
||||
'';
|
||||
};
|
||||
};
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
### Partie `inputs`
|
||||
|
||||
Dans ce flake, on peut trouver tout d'abord la partie `inputs`, elle correspond aux dépendances de notre flake.
|
||||
|
||||
La dépendance (inputs) `nixpkgs` correspond au repo [github nixpkgs](https://github.com/NixOS/nixpkgs). En général, on l'utilise pour récupérer des packages ou utiliser les outils mis à disposition par les contributeurs de NixOS.
|
||||
|
||||
On peut retrouver dans le repo.
|
||||
- `/nixos` Contiens la configuration pour nixos (La distribution basée sur Nix)
|
||||
- `/pkgs` Contiens tous les packages (ex: ruby_3_3)
|
||||
> Les nouveaux packages doivent être mis dans le sous-dossier `by-name`. C'est un nouveau standard du projet. Les packages déjà existants migrent dessus petit à petit. Si un package manque, n'hésitez surtout pas à faire des PR sur github.
|
||||
- `lib` Contiens plein d'outils pratiques comme `makeLibraryPath` ou `makeIncludePath`
|
||||
- `doc` Contiens la doc ^^
|
||||
- `maintainers` Contiens la liste de tous les mainteneurs des packages.
|
||||
|
||||
La dépendance (inputs) `flake-utils` contient des helpers pour faciliter de la configuration pour un ensemble de systèmes (`x86_64-linux`, `x86_64-darwin`, ...).
|
||||
> darwin => Mac OS
|
||||
|
||||
### Partie `outputs`
|
||||
|
||||
Outputs prend une fonction qui prend en paramètre un `attribute set` avec pour attributs self et les inputs déclarés dans la partie `inputs`.
|
||||
|
||||
Dans le cas ou l'on a les inputs suivants:
|
||||
```nix
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
mon-input-custom.url = "github:mongithub/monprojet";
|
||||
};
|
||||
```
|
||||
|
||||
On aura les attributs suivants dans `outputs`:
|
||||
```nix
|
||||
outputs = { self, nixpkgs, flake-utils, mon-input-custom }:
|
||||
{
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
Elle correspond aux configurations disponibles pour un flake pour chaque système.
|
||||
|
||||
```nix
|
||||
outputs = { self, nixpkgs }:
|
||||
{
|
||||
devShells.x86_64-linux.default = {...};
|
||||
packages.x86_64-linux.default = {...};
|
||||
nixosConfigurations.x86_64-linux.default = {...};
|
||||
};
|
||||
```
|
||||
|
||||
> Rappel Nix
|
||||
>
|
||||
> `add = a: b: a + b`
|
||||
>
|
||||
> Créer une fonction avec le nom `add` qui prend en paramètre `a` et `b` et qui renvoie l'addition des deux. On déclare un paramètre avec la syntaxe `[nom du paramètre]:`
|
||||
>
|
||||
> `add 1 2` renvoie `3`
|
||||
>
|
||||
> On peut également faire des variantes.
|
||||
>
|
||||
> `add3N = add 3`
|
||||
>
|
||||
> `add3N 10` renvoie `13`
|
||||
>
|
||||
> Car `add 3` renvoie une fonction avec le premier paramètre a = 3
|
||||
|
||||
Les attributs que l'on peut retrouver dans `outputs` sont :
|
||||
- `devShells` Des environnements de développement.
|
||||
- `nixosConfigurations` Des configurations de NixOS (La distribution Linux)
|
||||
- `darwinConfigurations` Des configurations pour Mac OS [En savoir plus](https://github.com/LnL7/nix-darwin)
|
||||
- `packages` Des packages (Docker, ruby, go, rust, ...)
|
||||
- `[...]`
|
||||
|
||||
## Comment mettre à jour le `flake.lock`
|
||||
|
||||
Le flake.nix vient avec un fichier flake.lock qui permet de vérrouiller la version de chaque input. Si on souhaite mettre à jour nos packages pour notre projet. Il est nécessaire de le mettre à jour.
|
||||
|
||||
On retrouve deux commandes:
|
||||
- `nix flake update` Mets à jour tous les inputs
|
||||
- `nix flake lock --update-input <input>` Mets à jour uniquement un input en particulier
|
||||
|
||||
### Comment débugger sa configuration avec la console nix
|
||||
|
||||
Il existe une console depuis la version expérimentale de nix `nix-command`. On peut y accéder avec la commande `nix repl`.
|
||||
|
||||
Normalement, on doit avoir un shell comme ci-dessous
|
||||
|
||||
```bash
|
||||
$ nix repl
|
||||
Welcome to Nix 2.18.2. Type :? for help.
|
||||
nix-repl>
|
||||
```
|
||||
|
||||
Dedans, on peut écrire n'importe quoi en nix mais aussi lui demander de charger notre configuration flake avec l'aide de la commande `:lf [path racine ou ce trouve le flake]`
|
||||
> `lf` est l'abréviation de `Load Flake`
|
||||
|
||||
```bash
|
||||
$ nix repl
|
||||
Welcome to Nix 2.18.2. Type :? for help.
|
||||
nix-repl> :lf .
|
||||
Added 13 variables.
|
||||
```
|
||||
|
||||
Une fois chargé, on peut accéder aux outputs avec `outputs.<type de conf>.<system>.<nom>`
|
||||
> Tips : Vous pouvez appuyer deux fois sur Tab pour avoir de l'aide.
|
||||
>
|
||||
> Vous pouvez aussi facilement vérifier votre configuration nix avec la commande `nix flake check .`
|
||||
|
||||
### Fonctionnement des environnements de développement
|
||||
|
||||
#### Comment utiliser un devShell
|
||||
|
||||
Les devShells permettent de configurer des environnements par défaut.
|
||||
On peut y accéder avec l'aide de la commande `nix develop [path du flake]#[nom de l'environnement]`.
|
||||
|
||||
Ex: `nix develop .#default`
|
||||
> Le path par défaut est déjà le répertoire courant et la configuration utilisée par défaut est également default
|
||||
> Donc la commande `nix develop` suffit dans notre cas, mais si on configure par exemple `outputs.devShells.<system>.monshell`.
|
||||
> Dans ce cas, il faudra utiliser `nix develop .#monshell` ou `nix develop /home/user/monflake#monshell`
|
||||
|
||||
On peut accéder aux environnements utilisés pour développer n'importe quel package nix. Par exemple, si l'on souhaite aider au développement de ruby. On peut lancer une console de développement avec la commande `nix develop nixpkgs#ruby` ou même voir la configuration d'un package avec `nix edit nixpkgs#ruby`
|
||||
> On remarquera qu'ici j'utilise `nixpkgs` et pas le path du flake. Ça permet d'utiliser la configuration d'un package depuis nixpkgs directement.
|
||||
|
||||
> **Attention**
|
||||
> Pour des logiciels compilés, en général, il faut d'abord configurer le compilateur via les `phases` du logiciel. ex: `configurePhase` et ensuite compiler le logiciel ex: `buildPhase` . Les phases peuvent varier en fonction du logiciel.
|
||||
|
||||
#### Comment configurer un devShell
|
||||
|
||||
```nix
|
||||
outputs = { self, nixpkgs, flake-utils }:
|
||||
// Génère une configuration avec l'ensemble des systèmes par défaut
|
||||
// aarch64-linux => ARM sur Linux
|
||||
// aarch64-darwin => M1, M2, M3, ... sur MacOS
|
||||
// x86_64-linux => AMD et Intel sur Linux
|
||||
// x86_64-darwin => Intel sur MacOS
|
||||
//
|
||||
// Pour configurer avec une liste précise de systèmes, vous pouvez utiliser cette fonction
|
||||
// flake-utils.lib.eachSystem ["aarch64-linux" " x86_64-darwin"] (system: [...])
|
||||
// Voir plus https://github.com/numtide/flake-utils
|
||||
//
|
||||
// Les éléments d'un tableau ne sont pas séparés par une virgule ex: [ 12 14 ]
|
||||
flake-utils.lib.eachDefaultSystem (system:
|
||||
let
|
||||
// Importe les packages pour le système.
|
||||
// Le mot clef inherit équivaut à import nixpkgs { system = system };
|
||||
// On peut aussi inherit depuis autre chose
|
||||
// { inherit (pkgs.ruby) pname; } renverra { pname = "ruby" }
|
||||
pkgs = import nixpkgs { inherit system; };
|
||||
in
|
||||
{
|
||||
// rec Permet d'utiliser les variables dans le même attributs set
|
||||
// Exemple:
|
||||
// { a = 12; b = a + 2; } => error: undefined variable 'a'
|
||||
// rec { a = 12; b = a + 2; } => { a = 12; b = 14; }
|
||||
//
|
||||
// Attention, car parfois, on peut faire des infinites recurse par accident.
|
||||
// Exemple:
|
||||
// rec { a = b + 2; b = a + 2; } => error: infinite recursion encountered
|
||||
// a dépend de b pour fonctionner, mais b dépend également de a
|
||||
devShells = rec {
|
||||
default = pkgs.mkShell {
|
||||
// with pkgs permet d'éviter de faire [ pkgs.redis pkgs.minio ]
|
||||
inputsFrom = with pkgs; [ openssl ]; // Rajoute des dépendances pour la compilation comme les librairies
|
||||
packages = with pkgs; [ redis minio ]; // Rajoute des binaires ou des librairies pour l'execution
|
||||
|
||||
MY_CUSTOM_ENV_VAR = "test";
|
||||
|
||||
// Parfois nécessaire pour lancer des projets avec des librairies comme Ruby par exemple.
|
||||
// *_LIBRARY_PATH permet de dire à l'OS ou chercher les librairies.
|
||||
// Il faut le rajouter par exemple si on rencontre le soucis `Could not open library 'libsodium.so.23'`
|
||||
// LD_LIBRARY_PATH => Linux
|
||||
// DYLD_LIBRARY_PATH => MacOS
|
||||
LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath(with pkgs; [libsodium]);
|
||||
DYLD_LIBRARY_PATH = pkgs.lib.makeLibraryPath(with pkgs; [libsodium]);
|
||||
|
||||
// Parfois nécessaire pour configurer des projets comme Ruby avec bundle
|
||||
// Certaines gems Ruby génèrent un fichier .c avec du code en dure et surtout un `#include <malib.h>` dedans.
|
||||
// Sauf qu'ils utilisent pas les outils de configuration du compilateur fournis par les OS. Donc, il faut créer des variables d'environnements pour dire au compilateur ou chercher les fichiers requis.
|
||||
// C_INCLUDE_PATH => Pour le language C
|
||||
// CPLUS_INCLUDE_PATH => Pour le language C++
|
||||
C_INCLUDE_PATH = pkgs.lib.makeIncludePath(with pkgs; [libsodium]);
|
||||
CPLUS_INCLUDE_PATH = pkgs.lib.makeIncludePath(with pkgs; [libsodium]);
|
||||
|
||||
// Le shellHook est un script lancé au lancement du shell
|
||||
shellHook = ''
|
||||
echo "Votre shell est configuré avec MY_CUSTOM_ENV_VAR = $MY_CUSTOM_ENV_VAR"
|
||||
'';
|
||||
};
|
||||
};
|
||||
});
|
||||
```
|
||||
|
||||
[docs](https://ryantm.github.io/nixpkgs/builders/special/mkshell/)
|
||||
|
||||
### Liens utiles
|
||||
|
||||
**Pour apprendre nix**
|
||||
- https://nixcloud.io/tour/?id=introduction/nix
|
||||
- https://nix.dev/tutorials/nix-language
|
||||
|
||||
**Pour trouver des packages**
|
||||
- https://search.nixos.org/packages
|
||||
|
||||
**Repository officiel de nixpkgs**
|
||||
- https://github.com/NixOS/nixpkgs
|
||||
|
||||
**Pour connaître l'état d'une Pull Request**
|
||||
- https://nixpk.gs/
|
165
content/post/pmbootstrap_custom_build/index.md
Normal file
165
content/post/pmbootstrap_custom_build/index.md
Normal file
|
@ -0,0 +1,165 @@
|
|||
---
|
||||
title: Compiler un paquet Postmarket OS
|
||||
description: Installation de pmbootstrap et compilation d'un paquet Postmarket OS
|
||||
slug: pmbootstrap-own-paquet
|
||||
date: 2024-02-18 00:00:00+0000
|
||||
categories:
|
||||
- Linux
|
||||
tags:
|
||||
- Postmarket OS
|
||||
weight: 1 # You can add weight to some posts to override the default sorting (date descending)
|
||||
---
|
||||
|
||||
## À propos de Postmarket OS
|
||||
|
||||
[Postmarket OS](https://postmarketos.org/) est une distribution basée sur [Alpine](https://www.alpinelinux.org/) conçut pour fonctionner sur téléphone, tablette
|
||||
ou sur Raspberry PI.
|
||||
La communauté autour du projet propose un ensemble d'outils comme `pmbootstrap` qui permet de configurer et d'installer Postmarket OS sur son téléphone.
|
||||
On peut aussi l'utiliser pour compiler son propre paquet et l'installer sur son téléphone facilement.
|
||||
|
||||
## Configuration de notre environnement de travail
|
||||
|
||||
Avant de pouvoir l'utiliser, il faut d'abord l'installer depuis ce [lien](https://wiki.postmarketos.org/wiki/Pmbootstrap).
|
||||
|
||||
Une fois installé et configuré, il faut d'abord préparer son environnement de travail.
|
||||
|
||||
_Met à jour le repository [pmaports.git](https://wiki.postmarketos.org/wiki/Pmaports.git) cloné en local._
|
||||
```bash
|
||||
pmbootstrap pull
|
||||
```
|
||||
> Le repo pmaports.git stocke tous les paquets Alpine avec le fichier `APKBUILD` utilisé par le serveur de compilation.
|
||||
>
|
||||
> Le fonctionnement est similaire à `PKGBUILD` pour les utilisateurs de [Archlinux](https://archlinux.org/)
|
||||
>
|
||||
> Ce fichier contient toute la procédure pour préparer les sources, compiler le paquet depuis les sources, le numéro de version
|
||||
> ainsi que la procédure pour vérifier si le paquet fonctionne correctement.
|
||||
> Généralement on utilise les tests du projet comme les tests unitaires ou les tests fonctionnels.
|
||||
|
||||
_Met à jour le cache de la commande APK depuis l'environnement de travail_
|
||||
```bash
|
||||
pmbootstrap update
|
||||
```
|
||||
> L'environnement de travail se situe par défaut dans le dossier `$HOME/.local/var/pmbootstrap/`
|
||||
|
||||
|
||||
_Supprime le dossier de la commande chroot_
|
||||
```bash
|
||||
pmbootstrap zap
|
||||
```
|
||||
> La commande chroot permet de changer la racine Linux.
|
||||
> Par exemple, on peut faire `chroot $HOME/mon_dossier` et à partir de ce moment-là, `/` pointera vers `$HOME/mon_dossier` dans notre shell actuel.
|
||||
>
|
||||
> C'est très utilisé par pmbootstrap pour configurer le système Alpine.
|
||||
> Ça évite de devoir faire une VM ou un container Linux juste pour changer quelque fichier.
|
||||
>
|
||||
> Dans notre cas, il correspond au système de notre téléphone pour le configuré avant de l'installer ou de le tester sur notre appareil.
|
||||
>
|
||||
> Par défaut, il se situe dans le dossier `$HOME/.local/var/pmbootstrap/cache_git/pmaports/`
|
||||
|
||||
_[Optionnel] Changer la branche du repo [pmaports.git](https://wiki.postmarketos.org/wiki/Pmaports.git)_
|
||||
```bash
|
||||
git -C $workdir checkout [branch]
|
||||
```
|
||||
> `$workdir` par défaut se situe dans le dossier `$HOME/.local/var/pmbootstrap/cache_git/pmaports/`
|
||||
>
|
||||
> Exemple de branche utile : `kde-nightly`
|
||||
|
||||
## Compilation de notre paquet Alpine
|
||||
|
||||
Pour compiler le paquet, on utilise la commande `pmbootstrap build [paquet_name]`.
|
||||
> Avant de compiler depuis le repository Nightly, il faut d'abord rajouter la clef de signature
|
||||
>
|
||||
> `wget https://nightly.postmarketos.org/plasma-mobile/pmos@local-662fcd2f.rsa.pub`
|
||||
>
|
||||
> `mv pmos@local-662fcd2f.rsa.pub $(pmbootstrap config work)/config_apk_keys/`
|
||||
>
|
||||
> Source : https://wiki.postmarketos.org/wiki/Nightly
|
||||
|
||||
_Exemple de commande_
|
||||
```bash
|
||||
pmbootstrap \
|
||||
-mp https://nightly.postmarketos.org/plasma-mobile/packages/ \
|
||||
-mp http://mirror.postmarketos.org/postmarketos/ \
|
||||
--details-to-stdout \
|
||||
-j 32 \
|
||||
-t 3600 -v \
|
||||
build plasma-mobile \
|
||||
--src $home/plasma-mobile/ \
|
||||
--arch aarch64 \
|
||||
-i \
|
||||
-n
|
||||
```
|
||||
|
||||
Dans cet exemple, j'ai utilisé les arguments suivants:
|
||||
|
||||
* `-mp` : Permet de définir un repository Alpine pour installer les paquets.
|
||||
> Dans l'exemple, j'utilise deux repos
|
||||
>
|
||||
> `https://nightly.postmarketos.org/plasma-mobile/packages/` : Contient la version en cours de développement de KDE Plasma Mobile
|
||||
>
|
||||
> `http://mirror.postmarketos.org/postmarketos/` : Le miroir officiel de Postmarket OS
|
||||
|
||||
* `--details-to-stdout` : Affiche les logs stocké dans le fichier dans la console
|
||||
* `-j N` : Défini le nombre core utilisé pour la compilation
|
||||
> Dans mon cas, 32 core sur mon CPU.
|
||||
* `-t [En seconde]` : Le nombre de secondes sans nouveau log dans le fichier avant d'abandonner la compilation
|
||||
> Changé par 3600 secondes, car plasma-mobile est assez long à compilé et il ne génère aucun log.
|
||||
* `-v` : Mode verbeux pour les logs dans le fichier
|
||||
* `--src` : Change les sources du paquet. Par défaut ce sont les sources définies dans le fichier `APKBUILD`
|
||||
> Pour ma part, je souhaite utiliser mon propre code pour tester
|
||||
* `--arch [arch]` : L'architecture CPU du téléphone
|
||||
> Pour ma part, mon téléphone est en arm64v8 donc `aarch64`
|
||||
* `-n` : Permet d'éviter de compiler les dépendances du paquet.
|
||||
> En général, ce n'est pas recommandé par Alpine, mais dans mon cas, je souhaite utiliser les dépendances depuis le repo
|
||||
> miroir officiel de Postmarket OS.
|
||||
* `-i` : Permet de dire de compiler uniquement les dépendances du paquet défini dans le fichier `APKBUILD`
|
||||
> Dans mon cas, il vient en complément de l'option `-n`, ça me permet de m'assurer de ne rien build.
|
||||
> Sans cette option, il risque de compiler les sous-dépendances du paquet comme le noyau Linux.
|
||||
|
||||
Pour plus d'informations, il suffit de taper la commande
|
||||
|
||||
```bash
|
||||
pmbootstrap build --help
|
||||
```
|
||||
|
||||
Et pour avoir les arguments généraux
|
||||
|
||||
```bash
|
||||
pmbootstrap --help
|
||||
```
|
||||
|
||||
## Envoie du paquet sur le téléphone
|
||||
|
||||
Une fois le paquet compilé, il suffit de demander à `pmbootstrap` de l'envoyer sur notre téléphone via la connexion SSH.
|
||||
Avec `pmbootstrap`, on utilise la commande `sideload` comme dans l'exemple ci-dessous.
|
||||
|
||||
```bash
|
||||
pmbootstrap sideload plasma-mobile \
|
||||
--host [SSH HOST] \
|
||||
--port [SSH PORT] \
|
||||
--user [SSH USER] \
|
||||
--arch [ARCH] \
|
||||
--install-key
|
||||
```
|
||||
|
||||
On a les arguments suivants :
|
||||
|
||||
* `--host [SSH HOST]` (Ex: 192.168.1.1)
|
||||
* `--port [SSH PORT]` (Ex: 22)
|
||||
* `--user [SSH USER]` (Ex: 192.168.1.1)
|
||||
* `--arch [ARCH]` : Permet de modifier la valeur définie pour le téléphone (Ex : aarch64)
|
||||
* `--install-key` : Permet d'installer la clef utilisée pour la vérification des paquets de la machine actuelle.
|
||||
> Tout gestionnaire de paquet comme APK, vérifie si le paquet est valide par rapport à la signature électronique du mainteneur du paquet.
|
||||
> Dans notre cas, la signature ne sera pas valide, car le paquet n'est pas compilé par le mainteneur original donc il suffit de rajouter notre signature.
|
||||
|
||||
Pour revenir en arrière, il suffit de taper la commande ci-dessous depuis le téléphone ou depuis la connexion SSH
|
||||
```bash
|
||||
sudo apk upgrade -a
|
||||
```
|
||||
> APK va réinstaller les paquets depuis les repos officiels.
|
||||
|
||||
En cas de problème liée à des conflits de fichier, on peut utiliser cette commande
|
||||
```bash
|
||||
sudo apk fix --force
|
||||
```
|
||||
> Cette commande va forcer APK à écraser les fichiers en conflit.
|
61
flake.lock
Normal file
61
flake.lock
Normal file
|
@ -0,0 +1,61 @@
|
|||
{
|
||||
"nodes": {
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1726560853,
|
||||
"narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1728093190,
|
||||
"narHash": "sha256-CAZF2NRuHmqTtRTNAruWpHA43Gg2UvuCNEIzabP0l6M=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "e2f08f4d8b3ecb5cf5c9fd9cb2d53bb3c71807da",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixpkgs-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
24
flake.nix
Normal file
24
flake.nix
Normal file
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
description = "Portfolio hugo configuration";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
};
|
||||
|
||||
outputs = { self, nixpkgs, flake-utils }:
|
||||
flake-utils.lib.eachSystem flake-utils.lib.allSystems (system:
|
||||
let
|
||||
pkgs = import nixpkgs { inherit system; };
|
||||
in
|
||||
{
|
||||
devShells = {
|
||||
default = pkgs.mkShell {
|
||||
packages = with pkgs; [
|
||||
go
|
||||
hugo
|
||||
];
|
||||
};
|
||||
};
|
||||
});
|
||||
}
|
5
go.mod
Normal file
5
go.mod
Normal file
|
@ -0,0 +1,5 @@
|
|||
module github.com/CaiJimmy/hugo-theme-stack-starter
|
||||
|
||||
go 1.17
|
||||
|
||||
require github.com/CaiJimmy/hugo-theme-stack/v3 v3.27.0 // indirect
|
2
go.sum
Normal file
2
go.sum
Normal file
|
@ -0,0 +1,2 @@
|
|||
github.com/CaiJimmy/hugo-theme-stack/v3 v3.27.0 h1:wVAa/ZimTOkFy/mODH5RXS3R3mlgfAXaDTYs7GccJUw=
|
||||
github.com/CaiJimmy/hugo-theme-stack/v3 v3.27.0/go.mod h1:IPmCXiIxlFSLFYS0tOmYP6ySLviyeNVSabyvSuaxD+I=
|
BIN
static/favicon.png
Normal file
BIN
static/favicon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 639 B |
Loading…
Reference in a new issue