Blame SPECS/flexiblas.spec

55f4ca
%bcond_without system_lapack
55f4ca
%bcond_without atlas
55f4ca
%bcond_without blis
55f4ca
%bcond_without openblas
55f4ca
55f4ca
%if %{with openblas}
55f4ca
%global default_backend openblas-openmp
55f4ca
%else
55f4ca
%global default_backend netlib
55f4ca
%endif
55f4ca
%global default_backend64 %{default_backend}64
55f4ca
55f4ca
%global major_version 3
55f4ca
%global minor_version 0
55f4ca
%global patch_version 4
55f4ca
55f4ca
Name:           flexiblas
55f4ca
Version:        %{major_version}.%{minor_version}.%{patch_version}
55f4ca
Release:        5%{?dist}
55f4ca
Summary:        A BLAS/LAPACK wrapper library with runtime exchangeable backends
55f4ca
55f4ca
# GPLv3 with an exception for the BLAS/LAPACK interface
55f4ca
# https://www.gnu.org/licenses/gpl-faq.en.html#LinkingOverControlledInterface
55f4ca
# libcscutils/ is LGPLv2+
55f4ca
# contributed/ and test/ are BSD
55f4ca
License:        GPLv3 with exceptions and LGPLv2+ and BSD
55f4ca
URL:            https://www.mpi-magdeburg.mpg.de/projects/%{name}
55f4ca
Source0:        https://csc.mpi-magdeburg.mpg.de/mpcsc/software/%{name}/%{name}-%{version}.tar.xz
55f4ca
55f4ca
BuildRequires:  make, cmake, python
55f4ca
BuildRequires:  gcc-fortran, gcc-c++
55f4ca
%if %{with system_lapack}
55f4ca
BuildRequires:  blas-static, lapack-static
55f4ca
%endif
55f4ca
%if %{with atlas}
55f4ca
BuildRequires:  atlas-devel
55f4ca
%endif
55f4ca
%if %{with blis}
55f4ca
BuildRequires:  blis-devel
55f4ca
%endif
55f4ca
%if %{with openblas}
55f4ca
BuildRequires:  openblas-devel
55f4ca
%endif
55f4ca
55f4ca
%global _description %{expand:
55f4ca
FlexiBLAS is a wrapper library that enables the exchange of the BLAS and
55f4ca
LAPACK implementation used by a program without recompiling or relinking it.
55f4ca
}
55f4ca
55f4ca
%description %_description
55f4ca
55f4ca
%package        netlib
55f4ca
Summary:        FlexiBLAS wrapper library
55f4ca
Requires:       %{name}%{?_isa} = %{version}-%{release}
55f4ca
Requires:       %{name}-%{default_backend}%{?_isa} = %{version}-%{release}
55f4ca
55f4ca
%description    netlib %_description
55f4ca
This package contains the wrapper library with 32-bit integer support.
55f4ca
55f4ca
%package        hook-profile
55f4ca
Summary:        FlexiBLAS profile hook plugin
55f4ca
Requires:       %{name}%{?_isa} = %{version}-%{release}
55f4ca
Requires:       %{name}-netlib%{?_isa} = %{version}-%{release}
55f4ca
55f4ca
%description    hook-profile %_description
55f4ca
This package contains a plugin that enables profiling support.
55f4ca
55f4ca
%package        devel
55f4ca
Summary:        Development headers and libraries for FlexiBLAS
55f4ca
Requires:       %{name}%{?_isa} = %{version}-%{release}
55f4ca
55f4ca
%description    devel %_description
55f4ca
This package contains the development headers and libraries.
55f4ca
55f4ca
%if %{with atlas}
55f4ca
%package        atlas
55f4ca
Summary:        FlexiBLAS wrappers for ATLAS
55f4ca
Requires:       %{name}%{?_isa} = %{version}-%{release}
55f4ca
55f4ca
%description    atlas %_description
55f4ca
This package contains FlexiBLAS wrappers for the ATLAS project.
55f4ca
%endif
55f4ca
55f4ca
%if %{with blis}
55f4ca
%package        blis-serial
55f4ca
Summary:        FlexiBLAS wrappers for BLIS
55f4ca
Requires:       %{name}%{?_isa} = %{version}-%{release}
55f4ca
55f4ca
%description    blis-serial %_description
55f4ca
This package contains FlexiBLAS wrappers for the sequential library compiled
55f4ca
with a 32-integer interface.
55f4ca
55f4ca
%package        blis-openmp
55f4ca
Summary:        FlexiBLAS wrappers for BLIS
55f4ca
Requires:       %{name}%{?_isa} = %{version}-%{release}
55f4ca
55f4ca
%description    blis-openmp %_description
55f4ca
This package contains FlexiBLAS wrappers for the library compiled with
55f4ca
OpenMP support with a 32-integer interface.
55f4ca
55f4ca
%package        blis-threads
55f4ca
Summary:        FlexiBLAS wrappers for BLIS
55f4ca
Requires:       %{name}%{?_isa} = %{version}-%{release}
55f4ca
55f4ca
%description    blis-threads %_description
55f4ca
This package contains FlexiBLAS wrappers for the library compiled with
55f4ca
threading support with a 32-integer interface.
55f4ca
%endif
55f4ca
55f4ca
%if %{with openblas}
55f4ca
%package        openblas-serial
55f4ca
Summary:        FlexiBLAS wrappers for OpenBLAS
55f4ca
Requires:       %{name}%{?_isa} = %{version}-%{release}
55f4ca
55f4ca
%description    openblas-serial %_description
55f4ca
This package contains FlexiBLAS wrappers for the sequential library compiled
55f4ca
with a 32-integer interface.
55f4ca
55f4ca
%package        openblas-openmp
55f4ca
Summary:        FlexiBLAS wrappers for OpenBLAS
55f4ca
Requires:       %{name}%{?_isa} = %{version}-%{release}
55f4ca
55f4ca
%description    openblas-openmp %_description
55f4ca
This package contains FlexiBLAS wrappers for the library compiled with
55f4ca
OpenMP support with a 32-integer interface.
55f4ca
55f4ca
%package        openblas-threads
55f4ca
Summary:        FlexiBLAS wrappers for OpenBLAS
55f4ca
Requires:       %{name}%{?_isa} = %{version}-%{release}
55f4ca
55f4ca
%description    openblas-threads %_description
55f4ca
This package contains FlexiBLAS wrappers for the library compiled with
55f4ca
threading support with a 32-integer interface.
55f4ca
%endif
55f4ca
55f4ca
%if 0%{?__isa_bits} == 64
55f4ca
%package        netlib64
55f4ca
Summary:        FlexiBLAS wrapper library (64-bit)
55f4ca
Requires:       %{name}%{?_isa} = %{version}-%{release}
55f4ca
Requires:       %{name}-%{default_backend64}%{?_isa} = %{version}-%{release}
55f4ca
55f4ca
%description    netlib64 %_description
55f4ca
This package contains the wrapper library with 64-bit integer support.
55f4ca
55f4ca
%package        hook-profile64
55f4ca
Summary:        FlexiBLAS profile hook plugin (64-bit)
55f4ca
Requires:       %{name}%{?_isa} = %{version}-%{release}
55f4ca
Requires:       %{name}-netlib64%{?_isa} = %{version}-%{release}
55f4ca
55f4ca
%description    hook-profile64 %_description
55f4ca
This package contains a plugin that enables profiling support.
55f4ca
55f4ca
%if %{with blis}
55f4ca
%package        blis-serial64
55f4ca
Summary:        FlexiBLAS wrappers for BLIS (64-bit)
55f4ca
Requires:       %{name}%{?_isa} = %{version}-%{release}
55f4ca
55f4ca
%description    blis-serial64 %_description
55f4ca
This package contains FlexiBLAS wrappers for the sequential library compiled
55f4ca
with a 64-integer interface.
55f4ca
55f4ca
%package        blis-openmp64
55f4ca
Summary:        FlexiBLAS wrappers for BLIS (64-bit)
55f4ca
Requires:       %{name}%{?_isa} = %{version}-%{release}
55f4ca
55f4ca
%description    blis-openmp64 %_description
55f4ca
This package contains FlexiBLAS wrappers for the library compiled with
55f4ca
OpenMP support with a 64-integer interface.
55f4ca
55f4ca
%package        blis-threads64
55f4ca
Summary:        FlexiBLAS wrappers for BLIS (64-bit)
55f4ca
Requires:       %{name}%{?_isa} = %{version}-%{release}
55f4ca
55f4ca
%description    blis-threads64 %_description
55f4ca
This package contains FlexiBLAS wrappers for the library compiled with
55f4ca
threading support with a 64-integer interface.
55f4ca
%endif
55f4ca
55f4ca
%if %{with openblas}
55f4ca
%package        openblas-serial64
55f4ca
Summary:        FlexiBLAS wrappers for OpenBLAS (64-bit)
55f4ca
Requires:       %{name}%{?_isa} = %{version}-%{release}
55f4ca
55f4ca
%description    openblas-serial64 %_description
55f4ca
This package contains FlexiBLAS wrappers for the sequential library compiled
55f4ca
with a 64-integer interface.
55f4ca
55f4ca
%package        openblas-openmp64
55f4ca
Summary:        FlexiBLAS wrappers for OpenBLAS (64-bit)
55f4ca
Requires:       %{name}%{?_isa} = %{version}-%{release}
55f4ca
55f4ca
%description    openblas-openmp64 %_description
55f4ca
This package contains FlexiBLAS wrappers for the library compiled with
55f4ca
OpenMP support with a 64-integer interface.
55f4ca
55f4ca
%package        openblas-threads64
55f4ca
Summary:        FlexiBLAS wrappers for OpenBLAS (64-bit)
55f4ca
Requires:       %{name}%{?_isa} = %{version}-%{release}
55f4ca
55f4ca
%description    openblas-threads64 %_description
55f4ca
This package contains FlexiBLAS wrappers for the library compiled with
55f4ca
threading support with a 64-integer interface.
55f4ca
%endif
55f4ca
%endif
55f4ca
55f4ca
%prep
55f4ca
%autosetup -p1
55f4ca
55f4ca
%build
55f4ca
%if %{with system_lapack}
55f4ca
rm -rf contributed
55f4ca
%endif
55f4ca
%cmake -B build \
55f4ca
    -DCMAKE_INSTALL_PREFIX=%{_prefix} \
55f4ca
%if %{with system_lapack}
55f4ca
    -DSYS_BLAS_LIBRARY=$(pkg-config --variable=libdir blas)/libblas.a \
55f4ca
    -DSYS_LAPACK_LIBRARY=$(pkg-config --variable=libdir lapack)/liblapack_pic.a \
55f4ca
%endif
55f4ca
    -DINTEGER8=OFF \
55f4ca
    -DTESTS=ON
55f4ca
%make_build -C build
55f4ca
%if 0%{?__isa_bits} == 64
55f4ca
%cmake -B build64 \
55f4ca
    -DCMAKE_INSTALL_PREFIX=%{_prefix} \
55f4ca
%if %{with system_lapack}
55f4ca
    -DSYS_BLAS_LIBRARY=$(pkg-config --variable=libdir blas)/libblas64.a \
55f4ca
    -DSYS_LAPACK_LIBRARY=$(pkg-config --variable=libdir lapack)/liblapack_pic64.a \
55f4ca
%endif
55f4ca
    -DINTEGER8=ON \
55f4ca
    -DTESTS=ON
55f4ca
%make_build -C build64
55f4ca
%endif
55f4ca
55f4ca
%install
55f4ca
%make_install -C build
55f4ca
echo "default = %{default_backend}" > %{buildroot}%{_sysconfdir}/%{name}rc
55f4ca
%if 0%{?__isa_bits} == 64
55f4ca
%make_install -C build64
55f4ca
echo "default = %{default_backend64}" > %{buildroot}%{_sysconfdir}/%{name}64rc
55f4ca
%endif
55f4ca
55f4ca
# remove dummy hook
55f4ca
rm -f %{buildroot}%{_libdir}/%{name}*/lib%{name}_hook_dummy.so
55f4ca
55f4ca
# set Fedora-friendly names
55f4ca
rename -- serial -serial %{buildroot}%{_libdir}/%{name}*/* || true
55f4ca
rename -- openmp -openmp %{buildroot}%{_libdir}/%{name}*/* || true
55f4ca
rename -- pthread -threads %{buildroot}%{_libdir}/%{name}*/* || true
55f4ca
rename NETLIB netlib %{buildroot}%{_sysconfdir}/%{name}*.d/* || true
55f4ca
rename ATLAS atlas %{buildroot}%{_sysconfdir}/%{name}*.d/* || true
55f4ca
rename Blis blis %{buildroot}%{_sysconfdir}/%{name}*.d/* || true
55f4ca
rename OpenBLAS openblas %{buildroot}%{_sysconfdir}/%{name}*.d/* || true
55f4ca
rename -- Serial -serial %{buildroot}%{_sysconfdir}/%{name}*.d/* || true
55f4ca
rename -- OpenMP -openmp %{buildroot}%{_sysconfdir}/%{name}*.d/* || true
55f4ca
rename -- PThread -threads %{buildroot}%{_sysconfdir}/%{name}*.d/* || true
55f4ca
find %{buildroot}%{_sysconfdir}/%{name}*.d/* -type f \
55f4ca
    -exec sed -i 's NETLIB netlib gI' {} \;\
55f4ca
    -exec sed -i 's ATLAS atlas gI' {} \;\
55f4ca
    -exec sed -i 's Blis blis gI' {} \;\
55f4ca
    -exec sed -i 's OpenBLAS openblas gI' {} \;\
55f4ca
    -exec sed -i 's Serial -serial gI' {} \;\
55f4ca
    -exec sed -i 's OpenMP -openmp gI' {} \;\
55f4ca
    -exec sed -i 's PThread -threads gI' {} \;
55f4ca
55f4ca
%check
55f4ca
export FLEXIBLAS_TEST=%{buildroot}%{_libdir}/%{name}/lib%{name}_%{default_backend}.so
55f4ca
make -C build test
55f4ca
%if 0%{?__isa_bits} == 64
55f4ca
export FLEXIBLAS64_TEST=%{buildroot}%{_libdir}/%{name}64/lib%{name}_%{default_backend64}.so
55f4ca
make -C build64 test
55f4ca
%endif
55f4ca
55f4ca
%files
55f4ca
%license COPYING COPYING.NETLIB
55f4ca
%doc ISSUES.md README.md CHANGELOG
55f4ca
55f4ca
%files netlib
55f4ca
%config(noreplace) %{_sysconfdir}/%{name}rc
55f4ca
%dir %{_sysconfdir}/%{name}rc.d
55f4ca
%{_sysconfdir}/%{name}rc.d/netlib.conf
55f4ca
%{_bindir}/%{name}
55f4ca
%{_libdir}/lib%{name}.so.%{major_version}
55f4ca
%{_libdir}/lib%{name}.so.%{major_version}.%{minor_version}
55f4ca
%{_libdir}/lib%{name}_api.so.%{major_version}
55f4ca
%{_libdir}/lib%{name}_api.so.%{major_version}.%{minor_version}
55f4ca
%{_libdir}/lib%{name}_mgmt.so.%{major_version}
55f4ca
%{_libdir}/lib%{name}_mgmt.so.%{major_version}.%{minor_version}
55f4ca
%dir %{_libdir}/%{name}
55f4ca
%{_libdir}/%{name}/lib%{name}_fallback_lapack.so
55f4ca
%{_libdir}/%{name}/lib%{name}_netlib.so
55f4ca
%{_mandir}/man1/%{name}.1*
55f4ca
55f4ca
%files hook-profile
55f4ca
%{_libdir}/%{name}/lib%{name}_hook_profile.so
55f4ca
55f4ca
%files devel
55f4ca
%{_includedir}/%{name}
55f4ca
%{_libdir}/lib%{name}.so
55f4ca
%{_libdir}/lib%{name}_api.so
55f4ca
%{_libdir}/lib%{name}_mgmt.so
55f4ca
%{_libdir}/pkgconfig/%{name}.pc
55f4ca
%{_libdir}/pkgconfig/%{name}_api.pc
55f4ca
%if 0%{?__isa_bits} == 64
55f4ca
%{_includedir}/%{name}64
55f4ca
%{_libdir}/lib%{name}64.so
55f4ca
%{_libdir}/lib%{name}64_api.so
55f4ca
%{_libdir}/lib%{name}64_mgmt.so
55f4ca
%{_libdir}/pkgconfig/%{name}64.pc
55f4ca
%{_libdir}/pkgconfig/%{name}64_api.pc
55f4ca
%endif
55f4ca
%{_mandir}/man3/%{name}_*
55f4ca
%{_mandir}/man7/%{name}-api.7*
55f4ca
55f4ca
%if %{with atlas}
55f4ca
%files atlas
55f4ca
%{_sysconfdir}/%{name}rc.d/atlas.conf
55f4ca
%{_libdir}/%{name}/lib%{name}_atlas.so
55f4ca
%endif
55f4ca
55f4ca
%if %{with blis}
55f4ca
%files blis-serial
55f4ca
%{_sysconfdir}/%{name}rc.d/blis-serial.conf
55f4ca
%{_libdir}/%{name}/lib%{name}_blis-serial.so
55f4ca
55f4ca
%files blis-openmp
55f4ca
%{_sysconfdir}/%{name}rc.d/blis-openmp.conf
55f4ca
%{_libdir}/%{name}/lib%{name}_blis-openmp.so
55f4ca
55f4ca
%files blis-threads
55f4ca
%{_sysconfdir}/%{name}rc.d/blis-threads.conf
55f4ca
%{_libdir}/%{name}/lib%{name}_blis-threads.so
55f4ca
%endif
55f4ca
55f4ca
%if %{with openblas}
55f4ca
%files openblas-serial
55f4ca
%{_sysconfdir}/%{name}rc.d/openblas-serial.conf
55f4ca
%{_libdir}/%{name}/lib%{name}_openblas-serial.so
55f4ca
55f4ca
%files openblas-openmp
55f4ca
%{_sysconfdir}/%{name}rc.d/openblas-openmp.conf
55f4ca
%{_libdir}/%{name}/lib%{name}_openblas-openmp.so
55f4ca
55f4ca
%files openblas-threads
55f4ca
%{_sysconfdir}/%{name}rc.d/openblas-threads.conf
55f4ca
%{_libdir}/%{name}/lib%{name}_openblas-threads.so
55f4ca
%endif
55f4ca
55f4ca
%if 0%{?__isa_bits} == 64
55f4ca
%files netlib64
55f4ca
%config(noreplace) %{_sysconfdir}/%{name}64rc
55f4ca
%dir %{_sysconfdir}/%{name}64rc.d
55f4ca
%{_sysconfdir}/%{name}64rc.d/netlib.conf
55f4ca
%{_bindir}/%{name}64
55f4ca
%{_libdir}/lib%{name}64.so.%{major_version}
55f4ca
%{_libdir}/lib%{name}64.so.%{major_version}.%{minor_version}
55f4ca
%{_libdir}/lib%{name}64_api.so.%{major_version}
55f4ca
%{_libdir}/lib%{name}64_api.so.%{major_version}.%{minor_version}
55f4ca
%{_libdir}/lib%{name}64_mgmt.so.%{major_version}
55f4ca
%{_libdir}/lib%{name}64_mgmt.so.%{major_version}.%{minor_version}
55f4ca
%dir %{_libdir}/%{name}64
55f4ca
%{_libdir}/%{name}64/lib%{name}_fallback_lapack.so
55f4ca
%{_libdir}/%{name}64/lib%{name}_netlib.so
55f4ca
%{_mandir}/man1/%{name}64.1*
55f4ca
55f4ca
%files hook-profile64
55f4ca
%{_libdir}/%{name}64/lib%{name}_hook_profile.so
55f4ca
55f4ca
%if %{with blis}
55f4ca
%files blis-serial64
55f4ca
%{_sysconfdir}/%{name}64rc.d/blis-serial64.conf
55f4ca
%{_libdir}/%{name}64/lib%{name}_blis-serial64.so
55f4ca
55f4ca
%files blis-openmp64
55f4ca
%{_sysconfdir}/%{name}64rc.d/blis-openmp64.conf
55f4ca
%{_libdir}/%{name}64/lib%{name}_blis-openmp64.so
55f4ca
55f4ca
%files blis-threads64
55f4ca
%{_sysconfdir}/%{name}64rc.d/blis-threads64.conf
55f4ca
%{_libdir}/%{name}64/lib%{name}_blis-threads64.so
55f4ca
%endif
55f4ca
55f4ca
%if %{with openblas}
55f4ca
%files openblas-serial64
55f4ca
%{_sysconfdir}/%{name}64rc.d/openblas-serial64.conf
55f4ca
%{_libdir}/%{name}64/lib%{name}_openblas-serial64.so
55f4ca
55f4ca
%files openblas-openmp64
55f4ca
%{_sysconfdir}/%{name}64rc.d/openblas-openmp64.conf
55f4ca
%{_libdir}/%{name}64/lib%{name}_openblas-openmp64.so
55f4ca
55f4ca
%files openblas-threads64
55f4ca
%{_sysconfdir}/%{name}64rc.d/openblas-threads64.conf
55f4ca
%{_libdir}/%{name}64/lib%{name}_openblas-threads64.so
55f4ca
%endif
55f4ca
%endif
55f4ca
55f4ca
%changelog
55f4ca
* Mon Aug 09 2021 Mohan Boddu <mboddu@redhat.com> - 3.0.4-5
55f4ca
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
55f4ca
  Related: rhbz#1991688
55f4ca
55f4ca
* Thu Apr 15 2021 Mohan Boddu <mboddu@redhat.com> - 3.0.4-4
55f4ca
- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
55f4ca
55f4ca
* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 3.0.4-3
55f4ca
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
55f4ca
55f4ca
* Mon Nov 30 2020 Iñaki Úcar <iucar@fedoraproject.org> 3.0.4-2
55f4ca
- https://fedoraproject.org/wiki/Changes/Remove_make_from_BuildRoot
55f4ca
55f4ca
* Thu Oct 22 2020 Iñaki Úcar <iucar@fedoraproject.org> - 3.0.4-1
55f4ca
- Update to 3.0.4, fixes #1889069
55f4ca
55f4ca
* Wed Oct 21 2020 Kalev Lember <klember@redhat.com> - 3.0.3-2
55f4ca
- Use pkg-config for getting blas and lapack directories
55f4ca
55f4ca
* Fri Aug 28 2020 Iñaki Úcar <iucar@fedoraproject.org> - 3.0.3-1
55f4ca
- Update to 3.0.3, fixes ScaLAPACK issues
55f4ca
55f4ca
* Mon Jul 27 2020 Fedora Release Engineering <releng@fedoraproject.org> - 3.0.2-2
55f4ca
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
55f4ca
55f4ca
* Thu Jul 23 2020 Iñaki Úcar <iucar@fedoraproject.org> - 3.0.2-1
55f4ca
- Update to 3.0.2
55f4ca
55f4ca
* Tue Jul 21 2020 Iñaki Úcar <iucar@fedoraproject.org> - 3.0.1-1
55f4ca
- Update to 3.0.1, license updated
55f4ca
55f4ca
* Fri Jul 03 2020 Iñaki Úcar <iucar@fedoraproject.org> - 3.0.0-5
55f4ca
- Change default backend to openblas-openmp
55f4ca
55f4ca
* Wed Jul 01 2020 Iñaki Úcar <iucar@fedoraproject.org> - 3.0.0-4
55f4ca
- Fix a bug setting the default backend
55f4ca
55f4ca
* Wed Jul 01 2020 Iñaki Úcar <iucar@fedoraproject.org> - 3.0.0-3
55f4ca
- Move man3 pages to devel subpackage
55f4ca
- Remove dummy hook (only useful for FlexiBLAS development)
55f4ca
- Move profile hook to a separate package (not needed for standard usage)
55f4ca
- Enable Blis64 on s390x again, #1852549 fixed in rawhide
55f4ca
55f4ca
* Tue Jun 30 2020 Iñaki Úcar <iucar@fedoraproject.org> - 3.0.0-2
55f4ca
- Own provided directories
55f4ca
- More robust file renaming
55f4ca
- Rename wrapper(64) subpackages to netlib(64)
55f4ca
- Conditionalize all external libraries, as well as the default
55f4ca
- Disable Blis64 on s390x, which is currently unavailable
55f4ca
55f4ca
* Mon Jun 29 2020 Iñaki Úcar <iucar@fedoraproject.org> - 3.0.0-1
55f4ca
- Initial packaging for Fedora