Как скомпилировать ядро ​​Linux с помощью Clang?

Это сложно. Главное понять, что systemd запускает все параллельно, если только не сказано не делать этого. На самом деле это указано на странице руководства в разделе «Требуется» :

.

requirement dependencies do not influence the order in which services are started or stopped

Чего вы хотите добиться, так это «подождать, пока будет запущена служба , прежде чем запустить b.service». Для этого вам нужны обе опции «Требуется» и «После» в вашем файле b.service :

.
[Unit]
Requires=a.service
After=a.service

[Service]
ExecStart=/bin/sleep 1000

= ОБНОВЛЕНИЕ =

Хорошо, я понимаю, что не так :в вашем файле a.service вы указали команду ExecStart и не указали тип. Это означает, что для Типа по умолчанию будет установлено значение «Простой». Для этого вам нужен тип «Разветвление». Со страницы руководства systemd.service:

If set to simple (the default if neither Type= nor BusName=, but ExecStart= are specified), it is expected that the process configured with ExecStart= is the main process of the service. In this mode, if the process offers functionality to other processes on the system, its communication channels should be installed before the daemon is started up (e.g. sockets set up by systemd, via socket activation), as systemd will immediately proceed starting follow-up units.

If set to forking, it is expected that the process configured with ExecStart= will call fork() as part of its start-up. The parent process is expected to exit when start-up is complete and all communication channels are set up. The child continues to run as the main daemon process. This is the behavior of traditional UNIX daemons. If this setting is used, it is recommended to also use the PIDFile= option, so that systemd can identify the main process of the daemon. systemd will proceed with starting follow-up units as soon as the parent process exits.

Поэтому вам следует обновить файл a.service, включив в него «Type=Forking»:

[Service]
Type=forking
ExecStart=/bin/false

Это сработает.:)

2
02.10.2019, 07:23
1 ответ

Сборка ядра позволяет указать инструменты, которые вы хотите использовать; например, чтобы указать компилятор C, установите переменные CCи HOSTCC:

make CC=clang HOSTCC=clang

Ожидается, что сборка будет успешной только с GCC, но есть люди, заинтересованные в использовании вместо этого Clang , и известно, что в некоторых случаях он работает (некоторые ядра Android собираются с помощью Clang ).

11
27.01.2020, 21:50

Теги

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