Linux Programmer

[CentOS7] vim 7.4의 python3 지원 본문

컴퓨터 관련/리눅스(유닉스) 일반

[CentOS7] vim 7.4의 python3 지원

sunyzero 2022. 11. 23. 02:36

CentOS7.9의 vim 7.4의 python3 지원 패키지 설치 및 빌드

 

CentOS 7.9에 설치되는 vim-enhanced 패키지는 python 2.x만 지원하고, python 3는 지원하지 않도록 빌드되어있다. 따라서 python3를 이용하는 플러그인 사용시 에러가 발생한다. 이를 해결하기 위해 vim 소스 파일을 다운 받아서 빌드해도 되지만, 그렇게 되면 패키지 버전 관리도 안되고, 빌드를 위해 각종 라이브러리와 헤더를 설치해야 하므로 귀찮아진다. 따라서 미리 빌드된 CentOS 7.9용 RPM 패키지를 올려둔다. 패키지 압축 파일과 설치법은 조금 아래에 적어두었다.

 

1. 배경

CMake, make 및 C 관련 프로그래밍 툴 강의를 갔는데, CentOS 7.9에서 당연히 vim ultisnip이 지원되는줄 알았는데, 작동이 안되었다. vim 7.x를 지원하는 Ultisnips 옛날 버전인데도 이상하게 작동이 안되었다. Ultisnips가 python을 사용하므로 python이 지원되도록 빌드되어야 하는데... "vim --version | grep python" 명령으로 확인해보니 python2만 지원하고 python3를 지원하지 않는다. 대략 난감이다.

vim 7.4 on CentOS 7.9

혹시 vim 패키지 업데이트 된 것이 있나 살펴봤더니 없다. 하기사 RHEL 8을 넘어 9이 나오는 시점에 7.9 패키지가 새로 빌드될 리가... 하지만 리눅스의 장점이 뭔가? 소스 코드가 다 오픈되어있으니 없으면 그냥 내가 만들면 된다는 점이다.

 

 

2. vim 7.4 패키지 파일

RPM 패키지를 빌드 하려면 여러모로 귀찮아지므로 그냥 파일만 받아서 설치할 사람을 위해 압축 파일을 올려놓는다. 압축은 요새 핫한 zstd 로 압축되어있다.(zstd의 압축률과 속도는 압권이므로 이젠 gzip보다 zstd를 쓰는 편이다. zstd안쓰면 유행에 뒤쳐지는 것이므로 이 참에 써보자. 참고로 zstd 파일은 확장자가 zst이다.)

그런데 zst file 압축을 풀려면 먼저 zstd가 설치되어있어야 하므로, 없다면 yum -y install zstd 를 root 권한으로 명령하자. 그리고 아래 패키지 파일도 다운 받아두자.

vim74_py3.tar.zst
8.50MB

 

vim74_py3_tar.zst의 zstd tarball 압축 해제 명령은 아래와 같다. (tar xfa vim74_py3_tar.zst해도 될 것 같지만 안된다. 버전이 낮아서...ㅠㅠ)

일반적으로 xz, gz, bz2 같은 압축은 tar xfa 명령으로 풀 수 있지만, zstd는 비교적 최근에 나왔기 때문에 tar 1.31 버전이상에서만 tar xfa의 자동 압축 및 해제가 가능하다. 아쉽게도 CentOS 7.9의 tar는 1.26이다. 따라서 pipe를 이용해서 풀어야 한다.

$ ls vim74_py3.tar.zst
vim74_py3.tar.zst

$ zstd -T0 -dcf vim74_py3.tar.zst | tar x

$ ls *.rpm
vim-X11-7.4.629-9.el7.x86_64.rpm      vim-enhanced-7.4.629-9.el7.x86_64.rpm    
vim-minimal-7.4.629-9.el7.x86_64.rpm  vim-common-7.4.629-9.el7.x86_64.rpm  
vim-filesystem-7.4.629-9.el7.x86_64.rpm

 

혹시라도 zstd 옵션이 궁금한 사람을 위해... 정리해둔다. 

-T0 멀티 스레드를 사용하여 CPU갯수만큼 자동으로 멀티로 작동한다.
-dcf -d : decompress (압축 해제)
-c : write to stdout (표준 출력으로 내보냄)
-f : force (disable input and output checks)

압축이 다 해제되었으면 설치하자. sudo가 설정되어있다면 아래처럼 명령하고, 아니라면 root 권한으로 변경해서 yum -y update vim*.rpm 명령으로 설치하면 된다.

 

$ sudo yum -y update vim*.rpm

 

설치 완료 후 vim --version으로 확인해보면 "-python3" 부분이 "+python3/dyn"으로 변경되어있을 것이다.

vim 7.4 (CentOS 7.9) : python3 enabled

 

 

3. vim 7.4 패키지 리빌드

혹시라도 필자가 vim 패키지에 어떤 수작(?)을 부려놨을지 모르니까 내가 직접 빌드해서 만들겠다는 분들이 있을것이다. 그래서 위의 패키지를 제작한 순서를 적어두겠다. 혹은 어떤 기능을 넣거나 빼고 싶을 때도 이 방법을 쓰면 된다. RPM패키지는 생각보다 만들거나 수정하기가 쉽다. 따라서 인터넷에서 git clone 으로 소스를 빌드하여 설치하는 방법보다는 패키지를 만들어서 쓰는게 낫다.(차후 버전 관리를 위해서 패키지를 만드는 것을 강력 추천한다. 그냥 make install로 마구 설치하다간 시스템이 누더기가 된다.)

 

3.1. Preparation

준비 작업은 총 3가지 단계가 필요하다. 첫번째 단계는 vim 소스패키지(SRPM)을 설치하는 것이다. 두번째 단계는 vim 빌드를 위한 library, header(devel package)의 설치이다. 세번째 단계는 debugbuild를 비활성화이다. 디버그 빌드는 말그대로 디버깅용 패키지를 만드는 작업인데, 검증이나 테스트를 제외하고는 만들지 않는다.

주의할 점은 첫번째 단계만 일반 유저의 권한으로 한다는 점이다. (강제로 전부 root로 해도 되긴한데, 안정성이나 여러가지 측면에서 보통 일반 유저로 작업하는 것을 추천한다. root는 딱 필요할 때만 쓰는 것이 리눅스 나라의 국룰이다. 마구 잡이로 root권한 쓴다면 잘못 배운거다.)

--> 첫번째 단계 : vim SRPM 설치
$ mkdir ~/temprpm
$ cd !$

$ yumdownlaod --source vim

$ ls
vim-7.4.629-8.el7_9.src.rpm 

$ rpm -ivh vim-7.4.629-8.el7_9.src.rpm 

--> 두번째 단계 : vim 빌드용 library, devel packages 설치 (su -로 root로 바꿔서 설치한다.)
# su -
# sudo yum -y install ncurses-devel libacl-devel gpm-devel libselinux-devel  gtk2-devel libSM-devel libXt-devel libXpm-devel python-devel python3-devel ruby-devel perl-devel  perl-ExtUtils-Embed

--> 세번째 단계 : root 권한으로 작업한다.
# cat > /etc/rpm/macros <<HERE
%debug_package %{nil}
HERE

# cat /etc/rpm/macros
%debug_package %{nil}

 

작업 후 마지막에 cat /etc/rpm/macros 명령으로 macros 파일의 내용이 제대로 되어있는지 꼭~ 검증하자.

 

3.2. SPEC 파일 편집

패키지를 작성하기 위한 설계도와 같은 설정 파일이 SPEC 파일이다. 앞서 준비 과정에서 vim-7.4.629-8.el7_9.src.rpm 파일을 설치하면 ~/rpmbuild/SPEC/vim.spec에 만들어진다. 이 vim.spec 파일에서 수정할 부분은 총 3부분이다.

첫째로 version을 수정한다. version을 올리지 않으면 업그레이드가 되지 않기 때문이다. 다만 프로그램 코드 상의 변화는 없으므로 major, minor, patch 버전은 유지하고, release 버전만 올린다. 보통 패키지의 설정 변화나 문서의 변화는 릴리즈만 올리는 것이 관습이다. 따라서 "Release: 8%{?dist}"로 되어있는 부분을 찾아서 "Release: 9%{?dist}"로 변경한다. 이렇게 하면 실제로 빌드되는 vim의 버전이 vim-7.4.629-8.el7_9 에서 vim-7.4.629-9.el7_9 로 변경된다.

그리고 둘째로 changelog에 어떤 변경이 있었는지 꼭 기입해둬야 한다. 아무리 간단한 수정이라도 꼭 기입해둬야 한다. 이것도 리눅스 나라의 국룰이다.

Summary: The VIM editor
URL:     http://www.vim.org/
Name: vim
Version: %{baseversion}.%{patchlevel}
Release: 9%{?dist} 


... 생략...
... 한참 밑으로 가서 changelog를 수정한다 ...


%changelog
* Thu Nov 03 2022 Sunyoung Kim <sunyzero@gmail.com> - 2:7.4.629-9
- python3interp=dynamic support

* Wed Sep 30 2020 Zdenek Dohnal <zdohnal@redhat.com> - 2:7.4.629-8
- 1833186 - gvim consums 100% cpu under certain condition

 

셋째로 실제 설정을 변경한다. %configure로 시작하는 행을 찾는데, 주의할 점은 이게 여러번 나온다. 우리는 vim-enhanced만 고치면 되므로 cp vim enhanced-vim 라인의 윗 부분에 존재하는 %configure를 수정해야만 한다. 아래 코드를 참고하자.

 

...생략...
cp vim gvim
make clean

%configure --prefix=%{_prefix} --with-features=huge \
 --enable-pythoninterp=dynamic \
 --enable-perlinterp \
 --disable-tclinterp \
 --with-x=no \
 --enable-gui=no --exec-prefix=%{_prefix} --enable-multibyte \
 --enable-cscope --with-modified-by="<bugzilla@redhat.com>" \
 --with-tlib=ncurses \
 --with-compiledby="<bugzilla@redhat.com>" \
%if "%{withnetbeans}" == "1"
  --enable-netbeans \
%else
  --disable-netbeans \
%endif
%if %{WITH_SELINUX}
  --enable-selinux \
%else
  --disable-selinux \
%endif
%if "%{withruby}" == "1"
  --enable-rubyinterp=dynamic \
%else
  --disable-rubyinterp \
%endif
%if "%{withlua}" == "1"
  --enable-luainterp=dynamic \
%else
  --disable-luainterp \
%endif

make VIMRCLOC=/etc VIMRUNTIMEDIR=/usr/share/vim/%{vimdir} %{?_smp_mflags}
cp vim enhanced-vim
...생략...

 

수정할 부분은 위에서 --enable-pythoninterp=dynamic \ 행의 아랫 부분이다. 여기에 아래와 같이  --enable-python3interp=dynamic \ 설정을 추가해 넣는다. 이 라인이 바로 python3를 동적로딩으로 활성화 하는 부분이다. 아래는 수정된 SPEC 파일의 부분이다.

...생략...
%configure --prefix=%{_prefix} --with-features=huge \
 --enable-pythoninterp=dynamic \
  --enable-python3interp=dynamic \
 --enable-perlinterp \
 --disable-tclinterp \
 --with-x=no \
 --enable-gui=no --exec-prefix=%{_prefix} --enable-multibyte \
 --enable-cscope --with-modified-by="<bugzilla@redhat.com>" \
 --with-tlib=ncurses \
 --with-compiledby="<bugzilla@redhat.com>" \
 ...생략...

 

3군데의 수정이 모두 끝났으면 vim.spec 파일을 저장한다.

 

3.3. Rebuilding packages

이제 빌드를 하자. vim.spec 파일이 있는 SPEC 디렉터리에서 다음 명령을 내린다. (이 예제에서 해당 디렉터리의 경로는 /home/sunyzero/rpmbuild/SPEC이다.)

소스 패키지를 만들 필요가 없다면 rpmbuild -bb vim.spec으로 명령해도 된다. (하지만 일반적으로 관리를 위해서 소스 패키지도 같이 만들어 두는 것이 좋다)

$ rpmbuild -ba vim.spec
... 생략 ...
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/sunyzero/rpmbuild/BUILDROOT/vim-7.4.629-9.el7.x86_64
Wrote: /home/sunyzero/rpmbuild/SRPMS/vim-7.4.629-9.el7.src.rpm
Wrote: /home/sunyzero/rpmbuild/RPMS/x86_64/vim-common-7.4.629-9.el7.x86_64.rpm
Wrote: /home/sunyzero/rpmbuild/RPMS/x86_64/vim-minimal-7.4.629-9.el7.x86_64.rpm
Wrote: /home/sunyzero/rpmbuild/RPMS/x86_64/vim-enhanced-7.4.629-9.el7.x86_64.rpm
Wrote: /home/sunyzero/rpmbuild/RPMS/x86_64/vim-filesystem-7.4.629-9.el7.x86_64.rpm
Wrote: /home/sunyzero/rpmbuild/RPMS/x86_64/vim-X11-7.4.629-9.el7.x86_64.rpm

$ ls ../SRPMS
vim-7.4.629-9.el7.src.rpm  => 소스 패키지이다. 다음에는 언제든지 rpmbuild --rebuild vim-7.4.629-9.el7.src.rpm 명령으로 쉽게 리빌딩할 수 있다. 혹은 이 소스패키지를 설치해서 조금씩 수정하면 다른 설정의 vim 7.4를 만들수 있다.

$ ls ../RPMS/x86_64/
vim-X11-7.4.629-9.el7.x86_64.rpm     vim-enhanced-7.4.629-9.el7.x86_64.rpm
vim-common-7.4.629-9.el7.x86_64.rpm  vim-filesystem-7.4.629-9.el7.x86_64.rpm
vim-minimal-7.4.629-9.el7.x86_64.rpm

$ su -c "yum -y update ../RPMS/x86_64/*.rpm"

$ vim --version | grep python
+cryptv          +linebreak       +python/dyn      +viminfo
+cscope          +lispindent      +python3/dyn     +vreplace

 

vim 7.4용 ultisnips 패키지도 혹시 필요할지 모르니 나중에 압축해서 따로 올려놓도록 할 예정이다. (ultisnips 최신 버전은 vim 8이상을 요구한다)

반응형
Comments