9

私は Ubuntu 用の簡単なゲームを作成しています。ハイスコア リストを更新するには、実行時に「highscores.bin」という 1 つのファイルが必要です。

このファイルを次の場所に置きたい

/home/(USER)/.game_name

少し調べたところ、Makefile 内から環境変数 $USER を取得できることがわかりました。そのため、Makefile の「インストール」ターゲットに、次を追加しました。

mkdir -p $(DESTDIR)home/$$USER/.game_name

しかし、「sudo make install」を実行すると、Makefile は次のようにインストールします。

/home/root/.game_name

Makefile で (root 以外の) ユーザー名を取得するにはどうすればよいですか?

PS: Makefile を手で書いています。いいえ ./configure

PS2: やりたくない

mkdir -p ~/.game_name

一時ディレクトリにインストールしたい場合、DESTDIRを変更できるようにしたいからです。

4

2 に答える 2

14

実行時にそのファイルが必要な場合は、実行時に作成することをお勧めします。Makefile は、コンパイル時にのみ考慮されます。プログラムがコンパイルされ、別のユーザーによって実行された場合、これは明らかに問題であり、コンパイル時に存在しないユーザーもいます。

実行時に、ここに示すようにホーム ディレクトリを取得できます(C/C++ を使用している場合)。次に、ハイスコア フォルダー/ファイルの存在を確認し、必要に応じて作成できます。すべてのユーザーのハイスコア ファイルが必要な場合は、それを特別なユーザーのホーム ディレクトリに配置する必要がありますが、ファイル システムの別の場所に配置する必要があります。これは、たとえばゲーム xjump によって行われます。

Makefile については、$USER 変数は、sudoコマンド により root に変換されます。

sudo make install

実際に make を実行しているユーザーは、スーパーユーザーである root です。

于 2011-11-22T22:53:21.447 に答える
5

すべてのユーザーにプログラムをインストールしますか? root がゲームをインストールするときではなく、ユーザーがゲームを実行するときに/home/user/.game_nameディレクトリを作成する方がよいでしょう。それ以外の場合は、電話をかけたユーザーのみがsudo make installハイスコア リストを取得します。ユーザーが 1 人しかいない場合は、システム全体ではなく、ユーザー ディレクトリにインストールします。

ゲームの最初の実行時にユーザー ファイルを初期化することをお勧めします。したがって、すべてのユーザーは、ゲームがインストールされたときに存在していなかったユーザーも含めて、ハイスコア リストを持つことができます。初期化コードをゲームに追加するか (C++、Java など)、それを実行する外部スクリプトを呼び出すことができます (あまりエレガントではありません)。インストール時にユーザー関連のファイルを作成しないようにします。

于 2011-11-22T22:53:34.200 に答える