2011-11-22 11 views
5

Estoy haciendo un juego simple para Ubuntu y para actualizar la lista de mejores puntuaciones, necesita un único archivo en tiempo de ejecución, llamado 'highscores.bin'.¿Cómo obtengo el nombre de usuario en un Makefile?

Deseo poner este archivo en

/home/(USER)/.game_name 

He investigado un poco y encontré que desde el interior de un Makefile que pueda obtener la variable de entorno $ USER. Así en el Makefile, en el objetivo 'instalar', he añadido:

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

Pero cuando corro 'sudo make install', el Makefile lo instala como:

/home/root/.game_name 

¿Cómo puede obtengo el nombre de usuario (no raíz) en un Makefile?

P.S .: Estoy escribiendo el archivo Makefile a mano. Sin ./configure

P.S.2: Yo no quiero hacer

mkdir -p ~/.game_name 

porque quiero ser capaz de cambiar DESTDIR si quiero instalar en un directorio temporal.

+0

Vale la pena señalar que no hay garantía de que el directorio particular de un usuario determinado esté en '/ home/username' (p.'homeed' de root' es usualmente '/ root') - use la variable de entorno' HOME' en su lugar. – nickgrim

+0

¿Por qué demonios es tan difícil de encontrar en google? La falta de discusión sobre este escenario específico es preocupante. –

Respuesta

11

Bueno, si quiere ese archivo durante el tiempo de ejecución, le recomendaría que lo cree durante el tiempo de ejecución. El Makefile se considera solo durante el tiempo de compilación. Esto es obviamente un problema si el programa es compilado y luego ejecutado por diferentes usuarios, algunos de los cuales ni siquiera pueden existir en el momento de la compilación.

Durante el tiempo de ejecución puede obtener el directorio de inicio como se muestra en here (si usa C/C++). Luego puede verificar la existencia de la carpeta/archivo de mejores puntuaciones y crearla si lo necesita. Si desea un archivo de puntuación más alta para todos los usuarios, debe ponerlo en el directorio principal de un usuario especial, pero en otro lugar en el sistema de archivos. Esto es por ejemplo hecho por el juego xjump.

Y sobre su Makefile, la variable de usuario $ se traduce a la raíz debido a la sudo comando en

sudo make install

El usuario que realmente ejecuta make es el superusuario: root .

+0

¡Gracias por la respuesta! No he pensado en otro usuario que lo ejecute y que no tenga el archivo 'hightscores.bin'. Pero si instalo el binario en/usr/local/bin, ¿todos los usuarios tendrían acceso a él? – kure

+0

'/ usr/local/bin' generalmente no puede ser escrito por un usuario ordinario, y solo debe contener ejecutables. En mi sistema gentoo, los juegos con puntajes compartidos los colocan en '/ var/games' (debes hacerlo en el momento de la instalación, y luego en' chmod 660; chgrp games', para que los usuarios puedan actualizarlo) (y debes hacer eso ruta fácilmente modificable, ya que otras distribuciones pueden tener un diseño de directorio diferente) –

4

¿Desea instalar su programa para cada usuario? Por lo tanto, es mejor si crea el directorio /home/user/.game_name cuando el usuario ejecuta el juego, no cuando root lo instala. De lo contrario, solo el usuario que llame al sudo make install tendrá su lista de mejores puntuaciones. Si solo tiene un usuario, no lo instale en todo el sistema, sino en el directorio de usuarios.

Sugiero inicializar archivos de usuarios en el primer intento del juego. Entonces, todos los usuarios, incluso los usuarios que no existían cuando se instaló el juego, pueden tener su lista de puntuaciones más altas. Puedes agregar el código de inicialización a tu juego (C++, java o cualquier otra cosa) o simplemente llamar a un script externo que lo haga (no tan elegante). Evite crear archivos relacionados con el usuario en el momento de la instalación.

+0

¡Gracias! Tiene mucho sentido crear archivos de usuario en la primera ejecución. Lamento que no entendí tu respuesta al principio. – kure

Cuestiones relacionadas