47822
現在、ubuntu18 GNU Make 4.1 を利用しているのですが、ターミナル(fish)上で make
コマンド実施した場合の出力される言語について質問です。

> $ set LANG ja_JP.UTF-8

とした場合、make の出力内容は以下の通り「日本語」となります。

```

    $ make --version
    GNU Make 4.1
    このプログラムは x86_64-pc-linux-gnu 用にビルドされました
    Copyright (C) 1988-2014 Free Software Foundation, Inc.
    ライセンス GPLv3+: GNU GPL バージョン 3 以降 
    <http://gnu.org/licenses/gpl.html>
    これはフリーソフトウェアです: 自由に変更および配布できます.
    法律の許す限り、　無保証　です.
    
```

> $ set LANG en_us

とした場合、make の出力内容は以下の通り英語となります。

```

    $ make --version
    GNU Make 4.1
    Built for x86_64-pc-linux-gnu
    Copyright (C) 1988-2014 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later 
    <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    
```

そこで以下の質問があります。

(1) LANG 環境変数がなぜ make に影響がでるのでしょうか？makeそのものに仕掛けが導入されているのでしょうか？

(2) LANG 環境変数以外にこれらの出力言語をコントールする方法はあるのでしょうか？

(3) 現状 emacs を利用してソースを作成し、make も emacs の compile コマンドで実施しています。ですが、makefile
内にサブmakefileを make -C ... のように指定した場合、エラー発生時のエラー箇所ジャンプが正しく動作しません。具体的には$ set
LANG ja_JP.UTF-8 だと以下の様になり、ディレクトリに「入ります」、「出ます」が正しく認識されず、エラー箇所にジャンプできないようです。

> ディレクトリ 'xxx' に入ります  
>  ディレクトリ 'xxx' から出ます

念のため、 $ set LANG en_us とすると、以下のようになり、エラー箇所に正しくジャンプすることができます。

> Entering directory 'xxx'  
>  Leaving directory 'xxx'

とりあえずは、$ set LANG en_us とすると解決するのですが、本来どのように環境を構築しておくべきなのかお勧め設定等あれば教えて欲しいです。

以上、よろしくお願いいたします。
CC BY-SA 4.0
2018-08-26T12:45:27.427
47820
2018-08-26T15:28:53.103
13909
question
emacs makefile
gnu make のコンソールに表示される言語モードについて質問です。
Ubuntu（含めほぼ全てのLinuxディストリビューション）の言語設定ではLocaleというプログラムが利用されています。makeもLocaleの機能を利用しています。よって、

  * (1) `LANG` 環境変数を設定するとmakeの出力言語が変わるのは、makeがLocaleの機能を介して出力言語を変更しているからです。

> **LANG: デフォルトロケール**  
>  この変数で設定されたロケールは LC_* 変数全てで使われます (明示的に別のロケールを設定した場合はそちらが優先されます)。  
>
> [https://wiki.archlinux.jp/index.php/ロケール#LANG:_.E3.83.87.E3.83.95.E3.82.A9.E3.83.AB.E3.83.88.E3.83.AD.E3.82.B1.E3.83.BC.E3.83.AB](https://wiki.archlinux.jp/index.php/%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB#LANG:_.E3.83.87.E3.83.95.E3.82.A9.E3.83.AB.E3.83.88.E3.83.AD.E3.82.B1.E3.83.BC.E3.83.AB)

  * (2) また、 `LC_ALL` という環境変数をセットすることで `LANG` 及び `LC_*` を上書きして言語を設定することが出来ます。（ `LC_*` の各環境変数についてはここでは割愛するので `locale` のmanを参照してください。）

> **LC_ALL: トラブルシューティング**  
>  この変数で設定されたロケールは常に LANG と他の LC_* 変数よりも優先して使われます。

  * (3) とりあえずは、 `set LANG en_us` を`config.fish`、あるいはログインシェルの設定ファイルに記述すれば大丈夫です。

> <https://help.ubuntu.com/community/Locale#Changing_settings_temporarily>

正しく（恒久的に）Ubuntuの言語を設定する場合、以下のコマンドを実行すれば設定できるようです。

```

    sudo apt-get install language-pack-ja
    sudo update-locale LANG=ja_JP.UTF-8
    
```

> <https://help.ubuntu.com/community/Locale#Changing_settings_permanently>
CC BY-SA 4.0
2018-08-26T14:37:57.423
47822
2018-08-26T14:37:57.423
29826
47820
answer
> (3) 現状 emacs を利用してソースを作成し、make も emacs の compile コマンドで実施...

Emacsの変数 [compilation-directory-matcher](https://github.com/emacs-
mirror/emacs/blob/master/lisp/progmodes/compile.el#L587)
に定義された正規表現(英語出力を前提としている)を使って判断しているため、日本語出力に変わると検出できなくなることが原因です。

以下に、同様の問題を調査された方が記事を書かれていました。

[[emacs]コンパイルエラーへジャンプする際に、絶対パスで移動する](http://d.hatena.ne.jp/derui/20091003/1259383560)

その記事では、2つの対策を紹介されていました。

  * `M-x compile`の後に `LC_ALL=C make`と入力する
  * もしくは、Makefile内に`LC_ALL=C`と定義しておく
CC BY-SA 4.0
2018-08-26T15:08:29.280
47825
2018-08-26T15:28:53.103
2018-08-26T15:28:53.103
29553
29553
47820
answer