「セパレーターがない(TABのことですか)」と文句を言う


10

som_pak-3.1-NAcMoS.tar.gzファイルをインストールしようとしているときに、以下のコマンドを使用しました。

$ tar xvf som_pak-3.1-NAcMoS.tar.gz
$ cd som_pak-3.1
$ cp makefile.unix makefile
$ make
$ cd ..
$ ln -s som_pak-3.1 $NACMOS_HOME/som_pak

しかし、makeコマンドの実行中に次のエラーが発生します。

*セパレータがありません(8スペースの代わりにTABを意味していましたか?)。やめる。

  • エラーの理由を誰かに教えてもらえますか?
  • これに含める必要があるパッケージはありますか?

1
そのファイルはどこからダウンロードしましたか?
Gilles「SO-邪悪なことをやめなさい」

回答:


15

発生しているエラー:

***セパレータがありません(8スペースの代わりにTABを意味していましたか?)。やめる。

makefileタブの代わりにスペースが含まれていることを意味します。makeユーティリティは、の使用について悪名高く好き嫌いでSpaceはなく、Tab。したがって、ファイル内のルールスタンザの先頭にがmakefile含まSpaceれている可能性があります。

次の3つの.cファイルがあるとします。

こんにちはC
char *
hello() 
{
  return "Hello";
}
world.c
char *
world() 
{
  return "world";
}
main.c
#include <stdio.h>

/* Prototypes. */
char *hello();
char *world();

int
main(int argc, char *argv[]) 
{
    printf("%s, %s!\n", hello(), world());
    return 0;
}    

私が以下を持っているとしましょうMakefile

# The executable 'helloworld' depends on all 3 object files
helloworld: main.o hello.o world.o
        cc -o helloworld main.o hello.o world.o # Line starts with TAB!

# Build main.o (only requires main.c to exist)
main.o: main.c
        cc -c main.c # Line starts with TAB!

# Build hello.o (only requires hello.c to exist)
hello.o: hello.c
        cc -c hello.c # Line starts with TAB!

# Build world.o (only requires world.c to exist)
world.o: world.c
        cc -c world.c # Line starts with TAB!

#  Remove object files, executables (UNIX/Windows), Emacs backup files, 
#+ and core files
clean:
        rm -rf  *.o helloworld *~ *.core core # Line starts with TAB!

今、私たちはターゲットを構築しようとします

ターゲットに対して実行するとhelloworld

$ make helloworld
makefile:3: *** missing separator (did you mean TAB instead of 8 spaces?).  Stop.

見覚えがあります?

問題を修正する

これを修正するにはSpaces、実際のTab文字に変更します。以前vimはファイルを修復していました。開くだけです:

$ vim makefile

そして、このコマンドを次の場所で実行します。

:%s/^[ ]\+/^I/

注: ^Iは特殊文字です。タイピング^が続くIと比べて異なって解釈されますCtrl+ V- Ctrl+ I

これにより、1以上Spacesで始まるすべての行が実際の行に置き換えられますTab

helloworldターゲットを再実行すると:

$ make helloworld
cc -c main.c # Line starts with TAB!
cc -c hello.c # Line starts with TAB!
cc -c world.c # Line starts with TAB!
cc -o helloworld main.o hello.o world.o # Line starts with TAB!

参考文献


そのvimコマンドを使用しようとすると、E486エラーパターンが見つからない
Daniel Jacobson

@DanielJacobson-新しいQがある場合は、質問してください。コメントは、新しい質問をするためのものではありません。
slm

^ Iをタブではなくファイル自体に作成しました
Sun

1

他の回答が示唆しているように、Makefileにはスペース文字ではなくタブ文字が必要です。私は私の持っている.vimrc、私は手動で個々のMakefileで逆の設定を設定する必要がありますので、自動的にスペースですべてのタブを交換するセットを。vim次のように私の使用であることのコマンドを実行します。

:%s/^[ ]\+/\t/g

私はこのモードライン(Makefileの最初の行)を使用します# vim: set noet:
Michael D.

0

注:この特定の問題に対処する正しい方法は、1つのタブ文字を使用して各レシピの各アクション行がインデントされるようにMakefileを修正し、そのパッチを元の開発者に提出することです。

これは醜いハックであり、最近のバージョンのGNUで動作しますmake(Makefileがタブではなくスペースを一貫して使用することが問題である場合):

make '.RECIPEPREFIX+='

これにより、特別なGNU make変数.RECIPEPREFIXが1つのスペースに設定されます。この変数は、GNU make3.82(2007)以降、レシピのアクション行の前に付ける文字を制御します。変数が空の場合(デフォルト)、タブが使用されます。

例、

$ cat Makefile
all:
  echo hello
$ make '.RECIPEPREFIX+='
echo hello
hello

使用例>(この場合はMakefile内の変数を設定する)の例:

$ cat Makefile
.RECIPEPREFIX = >
all:
> echo hello
$ make
echo hello
hello

以下も参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.