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
openSUSE Build Service is sponsored by