File c-lightning.spec of Package c-lightning
#
# spec file for package c-lightning
#
# Copyright (c) 2025 SUSE LLC and contributors
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
# settings
%define progname lightning
%define progbase %{progname}
%define display_name Lightning Network
# set blockchain network
%define bc_network bitcoin
Name: c-lightning
Version: 25.9.0rc4
Release: 0
Summary: Lightning Network for P2P digital currency
License: MIT
Group: Productivity/Networking/Other
URL: https://blockstream.com/%{progname}/
Source0: %{progname}-%{version}.tar.xz
Patch0: %{name}-libexec.patch
Patch1: %{name}-script.patch
BuildRequires: automake
BuildRequires: gmp-devel
BuildRequires: jq
BuildRequires: libsodium-devel
BuildRequires: libtool
BuildRequires: python3-Mako
BuildRequires: python3-distutils-extra
%if 0%{?suse_version} && 0%{?suse_version} <= 1320
BuildRequires: shadow
%endif
BuildRequires: sqlite3-devel
BuildRequires: zlib-devel
%if ! %{defined _rundir}
%define _rundir %{_localstatedir}/run
%endif
# set binary names
%define daemon_name %{progbase}d
%define cli_name %{progbase}-cli
%define hsmtool_name %{progbase}-hsmtool
%define reckless_name reckless
# set package names
%define daemon_packname %{name}d
# set runtime parameters
%define prog_confdirbase %{progbase}
%define prog_rundirbase %{progbase}
%define prog_statedirbase %{progbase}
%define prog_confdir %{_sysconfdir}/%{prog_confdirbase}
%define prog_logdir %{_localstatedir}/log/%{progbase}
%define prog_rundir %{_rundir}/%{prog_rundirbase}
%define prog_statedir %{_localstatedir}/lib/%{prog_statedirbase}
%define prog_conffile %{prog_confdir}/%{progbase}.conf
%define prog_logfile %{prog_logdir}/%{daemon_name}.log
%define prog_pidfile %{prog_rundir}/%{daemon_name}.pid
%define prog_user %{progbase}
%define prog_group %{progbase}
# set install parameters
%define service_filename %{daemon_name}.service
%define network_service_filename %{bc_network}d.service
%define pkg_rundirconffile %{_tmpfilesdir}/%{progbase}_rundir.conf
%if 0%{?suse_version} && 0%{?suse_version} >= 1500
%define pkg_bashcompdir %{_datadir}/bash-completion/completions
%else
%define pkg_bashcompdir %{_sysconfdir}/bash_completion.d
%define pkg_bashcompsuffix .bash-completion
%endif
# set description
%define description_text C-Lightning is a lightweight, highly customizable and standard compliant implementation of the Lightning Network Protocol.
# set summary and description for utils package
%define pkg_utils_description This package provides %{display_name} CLI and %{display_name} HSM-Tool.
%description
%{description_text}
%package utils
Summary: Utils for %{name}
Group: Productivity/Networking/Other
Provides: %{progname}-utils = %{version}
%description utils
%{description_text}
%{pkg_utils_description}
%package -n %{daemon_packname}
Summary: Headless daemon for %{name}
Group: Productivity/Networking/Other
Requires: %{bc_network}-utils
Requires: logrotate
Recommends: %{bc_network}d
Provides: %{progname}d = %{version}
%{?systemd_requires}
%description -n %{daemon_packname}
%{description_text}
This package provides %{daemon_name}, a headless %{display_name} daemon.
%package doc
Summary: Documentation for %{name}
Group: Documentation/Man
BuildArch: noarch
Provides: %{progname}-doc = %{version}
Recommends: %{daemon_packname} = %{version}
%description doc
%{description_text}
This package contains the documentation for %{name}.
%prep
%setup -q -n %{progname}-%{version}
%if 0%{?suse_version} && ( 0%{?suse_version} < 1500 || ( 0%{?is_opensuse} && 0%{?suse_version} == 1500 && 0%{?sle_version} && 0%{?sle_version} <= 150600 ) )
%patch -P 0
%endif
%patch -P 1
# setup systemd service
%{__sed} -i 's#^\# \$ systemctl edit lightningd.service$#\# $ systemctl edit %{service_filename}#g' contrib/init/%{service_filename}
%{__sed} -i 's#^\# /etc/lightningd/lightningd.conf#\# %{prog_conffile}#g' contrib/init/%{service_filename}
%{__sed} -i 's#^Description=Core Lightning daemon$#Description=%{display_name} Daemon#g' contrib/init/%{service_filename}
%{__sed} -i 's#^Requires=bitcoind.service$#Requires=%{network_service_filename}#g' contrib/init/%{service_filename}
%{__sed} -i 's#^After=bitcoind.service$#After=%{network_service_filename}#g' contrib/init/%{service_filename}
%{__sed} -i 's#^PIDFile=/run/lightningd/lightningd.pid$#PIDFile=%{prog_pidfile}#g' contrib/init/%{service_filename}
%{__sed} -i 's#^ExecStart=/usr/bin/lightningd --daemon --conf /etc/lightningd/lightningd.conf --pid-file=/run/lightningd/lightningd.pid$#ExecStart=%{_bindir}/%{daemon_name} --daemon --conf %{prog_conffile} --pid-file=%{prog_pidfile} --lightning-dir=%{prog_statedir}\nExecReload=/bin/kill -HUP \$MAINPID#g' contrib/init/%{service_filename}
%{__sed} -i 's#^\# Creates /run/lightningd owned by bitcoin$#\# Creates %{prog_rundir} owned by %{prog_user}#g' contrib/init/%{service_filename}
%{__sed} -i 's#^RuntimeDirectory=lightningd$#RuntimeDirectory=%{prog_rundirbase}#g' contrib/init/%{service_filename}
%{__sed} -i 's#^\# Creates /etc/lightningd owned by bitcoin$#\# Creates %{prog_confdir} owned by %{prog_user}#g' contrib/init/%{service_filename}
%{__sed} -i 's#^ConfigurationDirectory=lightningd$#ConfigurationDirectory=%{prog_confdirbase}#g' contrib/init/%{service_filename}
%{__sed} -i 's#^User=bitcoin$#User=%{prog_user}#g' contrib/init/%{service_filename}
%{__sed} -i 's#^Group=bitcoin$#Group=%{prog_group}#g' contrib/init/%{service_filename}
# setup default config file
echo -e "#\n# %{progbase}.conf\n#" > %{progbase}.conf
echo -e "\n# general options" >> %{progbase}.conf
echo "network=%{bc_network}" >> %{progbase}.conf
echo -e "\n# daemon options" >> %{progbase}.conf
echo "log-level=info" >> %{progbase}.conf
echo "log-file=%{prog_logfile}" >> %{progbase}.conf
echo "wallet=sqlite3://%{prog_statedir}/%{bc_network}/lightningd.sqlite3" >> %{progbase}.conf
echo "#encrypted-hsm=" >> %{progbase}.conf
echo -e "\n# node options" >> %{progbase}.conf
echo "#fee-base=1000" >> %{progbase}.conf
echo "#fee-per-satoshi=10" >> %{progbase}.conf
echo "#min-capacity-sat=10000" >> %{progbase}.conf
echo -e "\n# bitcoin control options" >> %{progbase}.conf
echo "bitcoin-cli=%{_bindir}/%{bc_network}-cli" >> %{progbase}.conf
echo "bitcoin-datadir=%{_localstatedir}/lib/%{bc_network}" >> %{progbase}.conf
echo "#bitcoin-rpcuser=" >> %{progbase}.conf
echo "#bitcoin-rpcpassword=" >> %{progbase}.conf
echo "bitcoin-rpcconnect=localhost" >> %{progbase}.conf
echo "bitcoin-rpcport=8332" >> %{progbase}.conf
# generate logrotate configuration
echo "%{prog_logfile} {" > %{progname}.logrotate
echo " compress" >> %{progname}.logrotate
echo " dateext" >> %{progname}.logrotate
echo " daily" >> %{progname}.logrotate
echo " rotate 90" >> %{progname}.logrotate
echo " notifempty" >> %{progname}.logrotate
echo " missingok" >> %{progname}.logrotate
echo " su %{prog_user} %{prog_group}" >> %{progname}.logrotate
echo " copytruncate" >> %{progname}.logrotate
echo " create 640" >> %{progname}.logrotate
echo "}" >> %{progname}.logrotate
# setup run folder
echo "d %{prog_rundir} 0710 root %{prog_group}" > rundir.conf
%build
./configure --prefix=%{_prefix} --disable-static --disable-rust
%{__make}
%install
%make_install
%{__strip} -sp %{buildroot}%{_bindir}/%{daemon_name}
%{__strip} -sp %{buildroot}%{_bindir}/%{cli_name}
%{__strip} -sp %{buildroot}%{_bindir}/%{hsmtool_name}
%{__strip} -sp %{buildroot}%{_libexecdir}/%{name}/%{progbase}_*
%{__strip} -sp %{buildroot}%{_libexecdir}/%{name}/plugins/[a-b,d-v,x-z]*
%{__strip} -sp %{buildroot}%{_libexecdir}/%{name}/plugins/c[a-k,m-z]*
%{__strip} -sp %{buildroot}%{_libexecdir}/%{name}/plugins/cln-*
# install daemon supplementary files
%{__install} -D -m 0644 -p %{progbase}.conf %{buildroot}%{prog_conffile}
%{__install} -D -m 0644 -p contrib/init/%{service_filename} %{buildroot}%{_unitdir}/%{service_filename}
%{__install} -D -m 0644 -p contrib/%{cli_name}.bash-completion %{buildroot}%{pkg_bashcompdir}/%{cli_name}%{?pkg_bashcompsuffix}
%{__install} -d -m 0710 %{buildroot}%{prog_logdir}
%{__install} -D -m 0644 -p %{progname}.logrotate %{buildroot}%{_sysconfdir}/logrotate.d/%{daemon_packname}
%{__install} -d -m 0710 %{buildroot}%{prog_statedir}
%{__install} -d -m 0755 %{buildroot}%{_sbindir}
%{__ln_s} %{_sbindir}/service %{buildroot}%{_sbindir}/rc%{daemon_name}
# install run folder configuration
%{__install} -D -m 0644 -p rundir.conf %{buildroot}/%{pkg_rundirconffile}
# eliminate installed docs
%{__rm} -fr %{buildroot}%{_datadir}/doc
# eliminate other rubbish
%{__rm} -fr %{buildroot}%{_libexecdir}/%{name}/plugins/clnrest/.github
%{__rm} -f %{buildroot}%{_libexecdir}/%{name}/plugins/clnrest/Makefile
%{__rm} -f %{buildroot}%{_libexecdir}/%{name}/plugins/wss-proxy/Makefile
# no rpath check on arm architectures
%ifarch %arm
export NO_BRP_CHECK_RPATH=true
%endif
# %%check
# %%{__make} %{?_smp_mflags} check
%pre -n %{daemon_packname}
getent group %{prog_group} > /dev/null || groupadd -r %{prog_group}
getent passwd %{prog_user} > /dev/null || useradd -r -g %{prog_group} -d %{prog_statedir} -s /sbin/nologin -c "%{progbase} daemon" %{prog_user}
%service_add_pre %{service_filename}
%preun -n %{daemon_packname}
%service_del_preun %{service_filename}
%post -n %{daemon_packname}
%service_add_post %{service_filename}
%if 0%{?suse_version} && ( 0%{?suse_version} > 1320 || ( 0%{?is_opensuse} && 0%{?suse_version} == 1315 && 0%{?sle_version} && 0%{?sle_version} >= 120100 ) )
%tmpfiles_create %{pkg_rundirconffile}
%else
systemd-tmpfiles --create %{pkg_rundirconffile} >/dev/null 2>&1 || :
%endif
%postun -n %{daemon_packname}
%service_del_postun %{service_filename}
%files utils
%defattr(-,root,root,-)
%attr(755,root,root) %{_bindir}/%{cli_name}
%attr(755,root,root) %{_bindir}/%{hsmtool_name}
%attr(755,root,root) %{_bindir}/%{reckless_name}
%{pkg_bashcompdir}/%{cli_name}%{?pkg_bashcompsuffix}
%{_mandir}/man1/%{cli_name}.1%{?ext_man}
%{_mandir}/man1/%{progbase}-%{reckless_name}.1%{?ext_man}
%{_mandir}/man8/%{hsmtool_name}.8%{?ext_man}
%files -n %{daemon_packname}
%defattr(-,root,root,-)
%attr(755,root,root) %{_bindir}/%{daemon_name}
%{_sbindir}/rc%{daemon_name}
%{_unitdir}/%{service_filename}
%dir %{_libexecdir}/%{name}
%{_libexecdir}/%{name}/*
%dir %attr(710,root,%{prog_group}) %{prog_confdir}
%config(noreplace) %attr(640,root,%{prog_group}) %{prog_conffile}
%dir %attr(700,%{prog_user},%{prog_group}) %{prog_logdir}
%config(noreplace) %{_sysconfdir}/logrotate.d/%{daemon_packname}
%dir %attr(710,%{prog_user},%{prog_group}) %{prog_statedir}
%ghost %{prog_rundir}
%if 0%{?suse_version} && ( 0%{?suse_version} <= 1310 || 0%{?suse_version} == 1320 || ( 0%{?is_opensuse} && 0%{?suse_version} == 1315 && 0%{?sle_version} && 0%{?sle_version} == 120100 ) )
%dir %{_tmpfilesdir}
%endif
%{pkg_rundirconffile}
%{_mandir}/man5/*.5%{?ext_man}
%{_mandir}/man7/%{daemon_name}-*.7%{?ext_man}
%{_mandir}/man7/%{progbase}-*.7%{?ext_man}
%{_mandir}/man8/%{daemon_name}.8%{?ext_man}
%files doc
%defattr(-,root,root,-)
%doc CHANGELOG.md SECURITY.md README.md
%license LICENSE
%changelog