Как я могу получить имя пользователя в Makefile? - PullRequest
9 голосов
/ 23 ноября 2011

Я делаю простую игру для Ubuntu, и для обновления списка рекордов во время выполнения требуется один файл, называемый 'highscores.bin'.

Я хочу поместить этот файл в

/home/(USER)/.game_name

Я немного исследовал и обнаружил, что из Makefile я могу получить переменную окружения $ USER.Итак, в Makefile, к цели 'install', я добавил:

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

Но когда я запускаю 'sudo make install', Makefile устанавливает его как:

/home/root/.game_name

Как я могу получить (не root) имя пользователя в Makefile?

PS: Я пишу Makefile вручную.Нет ./configure

PS2: я не хочу делать

mkdir -p ~/.game_name

, потому что я хочу иметь возможность изменить DESTDIR, если я хочу установить во временный каталог.

Ответы [ 2 ]

14 голосов
/ 23 ноября 2011

Ну, если вы хотите этот файл во время выполнения, я бы порекомендовал вам создать его во время выполнения.Makefile считается только во время компиляции.Это, очевидно, проблема, если программа компилируется и затем выполняется разными пользователями, некоторые из которых могут даже не существовать во время компиляции.

Во время выполнения вы можете получить домашний каталог, как показано здесь (если вы используете C / C ++).Затем вы можете проверить наличие папки / файла рекордов и создать его, если вам нужно.Если вам нужен файл рекордов для всех пользователей, вы должны поместить его в домашний каталог специального пользователя, а не где-нибудь еще в файловой системе.Это делается, например, игрой xjump.

А что касается вашего Makefile, переменная $ USER переводится в root из-за команды sudo на

sudo make install

Пользователь, фактически запускающий make, является суперпользователем: root.

5 голосов
/ 23 ноября 2011

Вы хотите установить свою программу для каждого пользователя?Так что лучше, если вы создадите каталог / home / user / .game_name , когда пользователь запустит игру, а не когда root установит ее.В противном случае, только у пользователя, который позвонит sudo make install, будет список рекордов.Если у вас есть только один пользователь, не устанавливайте его в масштабе всей системы, но в каталоге пользователей.

Я предлагаю инициализировать пользовательских файлов при первом запуске игры.Таким образом, каждый пользователь, даже тот, кого не было на момент установки игры, может иметь свой список рекордов.Вы можете добавить инициализирующий код в вашу игру (c ++, java или что-то еще) или просто вызвать внешний скрипт, который это делает (не так уж и элегантно).Избегайте создания пользовательских файлов во время установки.

...