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

Я делаю простую игру для 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?

P.S .: Я пишу Makefile вручную. № / конфигурация

P.S.2: не хочу делать

mkdir -p ~/.game_name

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


person kure    schedule 22.11.2011    source источник
comment
Стоит отметить, что нет гарантии, что домашний каталог для данного пользователя будет находиться в /home/username (например, домашний каталог root обычно /root) - вместо этого используйте переменную среды HOME.   -  person nickgrim    schedule 23.11.2011
comment
Какого черта это так сложно найти в Google? Отсутствие обсуждения этого конкретного сценария вызывает беспокойство.   -  person Braden Best    schedule 26.05.2014


Ответы (2)


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

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

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

sudo make install

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

person Exp    schedule 22.11.2011
comment
Спасибо за ответ! Я не думал, что другой пользователь выполнит его и не будет иметь файла hightscores.bin. Но если я установлю двоичный файл в / usr / local / bin, все пользователи будут иметь к нему доступ? - person kure; 23.11.2011
comment
/usr/local/bin обычно недоступен для записи обычным пользователям и должен содержать только исполняемые файлы. В моей системе Gentoo игры с общими оценками помещают их в /var/games (вам нужно сделать это во время установки, а затем chmod 660; chgrp games, чтобы пользователи могли его обновить) (и вы должны сделать этот путь легко изменяемым, поскольку другие дистрибутивы могут иметь другой каталог макет) - person DirtY iCE; 23.11.2011

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

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

person Alessandro Pezzato    schedule 22.11.2011
comment
Спасибо! Имеет смысл создавать пользовательские файлы при первом запуске. Мне очень жаль, что я сначала не понял вашего ответа. - person kure; 23.11.2011