+#
+# Conditional build:
+%bcond_without ocaml_opt # native optimized binaries (bytecode is always built)
+
+# not yet available on x32 (ocaml 4.02.1), update when upstream will support it
+%ifnarch %{ix86} %{x8664} %{arm} aarch64 ppc sparc sparcv9
+%undefine with_ocaml_opt
+%endif
+
+Summary: ppxlib - meta-programming for OCaml
+Summary(pl.UTF-8): ppxlib - metaprogramowanie dla OCamla
+Name: ocaml-ppxlib
+Version: 0.23.0
+Release: 1
+License: MIT
+Group: Libraries
+#Source0Download: https://github.com/ocaml-ppx/ppxlib/releases
+Source0: https://github.com/ocaml-ppx/ppxlib/releases/download/%{version}/ppxlib-%{version}.tbz
+# Source0-md5: a318ed83e270780fd48eef1167d48c38
+Patch0: %{name}-stdlib-shims.patch
+URL: https://github.com/ocaml-ppx/ppxlib
+BuildRequires: ocaml >= 1:4.04.1
+BuildRequires: ocaml < 1:4.13
+BuildRequires: ocaml-dune >= 2.7
+BuildRequires: ocaml-findlib
+BuildRequires: ocaml-ocaml-compiler-libs-devel >= 0.11.0
+BuildRequires: ocaml-ppx_derivers-devel >= 1.0
+BuildRequires: ocaml-sexplib0-devel >= 0.12
+%requires_eq ocaml-runtime
+BuildRoot: %{tmpdir}/%{name}-%{version}-root-%(id -u -n)
+
+%define debug_package %{nil}
+
+%description
+Ppxlib is the standard library for ppx rewriters and other programs
+that manipulate the in-memory representation of OCaml programs, a.k.a
+the "Parsetree".
+
+This package contains files needed to run bytecode executables using
+ppxlib library.
+
+%description -l pl.UTF-8
+Ppxlib to standardowa biblioteka do funkcji przepisujących ppx i
+innych programów modyfikujących reprezentację w pamięci programów
+ocamlowych, tzw. "parsetree" (drzewo analizy).
+
+Pakiet ten zawiera binaria potrzebne do uruchamiania programów
+używających biblioteki ppxlib.
+
+%package devel
+Summary: ppxlib - meta-programming for OCaml - development part
+Summary(pl.UTF-8): ppxlib - metaprogramowanie dla OCamla - cześć programistyczna
+Group: Development/Libraries
+Requires: %{name} = %{version}-%{release}
+%requires_eq ocaml
+
+%description devel
+This package contains files needed to develop OCaml programs using
+ppxlib library.
+
+%description devel -l pl.UTF-8
+Pakiet ten zawiera pliki niezbędne do tworzenia programów w OCamlu
+używających biblioteki ppxlib.
+
+%prep
+%setup -q -n ppxlib-%{version}
+%patch0 -p1
+
+%build
+dune build --verbose
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+dune install --destdir=$RPM_BUILD_ROOT
+
+install -d $RPM_BUILD_ROOT%{_examplesdir}/%{name}-%{version}
+cp -pr examples/* $RPM_BUILD_ROOT%{_examplesdir}/%{name}-%{version}
+
+# sources
+%{__rm} $RPM_BUILD_ROOT%{_libdir}/ocaml/ppxlib/*.ml
+%{__rm} $RPM_BUILD_ROOT%{_libdir}/ocaml/ppxlib/*/*.ml
+# packaged as %doc
+%{__rm} -r $RPM_BUILD_ROOT%{_prefix}/doc/ppxlib
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(644,root,root,755)
+%doc CHANGES.md HISTORY.md LICENSE.md README.md
+%dir %{_libdir}/ocaml/ppxlib
+%{_libdir}/ocaml/ppxlib/META
+%{_libdir}/ocaml/ppxlib/*.cma
+%dir %{_libdir}/ocaml/ppxlib/ast
+%{_libdir}/ocaml/ppxlib/ast/*.cma
+%dir %{_libdir}/ocaml/ppxlib/astlib
+%{_libdir}/ocaml/ppxlib/astlib/*.cma
+%dir %{_libdir}/ocaml/ppxlib/metaquot
+%{_libdir}/ocaml/ppxlib/metaquot/*.cma
+%attr(755,root,root) %{_libdir}/ocaml/ppxlib/metaquot/ppx.exe
+%dir %{_libdir}/ocaml/ppxlib/metaquot_lifters
+%{_libdir}/ocaml/ppxlib/metaquot_lifters/*.cma
+%dir %{_libdir}/ocaml/ppxlib/print_diff
+%{_libdir}/ocaml/ppxlib/print_diff/*.cma
+%dir %{_libdir}/ocaml/ppxlib/runner
+%{_libdir}/ocaml/ppxlib/runner/*.cma
+%dir %{_libdir}/ocaml/ppxlib/runner_as_ppx
+%{_libdir}/ocaml/ppxlib/runner_as_ppx/*.cma
+%dir %{_libdir}/ocaml/ppxlib/stdppx
+%{_libdir}/ocaml/ppxlib/stdppx/*.cma
+%dir %{_libdir}/ocaml/ppxlib/traverse
+%{_libdir}/ocaml/ppxlib/traverse/*.cma
+%dir %{_libdir}/ocaml/ppxlib/traverse_builtins
+%{_libdir}/ocaml/ppxlib/traverse_builtins/*.cma
+%if %{with ocaml_opt}
+%attr(755,root,root) %{_libdir}/ocaml/ppxlib/*.cmxs
+%attr(755,root,root) %{_libdir}/ocaml/ppxlib/ast/*.cmxs
+%attr(755,root,root) %{_libdir}/ocaml/ppxlib/astlib/*.cmxs
+%attr(755,root,root) %{_libdir}/ocaml/ppxlib/metaquot/*.cmxs
+%attr(755,root,root) %{_libdir}/ocaml/ppxlib/metaquot_lifters/*.cmxs
+%attr(755,root,root) %{_libdir}/ocaml/ppxlib/print_diff/*.cmxs
+%attr(755,root,root) %{_libdir}/ocaml/ppxlib/runner/*.cmxs
+%attr(755,root,root) %{_libdir}/ocaml/ppxlib/runner_as_ppx/*.cmxs
+%attr(755,root,root) %{_libdir}/ocaml/ppxlib/stdppx/*.cmxs
+%attr(755,root,root) %{_libdir}/ocaml/ppxlib/traverse/*.cmxs
+%attr(755,root,root) %{_libdir}/ocaml/ppxlib/traverse_builtins/*.cmxs
+%endif
+
+%files devel
+%defattr(644,root,root,755)
+%{_libdir}/ocaml/ppxlib/*.cmi
+%{_libdir}/ocaml/ppxlib/*.cmt
+%{_libdir}/ocaml/ppxlib/*.cmti
+%{_libdir}/ocaml/ppxlib/*.mli
+%{_libdir}/ocaml/ppxlib/ast/*.cmi
+%{_libdir}/ocaml/ppxlib/ast/*.cmt
+%{_libdir}/ocaml/ppxlib/ast/*.cmti
+%{_libdir}/ocaml/ppxlib/ast/*.mli
+%{_libdir}/ocaml/ppxlib/astlib/*.cmi
+%{_libdir}/ocaml/ppxlib/astlib/*.cmt
+%{_libdir}/ocaml/ppxlib/astlib/*.cmti
+%{_libdir}/ocaml/ppxlib/astlib/*.mli
+%{_libdir}/ocaml/ppxlib/metaquot/*.cmi
+%{_libdir}/ocaml/ppxlib/metaquot/*.cmt
+%{_libdir}/ocaml/ppxlib/metaquot_lifters/*.cmi
+%{_libdir}/ocaml/ppxlib/metaquot_lifters/*.cmt
+%{_libdir}/ocaml/ppxlib/print_diff/*.cmi
+%{_libdir}/ocaml/ppxlib/print_diff/*.cmt
+%{_libdir}/ocaml/ppxlib/print_diff/*.cmti
+%{_libdir}/ocaml/ppxlib/print_diff/*.mli
+%{_libdir}/ocaml/ppxlib/runner/*.cmi
+%{_libdir}/ocaml/ppxlib/runner/*.cmt
+%{_libdir}/ocaml/ppxlib/runner_as_ppx/*.cmi
+%{_libdir}/ocaml/ppxlib/runner_as_ppx/*.cmt
+%{_libdir}/ocaml/ppxlib/stdppx/*.cmi
+%{_libdir}/ocaml/ppxlib/stdppx/*.cmt
+%{_libdir}/ocaml/ppxlib/traverse/*.cmi
+%{_libdir}/ocaml/ppxlib/traverse/*.cmt
+%{_libdir}/ocaml/ppxlib/traverse_builtins/*.cmi
+%{_libdir}/ocaml/ppxlib/traverse_builtins/*.cmt
+%if %{with ocaml_opt}
+%{_libdir}/ocaml/ppxlib/*.a
+%{_libdir}/ocaml/ppxlib/*.cmx
+%{_libdir}/ocaml/ppxlib/*.cmxa
+%{_libdir}/ocaml/ppxlib/ast/*.a
+%{_libdir}/ocaml/ppxlib/ast/*.cmx
+%{_libdir}/ocaml/ppxlib/ast/*.cmxa
+%{_libdir}/ocaml/ppxlib/astlib/*.a
+%{_libdir}/ocaml/ppxlib/astlib/*.cmx
+%{_libdir}/ocaml/ppxlib/astlib/*.cmxa
+%{_libdir}/ocaml/ppxlib/metaquot/*.a
+%{_libdir}/ocaml/ppxlib/metaquot/*.cmx
+%{_libdir}/ocaml/ppxlib/metaquot/*.cmxa
+%{_libdir}/ocaml/ppxlib/metaquot_lifters/*.a
+%{_libdir}/ocaml/ppxlib/metaquot_lifters/*.cmx
+%{_libdir}/ocaml/ppxlib/metaquot_lifters/*.cmxa
+%{_libdir}/ocaml/ppxlib/print_diff/*.a
+%{_libdir}/ocaml/ppxlib/print_diff/*.cmx
+%{_libdir}/ocaml/ppxlib/print_diff/*.cmxa
+%{_libdir}/ocaml/ppxlib/runner/*.a
+%{_libdir}/ocaml/ppxlib/runner/*.cmx
+%{_libdir}/ocaml/ppxlib/runner/*.cmxa
+%{_libdir}/ocaml/ppxlib/runner_as_ppx/*.a
+%{_libdir}/ocaml/ppxlib/runner_as_ppx/*.cmx
+%{_libdir}/ocaml/ppxlib/runner_as_ppx/*.cmxa
+%{_libdir}/ocaml/ppxlib/stdppx/*.a
+%{_libdir}/ocaml/ppxlib/stdppx/*.cmx
+%{_libdir}/ocaml/ppxlib/stdppx/*.cmxa
+%{_libdir}/ocaml/ppxlib/traverse/*.a
+%{_libdir}/ocaml/ppxlib/traverse/*.cmx
+%{_libdir}/ocaml/ppxlib/traverse/*.cmxa
+%{_libdir}/ocaml/ppxlib/traverse_builtins/*.a
+%{_libdir}/ocaml/ppxlib/traverse_builtins/*.cmx
+%{_libdir}/ocaml/ppxlib/traverse_builtins/*.cmxa
+%endif
+%{_libdir}/ocaml/ppxlib/dune-package
+%{_libdir}/ocaml/ppxlib/opam
+%{_examplesdir}/%{name}-%{version}