管理者権限が無い場所での環境構築 [GCC, Emacs, Python3]

Linux (CentOS) を想定しているが、たぶん UNIX 系ならほとんど変わらないはず(管理者権限の無い Mac というのも珍しいだろうが)。

インストール先 (/usr/local に対応するもの) はここでは $HOME/.local としている。

make -jResource temporarily unavailable エラーが出たら make -j8 のように並列数を明示する。

0. Autotools

wget https://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz
tar xzvf autoconf-latest.tar.gz
cd autoconf-2.69
./configure --prefix=$HOME/.local
make -j && make check && make install -j
cd ..
wget https://ftp.gnu.org/gnu/automake/automake-1.16.tar.gz
tar xzvf automake-1.16.tar.gz
cd automake-1.16
./configure --prefix=$HOME/.local
make -j && make check && make install -j
cd ..
wget http://ftpmirror.gnu.org/libtool/libtool-2.4.6.tar.gz
tar xzvf libtool-2.4.6.tar.gz
cd libtool-2.4.6
 ./configure --prefix=$HOME/.local
make -j && make check && make install -j
cd ..

1. GCC

何はともあれ GCC (?)。こいつを最初に入れておくとライブラリパスとかをさっさと移動できて便利。

まずは最初から与えられているライブラリパス等の呪縛から逃れる。これをしないと各種コンパイル中に様々なエラーが出る可能性が高い。

unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH LDFLAGS CFLAGS CPPFLAGS

次に ミラーサイト から GCC @ /software/gcc/releases および GCCコンパイルに必要な GMP, MPFR, MPC @ /software/gcc/infrastructure と、同じく必要な ELF @ http://www.mr511.de/software/ をダウンロードしてくる。

wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-7.4.0/gcc-7.4.0.tar.gz
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/infrastructure/gmp-6.1.0.tar.bz2
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/infrastructure/mpfr-3.1.4.tar.bz2
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/infrastructure/mpc-1.0.3.tar.gz
wget http://www.mr511.de/software/libelf-0.8.13.tar.gz

そしてこれらを依存関係順にインストールしていく。

bunzip2 gmp-6.1.0.tar.bz2
tar xvf gmp-6.1.0.tar
cd gmp-6.1.0
./configure --prefix=$HOME/.local --disable-shared --enable-static
make -j && make check -j && make install -j
cd ..
bunzip2 mpfr-3.1.4.tar.bz2
tar xvf mpfr-3.1.4.tar
cd mpfr-3.1.4
./configure --prefix=$HOME/.local --disable-shared --enable-static --with-gmp=$HOME/.local
make -j && make check -j && make install -j
cd ..
tar xzvf mpc-1.0.3.tar.gz
cd mpc-1.0.3
./configure --prefix=$HOME/.local --disable-shared --enable-static --with-gmp=$HOME/.local --with-mpfr=$HOME/.local
make -j && make check -j && make install -j
cd ..
tar xzvf libelf-0.8.13.tar.gz
cd libelf-0.8.13
./configure --prefix=$HOME/.local --disable-shared --enable-static
make -j && make check -j && make install -j
cd ..
tar xzvf gcc-7.4.0.tar.gz
cd gcc-7.4.0
mkdir build
cd build
../configure --prefix=$HOME/.local --enable-languages=c,c++ --disable-bootstrap --disable-multilib --with-gmp=$HOME/.local --with-mpfr=$HOME/.local --with-mpc=$HOME/.local --with-libelf=$HOME/.local
make -j && make check -k -j && make install -j

GCCmake check で出てくる autogen: Command not found というエラーは無視しても大丈夫(そのために -k オプションがついている)。これを解決しようとすると Autogen のための Guile のための libunistring と bdw-gc と、、、となり非常に厄介。

stackoverflow.com

インストールが終わったら $HOME/.bash_profile の末尾に以下を記述して新しいパスを通す。$PATH だけは元のパスも残しておかないといけない。他に使いたいライブラリやヘッダがあればそれらも追加する。最初の unset ....bash_profile の先頭に書いておいてよいかもしれない。

# Write in $HOME/.bash_profile

export PATH="$HOME/.local/bin:$PATH"
export LD_LIBRARY_PATH="$HOME/.local/lib/:$HOME/.local/lib64"
export LD_RUN_PATH="$HOME/.local/lib/:/$HOME/.local/lib64"
export C_INCLUDE_PATH="$HOME/.local/include"
export CPLUS_INCLUDE_PATH="$HOME/.local/include"
source $HOME/.bash_profile

2. Python3

OpenSSL @ https://www.openssl.org/source/sqlite @ https://www.sqlite.org/download.html と libffi @ https://sourceware.org/libffi/ をインストールしておく必要がある。

wget https://www.openssl.org/source/openssl-1.1.0j.tar.gz
tar xzvf openssl-1.1.0j.tar.gz
cd openssl-1.1.0j
./config --prefix=$HOME/.local
make -j8 && make install -j
cd ..
wget https://www.sqlite.org/2019/sqlite-autoconf-3270100.tar.gz
tar xzvf sqlite-autoconf-3270100.tar.gz
cd sqlite-autoconf-3270100
./configure --prefix=$HOME/.local
make -j && make install -j
cd ..
wget ftp://sourceware.org/pub/libffi/libffi-3.2.1.tar.gz
tar xzvf libffi-3.2.1.tar.gz
cd libffi-3.2.1
./configure --prefix=$HOME/.local
make -j && make check -j && make install -j
cd ..

Python は一般的なダウンロードリンクではなく cpython @ https://github.com/python/cpython を使う。OpenSSL をデフォルトパス以外にインストールした場合は特に環境変数の指定に気をつけなければならない。

git clone -b 3.7 https://github.com/python/cpython
cd cpython
export LDFLAGS="-L$HOME/.local/lib/ -L/$HOME/.local/lib64/"
export LD_LIBRARY_PATH="$HOME/.local/lib/:$HOME/.local/lib64/"
export CPPFLAGS="-I$HOME/.local/include -I$HOME/.local/include/openssl"
./configure --prefix=$HOME/.local
make -j && make install -j

元からある python バイナリを変えずにインストールしたい場合は make altinstall を使う。

superuser.com

終わったら python, pip コマンドを Python3 に変えておく。alias で済ませるよりもちゃんとシンボリックリンクを作る方が良い。

cd $HOME/.local/bin
ln -sf python3 python

3. Emacs

ImageMagick @ https://imagemagick.org/script/install-source.php が必要。liblcms2 とかも求められたら適宜入れる。

wget https://imagemagick.org/download/ImageMagick.tar.gz
tar xvzf ImageMagick.tar.gz
cd ImageMagick-7.0.8-28
./configure --prefix=$HOME/.local
make -j && make check -j && make install -j
cd ..
git clone -b emacs -26 https://github.com/emacs-mirror/emacs
cd emacs
./autogen.sh
./configure --prefix=$HOME/.local --with-gif=no --with-gnutls=no
make -j8 && make check -j && make install -j

終わったら Emacs 起動時にウィンドウを開かないようにコマンドを変えておく。

# Write in $HOME/.bash_profile

alias emacs='emacs -nw'

4. Emacs の init.el

まずは外見に関するパラメタを変更する。

(custom-set-faces
 '(default ((t (:background "black" :foreground "#55FF55"))))
 '(cursor ((((class color) (background dark)) (:background "#00AA00")) (((class color) (background light)) (:background "#999999")) (t nil))))

(setq inhibit-startup-message t)
(setq make-backup-files nil)
(setq auto-save-default nil)
(setq auto-save-list-file-name nil)
(setq auto-save-list-file-prefix nil)
(show-paren-mode 1)
(setq show-paren-style 'mixed)
(set-face-background 'show-paren-match "grey")
(set-face-foreground 'show-paren-match "black")
(setq cursor-in-non-selected-windows nil)
(global-font-lock-mode t)
(column-number-mode t)
(line-number-mode t)
(setq fill-column 80)
(setq-default auto-fill-mode t)
(setq default-tab-width 4)
(setq scroll-step 1)
(setq backup-inhibited t)
(setq-default tab-width 4 indent-tabs-mode nil)
(define-coding-system-alias 'UTF-8 'utf-8)
(global-set-key "\M-n" (lambda () (interactive) (scroll-up 1)))
(global-set-key "\M-p" (lambda () (interactive) (scroll-down 1)))

次に MELPA を基本的に https://melpa.org/#/getting-started に従いインストールする。具体的には、以下を init.el に追記し(た後開き直し?)てから M-x package-refresh-contents を実行する。

環境によっては https://melpa.org/packages/ だと通信できないことがあるので http にしてある。

;; MELPA
(require 'package)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.org/packages/") t)
(package-initialize)

あとは好きなパッケージを M-x package-install RET <package_name> もしくは M-x list-packages RET -> I -> X でインストールしていく。(GNU が提供するものは後者でないとインストールできない?)

4-1. company

;; company
(global-company-mode)
(setq company-idle-delay 0)
(setq company-minimum-prefix-length 2)
(setq company-selection-wrap-around t)

4-2. company-jedi

;; company-jedi
(defun my/python-mode-hook ()
  (add-to-list 'company-backends 'company-jedi))
(add-hook 'python-mode-hook 'my/python-mode-hook)

4-3. flymake

  • M-x list-packages RET -> C-s flymake -> I -> X でインストール
  • flymake を C, C++ で使う場合は init.el に以下を追記
(require 'flymake)
(defun flymake-cc-init ()
  (let* ((temp-file   (flymake-init-create-temp-buffer-copy
                       'flymake-create-temp-inplace))
         (local-file  (file-relative-name
                       temp-file
                       (file-name-directory buffer-file-name))))
    (list "g++" (list "-std=c++11" "-Wall" "-Wextra" "-fsyntax-only" local-file))))
(push '("\\.cpp$" flymake-cc-init) flymake-allowed-file-name-masks)
(push '("\\.cc$" flymake-cc-init) flymake-allowed-file-name-masks)
(push '("\\.h$" flymake-cc-init) flymake-allowed-file-name-masks)
(push '("\\.hpp$" flymake-cc-init) flymake-allowed-file-name-masks)
(add-hook 'c++-mode-hook
          '(lambda ()
             (flymake-mode t)))
(defun flymake-c-init ()
  (let* ((temp-file   (flymake-init-create-temp-buffer-copy
                       'flymake-create-temp-inplace))
          (local-file (file-relative-name
                       temp-file
                       (file-name-directory buffer-file-name))))
    (list "gcc" (list "-std=c99" "-Wall" "-Wextra" "-Wno-trigraphs" "-fsyntax-only" local-file))))
(push '("\\.c$" flymake-c-init) flymake-allowed-file-name-masks)
(add-hook 'c-mode-hook
          '(lambda ()
             (flymake-mode t)))

;; change indent size
(add-hook 'c-mode-common-hook
          '(lambda ()
             (c-set-style "k&r")
             (setq c-basic-offset 4)
             (setq indent-tabs-mode 4)
             (setq tab-width 4)))

4-4. flymake-python-pyflakes

  • pyflakesシンタックスチェッカーとして flymake を Python で使う
  • あらかじめ $ pip install pyflakes しておく
  • M-x package-install RET flymake-python-pyflakes でインストール
  • init.el に以下を追記
(add-hook 'python-mode-hook 'flymake-python-pyflakes-load)

4-5. flymake-cursor

cd $HOME/.emacs.d/elpa
git clone https://github.com/akash-akya/emacs-flymake-cursor
cd emacs-flymake-cursor
  • flymake-cursor.el 中の (format "compile error, problem on line %s" msg) だと minibuffer の表示が無駄に長いので、 (format msg) に編集しておく
  • 以下を init.el に記述
;; Need for Emacs >= 26 to show messages in minibuffer
(add-to-list 'load-path "~/.emacs.d/elpa/emacs-flymake-cursor")
(require 'flymake-cursor)
(custom-set-variables
 '(flymake-cursor-error-display-delay 0)
 '(flymake-cursor-number-of-errors-to-display 5)
 '(help-at-pt-display-when-idle '(flymake-overlay)))