如何在Makefile中获取用户名?

9
我正在为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

如何在Makefile中获取(非root)用户名?
附注:我手动编写Makefile。没有./configure 附注2:我不想这样做
mkdir -p ~/.game_name

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

1
值得指出的是,并不保证给定用户的主目录位于/home/username(例如,root的主目录通常为/root)-请改用HOME环境变量。 - nickgrim
为什么在谷歌上找这个如此困难?缺乏对于这种具体情况的讨论令人担忧。 - Braden Best
2个回答

14

如果您想在运行时获取该文件,我建议您在运行时创建它。Makefile 仅在编译时被考虑。如果程序由不同的用户编译和执行,则显然会出现问题,其中一些用户可能在编译时甚至不存在。

在运行时,您可以像这里所示(如果您使用C/C++)获取主目录。然后,您可以检查高分文件/文件夹是否存在并在需要时创建它。如果要为所有用户创建高分文件,则不应将其放在特殊用户的主目录中,而是应该放在文件系统的其他位置。例如,游戏xjump就是这样做的。

关于您的 Makefile,$USER 变量由于下面的 sudo 命令而被翻译成了 root。

sudo make install

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


谢谢你的回答!我没有考虑到其他用户执行它时可能没有'hightscores.bin'文件。但是如果我将二进制文件安装在/usr/local/bin,所有用户都可以访问它吗? - kure
一般情况下,普通用户无法在/usr/local/bin中进行写操作,该目录应仅包含可执行文件。在我的gentoo系统中,具有共享分数的游戏将它们放在/var/games中(您需要在安装时执行此操作,然后chmod 660; chgrp games,以便用户可以更新它)(您还应该使该路径易于更改,因为其他发行版可能具有不同的目录布局)。 - DirtY iCE

5
你想要为每个用户安装你的程序?因此最好是在用户运行游戏时创建/home/user/.game_name目录,而不是在root安装时创建。否则,只有调用sudo make install的用户将拥有其高分列表。 如果你只有一个用户,请不要进行系统范围内的安装,而是在用户目录中进行安装。
我建议在首次运行游戏时初始化用户文件。这样,即使是在安装游戏时不存在的用户也可以拥有他们的高分列表。你可以将初始化代码添加到游戏中(c ++,java或其他任何语言)或者只需调用外部脚本来完成(不太优雅)。避免在安装过程中创建与用户相关的文件。

谢谢!在第一次运行时创建用户文件是有意义的。很抱歉我一开始没有理解你的回答。 - kure

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接