2011-11-22 7 views
5

Sto facendo un semplice gioco per Ubuntu e per aggiornare l'elenco dei punteggi migliori, ha bisogno di un singolo file in fase di esecuzione, chiamato "highscores.bin".Come ottengo il nome utente in un Makefile?

desidero mettere al file dal

/home/(USER)/.game_name 

ho studiato un po 'e ha scoperto che all'interno di un Makefile posso ottenere l'ambiente $ USER variabile. Così nel Makefile, al bersaglio 'installazione', ho aggiunto:

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

Ma quando ho eseguito 'sudo make install', il Makefile installa come:

/home/root/.game_name 

Come può ottengo il nome utente (non root) in un Makefile?

P.S .: Sto scrivendo il Makefile a mano. No ./configure

P.S.2: Non voglio fare

mkdir -p ~/.game_name 

perché voglio essere in grado di cambiare DESTDIR se voglio installare in una directory temporanea.

+0

Vale la pena sottolineare che non vi è alcuna garanzia che la directory home per un determinato utente sia in/home/nomeutente (ad es.L'homedir di 'root' è in genere'/root') - usa invece la variabile di ambiente 'HOME'. – nickgrim

+0

Perché diavolo è così difficile da trovare su google? La mancanza di discussione su questo specifico scenario è preoccupante. –

risposta

11

Bene, se si desidera quel file durante il runtime, si consiglia di crearlo durante il runtime. Il Makefile è considerato solo durante la compilazione. Questo è ovviamente un problema se il programma è compilato e poi eseguito da diversi utenti, alcuni dei quali potrebbero non esistere nemmeno in fase di compilazione.

Durante il runtime è possibile ottenere la directory home come mostrato in here (se si utilizza C/C++). Quindi puoi verificare l'esistenza della cartella/file di punteggi migliori e crearla se necessario. Se si desidera un file di punteggi elevato per tutti gli utenti, è necessario inserirlo nella directory home di un utente speciale, ma in qualche altro punto nel file system. Questo è per esempio fatto dal gioco xjump.

E sulla tua Makefile, la variabile utente $ si traduce di radicare a causa della comando sudo su

sudo make install

L'utente effettivamente in esecuzione make è il superutente: root .

+0

Grazie per la risposta! Non ho pensato ad un altro utente che lo eseguiva e non avendo il file 'hightscores.bin'. Ma se installo il file binario in/usr/local/bin, tutti gli utenti avrebbero accesso ad esso? – kure

+0

'/ usr/local/bin' in genere non è scrivibile da un utente ordinario e dovrebbe contenere solo file eseguibili. Nei miei giochi di sistema gentoo con spartito condiviso li metto in '/ var/games' (devi farlo al momento dell'installazione, e poi' chmod 660; giochi chgrp ', così gli utenti possono aggiornarlo) (e dovresti farlo percorso facilmente modificabile, poiché altre distribuzioni possono avere layout di directory diversi) –

4

Si desidera installare il programma per tutti gli utenti? Quindi è meglio se crei la directory /home/user/.game_name quando l'utente esegue il gioco, non quando root lo installa. In caso contrario, solo l'utente che chiama sudo make install avrà il suo elenco di punteggi migliori. Se si dispone di un solo utente, non installarlo a livello di sistema, ma nella directory utente.

Suggerisco di inizializzare i file utenti al primo avvio del gioco. Quindi ogni utente, anche gli utenti che non esistevano quando il gioco è stato installato, può avere il proprio elenco di punteggi migliori. Puoi aggiungere il codice di inizializzazione nel tuo gioco (C++, java o qualsiasi altra cosa) o semplicemente chiamare uno script esterno che lo faccia (non così elegante). Evitare di creare file relativi all'utente al momento dell'installazione.

+0

Grazie! Ha molto senso creare file utente alla prima esecuzione. Mi dispiace non aver capito la tua risposta all'inizio. – kure

Problemi correlati