File racket.spec of Package racket

#
# spec file for package racket
#
# Copyright (c) 2025 SUSE LLC
# Copyright (c) 2012, 2013 Togan Muftuoglu toganm@opensuse.org
#
# 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/
#


%global         _configure ../configure
Name:           racket
Version:        8.16
Release:        0
Summary:        Scheme implementation with teaching tools
License:        Apache-2.0 OR MIT
Group:          Development/Languages/Scheme
URL:            http://racket-lang.org
Source0:        http://download.racket-lang.org/installers/%{version}/%{name}-%{version}-src.tgz
Source2:        racket-completion.bash
Source3:        racket-rpmlintrc
Patch0:         racket-doc.patch
Patch1:         racket-fortify.patch
BuildRequires:  ImageMagick
BuildRequires:  ca-certificates
BuildRequires:  chrpath
BuildRequires:  fdupes
BuildRequires:  gcc-c++
BuildRequires:  ghostscript-fonts-std
BuildRequires:  google-roboto-fonts
BuildRequires:  libexpat1
BuildRequires:  libjpeg-devel
BuildRequires:  librsvg-devel
BuildRequires:  libtool
BuildRequires:  update-desktop-files
BuildRequires:  pkgconfig(cairo)
BuildRequires:  pkgconfig(fontconfig)
BuildRequires:  pkgconfig(freetype2)
BuildRequires:  pkgconfig(glib-2.0)
BuildRequires:  pkgconfig(gtk+-3.0)
BuildRequires:  pkgconfig(ice)
BuildRequires:  pkgconfig(libedit)
BuildRequires:  pkgconfig(libffi)
BuildRequires:  pkgconfig(liblz4)
BuildRequires:  pkgconfig(libpng)
BuildRequires:  pkgconfig(ncurses)
BuildRequires:  pkgconfig(openssl)
BuildRequires:  pkgconfig(pango)
BuildRequires:  pkgconfig(pixman-1) >= 0.22.0
BuildRequires:  pkgconfig(sm)
BuildRequires:  pkgconfig(sqlite3)
BuildRequires:  pkgconfig(x11)
BuildRequires:  pkgconfig(xaw7)
BuildRequires:  pkgconfig(xext)
BuildRequires:  pkgconfig(xft)
BuildRequires:  pkgconfig(xmu)
BuildRequires:  pkgconfig(xrender)
BuildRequires:  pkgconfig(xt)
BuildRequires:  pkgconfig(zlib)
# The rpmbuild does not detect those!
Requires:       libcairo2
Requires:       libedit0
Requires:       libglib-2_0-0
Requires:       libgtk-3-0
Requires:       libpango-1_0-0
Requires:       libsqlite3-0
Provides:       %{name}-drracket = %{version}-%{release}
Provides:       %{name}-games = %{version}-%{release}
Provides:       %{name}-webserver = %{version}-%{release}
Recommends:     racket-doc = %{version}-%{release}

%define add_optflags(a:f:t:p:w:W:d:g:O:A:C:D:E:H:i:M:n:P:U:u:l:s:X:B:I:L:b:V:m:x:c:S:E:o:v:) \
%global optflags %{optflags} %{**}

# maggia has this
# Disable the debug package since otherwise a build would create the following
# error message:
#  *** ERROR: same build ID in nonidentical files!
#          /usr/bin/mzscheme
#     and  /usr/bin/mred
# this should be set from the obs
#%%define debug_package %%nil

%description
Racket (formerly called PLT Scheme) is a multi-paradigm programming language
in the Lisp/Scheme family, that also serves as a platform for language
creation, design, and implementation.

The programming language is known for its powerful macro system which enables
the creation of embedded and domain-specific languages, language constructs
such as classes or modules, and separate dialects of Racket enable different
semantics.

%package        doc
Summary:        Documentation HTML files for Racket
Group:          Development/Languages/Scheme
Provides:       %{name}:%{_docdir}/%{name}/docindex.sqlite
BuildArch:      noarch

%description    doc
A local installation of the Racket documentation system.

%package devel
Summary:        Development header files for Racket
Group:          Development/Languages/Scheme
Requires:       %{name} = %{version}-%{release}
Requires:       glibc-devel
Requires:       libffi-devel
Recommends:     %{name}-doc = %{version}-%{release}

%description devel
This package contains the symlinks, headers and object files needed to
compile and link programs which use Racket.

%prep
%autosetup -p0

cp -p %{SOURCE2} src/

%build
cd src/
mkdir build
pushd build
%add_optflags -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=500 -fno-gcse -Wno-stringop-overread
#
# Overwrite stack size limit (hopefully a soft limit only)
#
for flag in s l m
do
    ulimit -H$flag unlimited || true
    ulimit -S$flag unlimited || true
done
echo "int main () { return !(sizeof(void*) >= 8); }" | gcc -x c -o test64 -
echo "int main () { return !(((union {unsigned int x; unsigned char c; }){1}).c); }" | gcc -x c -o testendianess -
./test64 && wide=64 || wide=32
./testendianess && endianess=l || endianess=b
rm -f test64 testendianess
mach=tpb${wide}${endianess}
unset wide endianess
%configure \
    --prefix="%{_prefix}" \
    --exec-prefix="%{_prefix}" \
    --libdir=%{_libdir} \
    --docdir="%{_defaultdocdir}/%{name}" \
    --enable-shared \
%ifarch ppc64le s390x
    --enable-pb --enable-mach=$mach \
%endif
    --disable-static \
    --disable-strip \
    --enable-places \
    --enable-lt="%{_bindir}/libtool" \
    --enable-libz \
    --enable-liblz4 \
    --enable-pthread
%make_build
popd

%install
topdir=$(pwd)
cd src/
pushd build

# use the following if setting extra plt_setup options
# export LD_LIBRARY_PATH=%%{buildroot}%%{_libdir}
# export PLT_SETUP_OPTIONS="-j 1 "

install -d %{buildroot}/%{_datadir}/doc/%{name}/

%make_install

popd

# we do not need *.la and *.a files
find %{buildroot}%{_libdir} -name "*.la" -delete
find %{buildroot}%{_libdir} -name "*.a" -delete

# make system clear
for bin in mred mzscheme racket
do
    test -e $bin || continue
    chrpath --delete %{buildroot}%{_bindir}/$bin || :
done
for bin in gracket starter
do
    test -e $bin || continue
    chrpath --delete %{buildroot}%{_libdir}/$bin || :
done
for bin in c-printf crypt esd magick sndfile tcl xmmsctrl xosd
do
    bin=%{buildroot}%{_datadir}/%{name}/pkgs/racket-doc/ffi/examples/use-${bin}.rkt
    test -e $bin || continue
    sed -ri '1s@(/usr/bin/)env +@\1@p' $bin
    chmod 755 $bin
done

files_to_filter="
syntax/module-helpers
rackunit/api
reference/collects
guide/exns
math/array_broadcasting
math/array_construct
math/array_convert
math/array_fold
math/array_indexing
math/array_nonstrict
math/array_pointwise
math/array_quick
math/array_sequences
math/array_slicing
math/array_strict
math/array_transform
math/array_types
math/matrix_construction
math/matrix_intro
math/matrix_poly
math/stats
ts-reference/Typed_Classes
"
for html in $files_to_filter
do
    html=%{buildroot}%{_docdir}/%{name}/${html}.html
    test -e $html || continue
    sed -ri 's@%{buildroot}@@g' $html
done

# Bash completion
install -Dm 644 %{SOURCE2} %{buildroot}%{_datadir}/bash_completion/completions/%{name}
install -Dm 644 %{_builddir}/%{name}-%{version}/share/pkgs/drracket/drracket/drracket.png %{buildroot}%{_datadir}/pixmaps/drracket.png

# rewrite path in .desktop files
%suse_update_desktop_file -c drracket "DrRacket" "DrRacket is an interactive, integrated, graphical programming environment for the Racket programming languages" "%{_bindir}/drracket" "drracket" Development IDE
%suse_update_desktop_file -c slideshow "Slideshow" "Slideshow is a Racket-based tool for writing slide presentations as programs" "%{_bindir}/slideshow" "drracket" Development Documentation

# Due package split we do this explicit to support older rpm version as well
install -m 0644 ../README %{buildroot}%{_docdir}/%{name}/README

%fdupes %{buildroot}%{_prefix}

#
# Dynamically determine which files gets installed
# bc, cs, and pb builds
#
pushd %{buildroot}%{_libdir}
    find \( -name '*.boot' -o -name '*.so*' -o -name '*.lo' -o -name '*.o' -o -name bootinfo \) -printf '%{_libdir}/%%P\n' > ${topdir}/file.list
popd

%post
/sbin/ldconfig
%desktop_database_post

%postun
/sbin/ldconfig
%desktop_database_postun

%files -f file.list
%doc %dir %{_docdir}/%{name}
%doc %{_docdir}/%{name}/README
%{_bindir}/drracket
%{_bindir}/gracket
%{_bindir}/gracket-text
%{_bindir}/mred
%{_bindir}/mred-text
%{_bindir}/mzc
%{_bindir}/mzpp
%{_bindir}/mzscheme
%{_bindir}/mztext
%{_bindir}/pdf-slatex
%{_bindir}/plt-games
%{_bindir}/plt-help
%{_bindir}/plt-r5rs
%{_bindir}/plt-r6rs
%{_bindir}/plt-web-server
%{_bindir}/racket
%{_bindir}/raco
%{_bindir}/scribble
%{_bindir}/setup-plt
%{_bindir}/slatex
%{_bindir}/slideshow
%{_bindir}/swindle
%{_libdir}/%{name}/starter
%{_libdir}/%{name}/gracket
%{_libdir}/%{name}/starter-sh
%verify(not md5 size mtime) %{_libdir}/%{name}/*.rktd
%dir %{_libdir}/%{name}/compiled/
%{_libdir}/%{name}/compiled/*
%{_mandir}/man1/mz*
%{_mandir}/man1/racket*
%{_mandir}/man1/raco*
%{_mandir}/man1/setup-plt*
%{_mandir}/man1/drracket*
%{_mandir}/man1/gracket*
%{_mandir}/man1/mred*
%{_mandir}/man1/plt-help*
%dir %{_libdir}/%{name}
%dir %{_datadir}/%{name}
%dir %{_datadir}/bash_completion
%dir %{_datadir}/bash_completion/completions
%{_datadir}/bash_completion/completions/%{name}
%{_datadir}/applications/drracket.desktop
%{_datadir}/applications/slideshow.desktop
%{_datadir}/pixmaps/drracket.png
%exclude %dir %{_datadir}/%{name}/pkgs/mzscheme-lib/mzscheme/examples/
%exclude %{_datadir}/%{name}/pkgs/mzscheme-lib/mzscheme/examples/*.c*
%verify(not md5 size mtime) %{_datadir}/%{name}/*.rktd
%verify(not md5 size mtime) %{_datadir}/%{name}/pkgs/*.rktd
%{_datadir}/%{name}/*
%dir %{_sysconfdir}/%{name}
%config %{_sysconfdir}/%{name}/config.rktd

%files doc
%doc %{_docdir}/%{name}/*
%exclude %{_docdir}/%{name}/README

%files devel
%{_includedir}/%{name}/*
%dir %{_includedir}/%{name}
%dir %{_datadir}/%{name}/pkgs/mzscheme-lib/mzscheme/examples/
%{_datadir}/%{name}/pkgs/mzscheme-lib/mzscheme/examples/*.c*

%changelog
openSUSE Build Service is sponsored by