如何获取Makefile中的用户名?

我为Ubuntu做了一个简单的游戏,并且更新了高分列表,它在运行时需要一个单独的文件,叫做'highscores.bin'。

我希望把这个文件放在

/home/(USER)/.game_name 

我研究了一下,发现从一个Makefile里面我可以得到环境variables$ USER。 所以在Makefile的“安装”目标中,我添加了:

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

但是当我运行'sudo make install'时,Makefile会将其安装为:

 /home/root/.game_name 

我怎样才能得到一个Makefile中的(非根)用户名?

PS:我正在用手写Makefile。 没有./configure

PS2:我不想这样做

 mkdir -p ~/.game_name 

因为我想要能够改变DESTDIR,如果我想安装到一个临时目录。

那么,如果你想在运行期间的文件,我会建议你在运行时创建它。 Makefile只在编译期间被考虑。 这显然是一个问题,如果程序编译,然后由不同的用户执行,其中一些甚至可能不会在编译时存在。

在运行期间,你可以得到如下所示的主目录(如果你使用的是C / C ++)。 然后你可以检查是否存在高分档案文件夹/文件,并创建它,如果你需要。 如果您想为所有用户创建一个高分数的文件,您应该将其放在特殊用户的主目录中,而不是放在文件系统的其他位置。 这是例如通过游戏xjump完成的。

而关于你的Makefile,由于sudo命令,$ USER变量被转换为root

sudo make install

实际运行make的用户是超级用户:root。

你想为每个用户安装你的程序? 因此,如果您在用户运行游戏时创建/home/user/.game_name目录,而不是在root用户安装该目录时更好。 否则,只有调用sudo make install的用户才会安装它的高分列表。 如果只有一个用户,则不要将其安装在系统范围内,而是安装在用户目录中。

我建议在游戏首次运行时初始化用户文件 。 所以每个用户,甚至是安装游戏时都不存在的用户,都可以有高分列表。 您可以将初始化代码添加到游戏中(c ++,java或其他任何东西),或者只是调用外部脚本(不是那么优雅)。 避免在安装时创建与用户相关的文件。