2011-11-22 22 views
5

Tôi đang tạo một trò chơi đơn giản cho Ubuntu và cập nhật danh sách điểm cao, nó cần một tệp duy nhất trong thời gian chạy, được gọi là 'highscores.bin'.Tôi làm cách nào để có được tên người dùng trong Makefile?

Tôi muốn đặt tập tin này tại

/home/(USER)/.game_name 

Tôi đã nghiên cứu một chút và thấy rằng từ bên trong một Makefile tôi có thể nhận biến môi trường $ USER. Vì vậy, trong Makefile, tại 'cài đặt' mục tiêu, tôi đã thêm:

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

Nhưng khi tôi chạy 'sudo make install', các Makefile cài đặt nó như:

/home/root/.game_name 

thế nào có thể tôi có được tên người dùng (không phải root) trong một Makefile?

P .: Tôi đang viết Makefile bằng tay. Không ./configure

P.S.2: Tôi không muốn làm

mkdir -p ~/.game_name 

bởi vì tôi muốn để có thể thay đổi DESTDIR nếu tôi muốn cài đặt vào một thư mục tạm thời.

+0

Điều đáng nói là không có gì đảm bảo rằng thư mục chính cho một người dùng cụ thể sẽ có tại '/ home/username' (ví dụ:'homedir của' root' thường là '/ root') - thay vào đó hãy sử dụng biến môi trường' HOME'. – nickgrim

+0

Tại sao địa ngục này lại khó tìm thấy trên google? Việc thiếu thảo luận về kịch bản cụ thể này là đáng lo ngại. –

Trả lời

11

Vâng, nếu bạn muốn tệp đó trong thời gian chạy, tôi khuyên bạn nên tạo tệp đó trong thời gian chạy. Makefile chỉ được xem xét trong thời gian biên dịch. Đây rõ ràng là một vấn đề nếu chương trình được biên dịch và sau đó được thực thi bởi những người dùng khác nhau, một số trong đó có thể không tồn tại trong thời gian biên dịch.

Trong thời gian chạy, bạn có thể nhận thư mục chính như được hiển thị here (nếu bạn đang sử dụng C/C++). Sau đó, bạn có thể kiểm tra sự tồn tại của thư mục/tập tin điểm cao và tạo nó nếu bạn cần. Nếu bạn muốn có một tệp điểm cao cho tất cả người dùng, bạn nên đặt nó vào thư mục chính của một người dùng đặc biệt, nhưng thay vì ở một nơi khác trong hệ thống tệp. Đây là ví dụ được thực hiện bởi các trò chơi xjump.

Và về Makefile của bạn, biến USER $ được phiên dịch sang nhổ tận gốc vì sudo lệnh trên

sudo make install

Người dùng thực sự chạy làm là superuser: root .

+0

Cảm ơn bạn đã trả lời! Tôi đã không nghĩ đến một người dùng khác thực thi nó và không có tệp 'hightscores.bin'. Nhưng nếu tôi cài đặt nhị phân tại/usr/local/bin, tất cả người dùng sẽ có quyền truy cập vào nó? – kure

+0

'/ usr/local/bin' thường không thể ghi được bởi người dùng thông thường và chỉ nên chứa tệp thi hành. Trên các trò chơi hệ thống gentoo của tôi với các điểm chia sẻ, hãy đặt chúng trong '/ var/games' (bạn cần thực hiện tại thời điểm cài đặt, và sau đó là' chmod 660; chgrp games', để người dùng có thể cập nhật nó) đường dẫn dễ dàng thay đổi, vì các bản phân phối khác có thể có bố cục thư mục khác nhau) –

4

Bạn muốn cài đặt chương trình của mình cho mọi người dùng? Vì vậy, tốt hơn nếu bạn tạo thư mục /home/user/.game_name khi người dùng chạy trò chơi, không phải khi người dùng cài đặt trò chơi đó. Nếu không, chỉ người dùng gọi số sudo make install mới có danh sách điểm cao. Nếu bạn chỉ có một người dùng, không cài đặt nó trên toàn hệ thống, nhưng trong thư mục người dùng.

Tôi khuyên bạn nên khởi tạo tệp người dùng khi chạy trò chơi đầu tiên. Vì vậy, mỗi người dùng, ngay cả người dùng không tồn tại khi trò chơi được cài đặt, có thể có danh sách điểm cao của họ. Bạn có thể thêm mã khởi tạo vào trò chơi của mình (C++, java hoặc bất kỳ thứ gì khác) hoặc chỉ cần gọi một tập lệnh bên ngoài thực hiện nó (không quá thanh lịch). Tránh tạo các tệp liên quan đến người dùng trong thời gian cài đặt.

+0

Cảm ơn! Nó tạo ra rất nhiều ý nghĩa để tạo các tệp người dùng lúc chạy đầu tiên. Tôi xin lỗi vì tôi không hiểu câu trả lời của bạn lúc đầu. – kure

Các vấn đề liên quan