국민대학교 모각코 week-2
Packagekit을 전체적으로 테스트 해보았다. 스터디 이전에 집에서 사용하는 리눅스 테스크탑에서 코드를 작성하고 테스트 해보았다. include해야하는 헤더파일이 달랐으나 일단은 작동하였다.
처음에는 아래와 같이 진행하였으나
#include <packagekit-glib2/pkResult.h>
#include <packagekit-glib2/packagekit.h>
로 하는 것이 맞았다. 공식문서에 include 문 없이 코드 스니펫만 있어서 어려웠다. vim, vscode에서 설정을 해주지 않으면 자동 추천기능이 자동하지 않아 오랜만에 공식문서를 참고하여 작성하였다. GIO관련 프로그래밍이 처음이기에 async 기능을 쓰기 위해 glib, gio 스니펫을 보고 작성을 하게 되었다.
Gio는 GTK쪽에서 개발한 이벤트 기반 프로그래밍을 C에서 구현이 가능하게 만들어주는 라이브러리로 C에서 GTK, GLib 등을 기반으로 앱을 개발시 사용된다. packagekit Dbus wrapper도 GLib로 제작되어 이번에 사용하게 되었다. 이미 잘 사용되는 프로젝트의 코드를 분석하며 코드를 작성했기에 매우 어려움을 느꼇다. 자주쓰는 라이브러리들이 아니라서 리눅스 생태계에서 잘사용되는 앱의 코드를 많이 참고하였다.
코드 컴파일을 편하게 하기 위해서 make를 쓰는 것이 좋으나 여러파일에서 다른 상황들을 테스트하기 위해서 스크립트를 작성하였다. 간단하게 CLI argument로 C코드 파일 위치를 받으면 플래그와 링킹할 gio, glib, packagekit-glib2들을 명시하도록 했다.
#!/usr/bin/env sh
fullFileName=$1
filename="${fullFileName%.*}"
gcc `pkg-config --cflags glib-2.0 packagekit-glib2 gio-2.0` $fullFileName -o $filename \
`pkg-config --libs glib-2.0 packagekit-glib2 gio-2.0`
PackageKit에서 추천하는 사용예가 PkTask를 이용한 패키지 관리였다. 간단한 설치 및 패키지 찾기등에는 적당하였다.
해당 gist
https://gist.github.com/fmowl10/12bfb592a7462ebc69ae1dd4799f2d38
그러나 패키지를 검색하는 중에 인코딩이 잘못되어 ???만 뜨게 되었다 해결하기 위해 PkClient란 좀더 많은 옵션을 지원하는 클래스를 사용하였다. 코드는 아래 gist와 같다.
https://gist.github.com/fmowl10/4b070d66361ba7ed038026e4cad7c263
glib를 통해 시스템 로케일 설정을 가져오고 client의 로케일과 터미널의 로케일을 변경하였다.
pk_client_set_locale(client, g_get_language_names()[0]);
setlocale(LC_ALL, g_get_language_names()[0]);
g_print("%s\n", g_get_language_names()[0]);
여러가지 설정을 맞춰야 하지만 설치 및 패키지 id 탐색은 가능했다.
이로써 기반 기술들의 검증이 끝났다. 간단한 뷰를 제작하고 기능을 붙일 시간이다. 다음은 flowchart를 만들고 조금씩 제작할 예정이다.
아래는 참고한 github, gitlab 저장소와 gist, 사이트들이다.
참고 gist, github
gnome-PackageKit (GTK+로 GUI 구현)
https://gitlab.gnome.org/GNOME/gnome-packagekit/-/tree/master
완성되지 않은 packagekit c++용 랩퍼
https://github.com/topfs2/packagekit-glib-wrapper?files=1
GTK용 MakeFile
https://stackoverflow.com/questions/34762056/make-file-for-gtk
Gio에서 async 사용예
https://libsoup.org/gio/GAsyncResult.html