ArchLinux: nimf 설치

Arch Linux 에는 이미 aur 로 nimf 가 제공되고 있다. 그냥 그걸 설치하면 별 문제는 없는데..
이 nimf 는 하모니카라는 곳에서 관리되고 있다. (이 하모니카가 뭔지 잘 모르는 건 몇 년째 변함이 없는데..)

아무튼, 딱 한가지. 안 그래도 별로 예쁘지 않은 아이콘이 더 이상해졌고, KDE Plasma 에선 더더욱 모양이 영 아니올시다이기에.. 우분투용으로 손봐뒀던 nimf 소스를 사용해보기로 했다.
여기에 사용한 소스는, qt4 삭제, 한글/일본어 anthy 외 삭제, dvorak 문제점 해결, 마지막으로 최신판 libhangul 과 호환이 되게끔 수정돼 있다. 이름하여 nimf 2020.04.28 판이 되겠다.

그런데.. 왜 그런지 make 시 오류가 발생한다.

nimf-libhangul.c:657:42: error: 'HANGUL_IC_OPTION_AUTO_REORDER' undeclared (first use in this function)

이게 뭔지 혼자서 고민을 하다가.. (C 라고는 콧털만큼도 모르면서) 결국 을 찾았다.
아치리눅스에서 기본 제공되는 libhangul 이 예전 판이어서, 최신판 libhangul 과 호환되게 해놓은게 오히려 에러를 불러왔다. 우분투에는 좀 더 최신판이 들어있는데, 첨단을 걷는 아치가 이렇다니..

이를 해결하기 위해선, aur 로 libhangul-git 을 먼저 설치해야한다.
그리고 나서 nimf 를 빌드하면 오류없이 끝낼 수 있다.

단, gcc 판본 차이로 인해서, 몇군데 사소한 수정은 필요하다.

$ diff -cr nimf-2020.04.28-ubuntu nimf-2020.04.28-archlinux
diff --color -cr nimf-2020.04.28-ubuntu/configure.ac nimf-2020.04.28-archlinux/configure.ac
*** nimf-2020.04.28-ubuntu/configure.ac	2021-01-20 20:32:27.000000000 +0900
--- nimf-2020.04.28-archlinux/configure.ac	2021-12-28 16:45:21.000000000 +0900
***************
*** 21,27 ****
  AC_ARG_ENABLE([hardening],
    AS_HELP_STRING([--disable-hardening], [Disable hardening]))
  
! EXTRA_CFLAGS="-Wall -Werror"
  AS_IF([test "x$enable_hardening" != "xno"],
        [EXTRA_CFLAGS+=" -D_FORTIFY_SOURCE=2"])
  
--- 21,28 ----
  AC_ARG_ENABLE([hardening],
    AS_HELP_STRING([--disable-hardening], [Disable hardening]))
  
! #EXTRA_CFLAGS="-Wall -Werror"
! EXTRA_CFLAGS="-Wall"
  AS_IF([test "x$enable_hardening" != "xno"],
        [EXTRA_CFLAGS+=" -D_FORTIFY_SOURCE=2"])
  
diff --color -cr nimf-2020.04.28-ubuntu/libnimf/nimf-im.c nimf-2020.04.28-archlinux/libnimf/nimf-im.c
*** nimf-2020.04.28-ubuntu/libnimf/nimf-im.c	2021-01-20 20:14:36.000000000 +0900
--- nimf-2020.04.28-archlinux/libnimf/nimf-im.c	2021-12-28 16:46:21.000000000 +0900
***************
*** 154,160 ****
                                                 sizeof (NimfPreeditAttr *));
  
          for (i = 0; i < n_attr; i++)
!           im->priv->preedit_attrs[i] = g_memdup (message->data + str_len + 1 + i * sizeof (NimfPreeditAttr),
                                                   sizeof (NimfPreeditAttr));
  
          im->priv->preedit_attrs[n_attr] = NULL;
--- 154,160 ----
                                                 sizeof (NimfPreeditAttr *));
  
          for (i = 0; i < n_attr; i++)
!           im->priv->preedit_attrs[i] = g_memdup2 (message->data + str_len + 1 + i * sizeof (NimfPreeditAttr),
                                                   sizeof (NimfPreeditAttr));
  
          im->priv->preedit_attrs[n_attr] = NULL;
diff --color -cr nimf-2020.04.28-ubuntu/libnimf/nimf-types.c nimf-2020.04.28-archlinux/libnimf/nimf-types.c
*** nimf-2020.04.28-ubuntu/libnimf/nimf-types.c	2019-08-14 21:06:07.000000000 +0900
--- nimf-2020.04.28-archlinux/libnimf/nimf-types.c	2021-12-28 16:46:04.000000000 +0900
***************
*** 204,210 ****
    for (i = 0; attrs[i] != NULL; i++)
    {
      preedit_attrs = g_realloc_n (preedit_attrs, 1 + i + 1, sizeof (NimfPreeditAttr *));
!     preedit_attrs[i] = g_memdup (attrs[i], sizeof (NimfPreeditAttr));
      preedit_attrs[i + 1] = NULL;
    }
  
--- 204,210 ----
    for (i = 0; attrs[i] != NULL; i++)
    {
      preedit_attrs = g_realloc_n (preedit_attrs, 1 + i + 1, sizeof (NimfPreeditAttr *));
!     preedit_attrs[i] = g_memdup2 (attrs[i], sizeof (NimfPreeditAttr));
      preedit_attrs[i + 1] = NULL;
    }

configure.aclibnimf/nimf-im.c, libnimf/nimf-types.c 에서 살짝 수정해주면 된다.

그리고, 이왕 하는 김에 PKGBUILD 를 만들어 makepkg 로 해주면 다른 곳에서도 쓸 수 있으니..

#
# PKGBUILD
# This file is part of Nimf.
#
# Unlike other files in the Nimf project,
# this PKGBUILD file is in the public domain.

pkgname=nimf
pkgver="2020.04.28"
pkgrel=1
pkgdesc="Nimf is an input method framework."
arch=('any')
#url="https://gitlab.com/nimf-i18n/nimf"
license=('LGPL3')
makedepends=('binutils' 'autoconf' 'automake' 'gcc' 'make' 'glib2' 'intltool'
             'gtk3' 'gtk2' 'qt5-base' 'libappindicator-gtk3' 'librsvg'
             'noto-fonts-cjk' 'libhangul' 'libxkbcommon'
             'wayland' 'libxklavier' 'gtk-doc')
depends=('glib2' 'gtk3' 'gtk2' 'qt5-base' 'libappindicator-gtk3'
         'libhangul' 'libxkbcommon' 'wayland' 'libxklavier')
optdepends=('noto-fonts-cjk: Google Noto CJK fonts')
#source=("https://gitlab.com/nimf-i18n/nimf/-/archive/master/nimf-master.tar.bz2")
source=($pkgname-${pkgver}.tar.xz)
md5sums=('SKIP')

pkgver() {
        cd "$srcdir/$pkgname-$pkgver"
        grep AC_INIT configure.ac | grep -Po '\d{4}.\d{2}.\d{2}'
}

build() {
        cd "$srcdir/$pkgname-$pkgver"
        ./autogen.sh --prefix=/usr --enable-gtk-doc
        make -j 4
}

package() {
        cd "$srcdir/$pkgname-$pkgver"
        make DESTDIR="${pkgdir}/" install
}

url 을 지우고(그냥 놔둬도 빌드엔 지장이 없을 듯은 하지만), source 를 현재 디렉토리에 있는 파일로 대체해서 빌드하도록 했다.


아울러, 환경변수를 설정해줘야 제대로 입력이 가능하다.

$HOME/.config/plasma-workspace/env 에 nimf.sh 등을 만들고 다음을 붙여넣는다.

export GTK_IM_MODULE=nimf
export QT4_IM_MODULE="nimf"
export QT_IM_MODULE=nimf
export XMODIFIERS="@im=nimf"
nimf

작동엔 아무 이상없는 듯?

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.