Как узнать, где определен макрос RPM или во что он расширяется?

Моя цель была такой же, как у оригинального плаката, но с одним отличием :Мне нужно было запустить приложение SDL как демон systemd. Моя машина с Linux — Raspberry Pi 3, а операционная система — Raspbian Jessie. Клавиатура или мышь не подключены к RPi. Подключаюсь к нему по SSH. Мое приложение SDL на самом деле основано на Pygame -. Я установил pygame/SDL для использования драйвера кадрового буфера «fbcon» через переменную среды SDL _VIDEODRIVER. Мой вывод systemd --version—:

systemd 215 +PAM +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ -SECCOMP -APPARMOR

Моя версия пакета pygame:(aptitude show python-pygame):

1.9.2~pre~r3348-2~bpo8+rpi1

Моя версия libSDL 1.2:(aptitude show libsdl1.2debian-на вашем компьютере имя пакета может быть другим):

1.2.15-10+rpi1

Рецепт

  1. Настройте разрешения для файлов /dev/tty и /dev/fb0, как описано в Ответ UDude. Я обнаружил, что права /dev/console меняются. не нужны в Raspbian Jessie.
  2. Добавьте эти строки в раздел [Service] вашего демона.service файл:

    User=pi #Your limited user name goes here
    StandardInput=tty
    StandardOutput=tty
    TTYPath=/dev/tty2   # I also tried /dev/tty1 and that didn't work for me
    

    Если кому интересно, вот полный файл pyscopefb.service, который я использовал:

    [Unit]
    Description=Pyscopefb test service 
    Wants=network-online.target
    After=rsyslog.service
    After=network-online.target
    
    [Service]
    Restart=no
    ExecStart=/home/pi/Soft/Test/pygame/pyscopefb
    ExecStop=/bin/kill -INT $MAINPID
    OOMScoreAdjust=-100
    TimeoutStopSec=10s
    User=pi
    WorkingDirectory=/home/pi/Soft/Test/pygame
    StandardInput=tty
    StandardOutput=tty
    TTYPath=/dev/tty2
    
    [Install]
    WantedBy=multi-user.target
    
  3. Введите эти команды в командной строке (Я предполагаю, что файл pyscopefb.service уже помещен в нужное место, где systemd может его найти):

    sudo systemctl daemon-reload
    sudo systemctl start pyscopefb
    

Это работает для меня. Обратите внимание, что я не проверял, может ли приложение pygame получать события клавиатуры и мыши или нет.

Бонус

Пришлось решить еще 2 задачи, которые тоже могут быть интересны

  1. В нижней части экрана мигал текстовый курсор с графика фреймбуфера. Чтобы решить эту проблему, я добавил в свое приложение следующий код Python, который запускается в моем приложении до инициализации Pygame/SDL:

    def _disable_text_cursor_blinking(self):
        command_to_run = ["/usr/bin/sudo", "sh", "-c", "echo 0 > /sys/class/graphics/fbcon/cursor_blink"]
        try:
            output = subprocess32.check_output(command_to_run, universal_newlines = True)
            self._log.info("_disable_text_cursor_blinking succeeded! Output was:\n{output}", output = output)
        except subprocess32.CalledProcessError:
            self._log.failure("_disable_text_cursor_blinking failed!")
            raise
    
  2. Примерно через 10 минут экран подключился к HDMI Raspberry Pi. вывод стал черным (, но не выключился ), и моя графика не display, хотя Pygame не сообщил об ошибках. Это оказалось функция энергосбережения.Чтобы отключить это, я добавил следующий Python код, который также запускается до инициализации Pygame/SDL:

    def _disable_screen_blanking(self):
        command_to_run = ["/usr/bin/setterm", "--blank", "0"]
        try:
            output = subprocess32.check_output(command_to_run, universal_newlines = True)
            self._log.info("_disable_screen_blanking succeeded! Output was:\n{output}", output = output)
        except subprocess32.CalledProcessError:
            self._log.failure("_disable_screen_blanking failed!")
            raise
    

0
20.11.2019, 06:27
1 ответ

Используя __installв качестве примера, вы можете увидеть, где это определено с помощью

rpm --showrc | grep __install

Или вы можете увидеть определение с помощью

rpm --eval "%{__install}"
1
28.01.2020, 03:06

Теги

Похожие вопросы