magのOSS備忘録

使ったOSSソフトウェアについて書いていきます。

Rustの開発環境を整える(Windows, Emacs)

前提

  • 2017/8現在の状況で, Windows上のEmacsにてRustの開発環境を整える.
  • 開発のスピードが速く, 以前は必要だった設定が不要になっていることが多い. そのため, 出来るだけメンテナンスされている各ツールのマニュアルに従った方がよい. が, そもそも何をしたのか忘れちゃうので書き残す.
  • 基本的には各ツールのマニュアルに従って設定している.

実行環境

* Windows 10 Pro 64bit版 (バージョン 1703)
* rustup 1.5.0
* rustc 1.19.0
* racer 2.0.10
* cargo 0.20.0

rustupのインストール

Rustのサイトのインストール手順に従ってrustup-init.exeをダウンロードし, rustupをインストールする. これでrustup, rustc, Cargoがインストールされる. 今回はデフォルトのstable-x86_64-pc-windows-msvcを使用する.

https://www.rust-lang.org/ja-JP/install.html

続けてVisual C++ビルドツールが必要になるため, インストールする.

環境変数の確認

Windowsの場合, 環境変数Pathに「%USERPROFILE%.cargo\bin」が追加される. もしされていないようだったら, 自分で追加する.

Racerのインストール

続けて, Racerのインストールを行う. コマンドプロンプト等を起動し, 以下のように実行する.

cargo install racer

CargoはデフォルトだとCPUの数に合わせてコンパイルを並列実行するため, 自分でjobs数を変更してもあまり効果は見られなかった.

Emacsの設定

パッケージのインストール

packages.elを使って下記のパッケージをインストールする. この辺りの手順は省略する.

  • racer
  • flycheck
  • flycheck-rust

この他にも補完にはcompany, エラー表示などにflycheck-popup-tipを使用している.

init.elの設定

設定の記述にはuse-packageを利用した.

;;; rust-mode
(use-package rust-mode
  :defer t
  :config
  (setq rust-format-on-save t))

;;; racer
(use-package racer
  :init
  (add-hook 'rust-mode-hook #'racer-mode)
  (add-hook 'racer-mode-hook #'eldoc-mode))

;;; flycheck-rust
(use-package flycheck-rust
  :init
  (add-hook 'rust-mode-hook
            '(lambda ()
               (flycheck-mode)
               (flycheck-rust-setup))))

設定済み画面

racerによる補完

f:id:boiled_mag:20170815145220p:plain

flycheck + flycheck-popup-tipによるエラー表示

f:id:boiled_mag:20170815145748p:plain

トラブルシューティング

パスの設定などで躓いたときに, 調査で使ったコマンドを残す.

Emacsからracerが正しく実行できているか

  • exec-pathに~/.cargo/binがパスに入っているかどうか.
M-x describe-variable RET exec-path RET
  • 下記のコマンドを実行したときに, 補完の候補が見つかること.
M-! racer complete std::io::B

Proxy内でCargoを使ったツールインストール時のエラー対策(Windows環境)

Cargoを使ってツール(rustfmt, racer)をインストールしようとしたときのメモ。 ユーザ認証が必要なProxy環境でCargoを利用したときに設定した内容を残す。

環境

cargo install racerなどがエラーになる

Proxyを通過出来るように設定してインストールを行おうとしたときに、下記のようなエラーメッセージが表示される。

SSL connect error (schannel: next InitializeSecurityContext failed: Unknown error(0x80092013) - 省略)」

SSL接続時に証明書の失効サーバーへアクセスできないようなので、SSL証明書の失効を確認しないようにする。

設定内容

Cargoをインストールすると%USERPROFILE%(例:c:\Users\user)配下に.cargoフォルダが作成されるので、ここにconfigというファイルを作る。そして以下のように設定を行う。

[http]
    proxy = "http://ユーザ名:パスワード@ホスト名:ポート番号"
    check-revoke = false # SSL証明書の失効を確認しない

Rust自体インストール(Cargo含む)時のProxy設定

Rustの開発環境のインストールはrustupを使って行うが、こちらは環境変数http_proxy、https_proxyを参照するため、予め設定しておく必要がある。下記のページに従ってsetコマンド等で設定するか、環境変数に登録しておく。

rustup.rs/README.md at master · rust-lang-nursery/rustup.rs · GitHub

参考

fishでhistoryの表示に日付を追加する

動機

bash等の他のシェルでは, historyコマンドの出力に日付や時間を追加することができる. これをfishで行おうとしたときに, 調べるのに少し時間がかかったので手順を残す.

前提

fish 2.4からhistoryコマンドに実装されたオプションを使う方法のため, fish 2.4以降のバージョンを使うこと.

手順

historyコマンドの–show-timeオプションを使用する.

なお, フォーマットを指定しないとコマンドを実行した日付・時刻とコマンドが2行で表示される.

日付・時刻とコマンドを一行で表示にするには下記のようにfunctionを定義する. デフォルトでは新しいものから順に表示されるため, sortコマンドで日付で昇順になるように並び替える.

# ~/.config/fish/functions/history.fish

function history
    builtin history --show-time='%Y/%m/%d %H:%M:%S ' | sort
end

参考

  1. Add an option in history builtin to show timestamps · Issue #677 · fish-shell/fish-shell · GitHub
  2. Why there isn't a number of the command and a timestamp for fish? - Unix & Linux Stack Exchange

cygwin1.dllに依存しないNTEmacsをCygwin上でビルドしてみる

※実験です。

動機

  • 正直何をしたいのか分からないタイトルになった.
  • NTEmacsはMSYS2を使ってビルドされることが一般的だが, Cygwinでも出来ないかと試してみた.
  • 以前にビルドしたCygwinに依存するNTEmacsでは, 非力なWindowsマシンにおいてflycheck等で遅延が大きく実用に耐えなかったので何とかならないかを模索してる一環で試してみた.

前提 (実施環境)

ビルドする

基本的にはnt/INSTALLに記載されている方法と同様. 今回は実験的な意味合いが強いので, IMEパッチ等は当てずに実施. cygwin1.dllに依存させないようにするため, コンパイラMinGWを使用する.

事前準備

Cygwinで予め以下のパッケージをインストールしておく.

  • mingw64-x86_64-gcc
  • mingw64-x86_64-pkg-config
  • mingw64-x86_64-ncurses

ビルド方法

$ ./autogen.sh

configureスクリプトに対してMinGWを使うことを指定する. 今回は下記のようにCCも指定したが–buildオプションがあれば十分?

$ PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/sys-root/mingw/lib/pkgconfig CC='x86_64-W64-mingw32-gcc' CLFAGS='-g3 -O2 -gdwarf-2' ./configure --build=x86_64-w64-mingw32 --prefix=/path/to/install --with-w32 --with-modules --without-dbus --without-compress-install

ここからは今回詰まったところ.

上記のままconfigureスクリプトを実行すると下記のようなメッセージが表示される. pwdコマンドの実行が失敗しているようだ. build-aux/msys-to-w32の実行で起きているため, このスクリプトを見てみると"pwd -W"というコマンドを実行している.

~中略~
config.status: executing src/epaths.h commands
./build-aux/msys-to-w32: line 79: pwd: -W: invalid option
pwd: usage: pwd [-LP]
~中略~

MSYS2のpwdコマンドでは, -Wオプションを付けることによってWindowsのドライブ始まりのパスを取得することができるようだ.

$ pwd -W
C:/msys64/usr/lib

この状態でmakeを走らせたところtemacsを実行する際にエラーとなった. どうやらパスの扱いが上手く行っていないらしい.

$ export PATH=$PATH:/usr/x86_64-w64-mingw32/sys-root/mingw/bin
$ make -j8
~中略~
./temacs --batch --load loadup bootstrap
Warning: arch-independent data dir '/cygdrive/c/path/to/work/test_install/share/emacs/25.2/etc/': Permission denied
Warning: Lisp directory '/cygdrive/c/path/to/work/emacs-25.2/emacs/lisp': Permission denied
Error: charsets directory not found:
c:/path/to/work/test_install/share/emacs/25.2/etc/charsets
Emacs will not function correctly without the character map files.
Please check your installation!

MSYS2側で試しにビルドを行ってみると, src/epaths.hに定義されている値のうちPATH_DUMPLOADSEARCHがドライブ始まりのパスとなっていたため, これに合わせてsrc/epaths.hを変更する.

  • 変更前:#define PATH_DUMPLOADSEARCH “/cygdrive/c/path/to/work/emacs-25.2/emacs/lisp
  • 変更後:#define PATH_DUMPLOADSEARCH “c:/path/to/work/emacs-25.2/emacs/lisp

あとは再度makeを走らせるだけ.

$ make -j8
$ make install

インストールし終わったあとはMSYS2と同様に各種dllへのパスを通すなどの設定が必要になるが, とりあえず起動することは確認できた. やはりこんなコーナーケースは考慮されていないようだ. 今回はsrc/epaths.hを修正する方法を取ったが, build-aux/msys-to-w32を修正する方が良さそう.

参考

Emacs の dump-emacs 関数の怪 — ありえるえりあ

Cygwin上でEmacs 25.1をビルドする

動機

  • CygwinにあるEmacsパッケージではWindows IMEが事実上使えないため, IMEパッチを当てたバイナリが欲しい.
  • Cygwinを使用しているので, Cygwinに依存してしまっても問題なく, またMSYS2等を新たにインストールしたくない.
  • どうせなら最新版(2016/10/9時点)が使ってみたかった.

前提

ソースコード取得

emacs 25.1のソースファイルをダウンロードする.

IMEパッチを適用する

IMEパッチはrzl24ozi氏が公開しているものを使用する.

rzl24ozi’s gists · GitHub

使用するパッチ

ここでは以下のパッチを使用する. 必須は1のみであり, 残りは適用しなくてもよい.

  1. emacs-25.1-w32-ime.diff
  2. emacs-25.1-disable-w32-ime.diff
  3. emacs-25.1-cygwin-rsvg.diff

ダウンロードしたIMEパッチの適用

$ cd emacs/
$ patch -b -p0 < emacs-25.1-w32-ime.diff
$ patch -b -p0 < emacs-25.1-disable-w32-ime.diff
$ patch -b -p0 < emacs-25.1-cygwin-rsvg.diff

ビルドする

about patches and how to build emacs on Windows. (Japanese) · GitHub

README.txtにてCygwin版の手順をまとめてくださっているので, 順に実行する. Cygwinの各種パッケージ(autoconf, automake等)が必要になるため, setup.exe等でインストールしておく.

もしパッケージが不足していたらconfigureを実行したときに分かる. エラーメッセージを参照して, 不足したパッケージをインストールすればよい. 逆に不要な機能があれば configure スクリプトへ --without オプションを渡すことでビルドされないようにすることもできる.

autogen.sh

emacs-25.1-w32-ime.diff を適用すると configure.ac に変更が加わるため autogen.sh を実行する.

$ ./autogen.sh

configure

渡しているオプションについては, 以下の通り.

  • --prefixでインストールするディレクトリを指定する. CygwinのパッケージのEmacsは/usrにインストールされるため, ここでは/usr/localにインストールしている.
  • CFLAGSに-march=nativeを指定し, ビルドで使ってるCPUに合わせた最適化を行わせる. これを行わないならCFLAGSの指定自体が不要.
$ PKG_CONFIG_PATH=/usr/lib/pkgconfig CFLAGS='-g3 -O2 -gdwarf-2 -march=native' ./configure --prefix=/usr/local --with-w32 --without-dbus --without-compress-install --with-modules

正しくIMEパッチが適用されれば, 下記のように出力が追加される.

  ~省略~

  Does Emacs support W32-IME?                             yes
  Does Emacs support RECONVERSION?                        yes
  Does Emacs support DOCUMENTFEED?                        yes

  ~省略~

ビルドおよびインストール

ここでは時間短縮のために-jオプションで8ジョブを同時実行するように指定している. ジョブ数は使用している環境のCPUに合わせて, コア数の2倍程度を指定すると良いとされている.

$ make -j 8
$ make install

設定

~/.emacs.d/init.elに以下のように記載する. init.elをCygwin以外でも使用しているため, system-typeの比較を行っているが必要なければ削除する.

(when (or (eq system-type 'cygwin) (eq system-type 'windows-nt))
  (setq default-input-method "W32-IME")
  (w32-ime-initialize)
  (setq-default w32-ime-mode-line-state-indicator "[--]")
  (setq w32-ime-mode-line-state-indicator-list '("[--]" "[あ]" "[--]"))
  )

参考

EmacsWiki: Emacs From Git

NTEmacs / Emacs for Windows

GitHub - chuntaro/NTEmacs64: Windows 版 Emacs (通称 NTEmacs) の 64bit 版