openSUSE:构建系统配方

跳转到:导航搜索

所有关于打包的内容都应该放在这个分类下。

摘要

此页面提供了一种类似于备忘单,用于确定为了以标准化方式构建具有特定构建系统的常用软件包,需要在.spec文件中包含哪些代码。

在此上下文中,构建系统指的是创建 Makefile 和/或调用编译器的工具,而不是 Open Build Service 系统。

注意:这里还有一些背景关于 openSUSE 软件构建系统偏好的统计数据

automake

RPM 附带了许多便利宏。基本配方是

%build
%configure
%make_build
%install
%make_install

%configure宏将设置CFLAGS, CXXFLAGS, FFLAGS%optflags 如果它们之前没有被设置。要添加您自己的标志,请在一行上放在 %configure 之前

export CPPFLAGS="-Dpreprocessor_options -Ihere"
export CFLAGS="%optflags -fwhatever"
export CXXFLAGS="%optflags -fwhateverplusplus"

(通常没有必要切换到 `./configure`!)

%make_build是一个从 rpm-4.12 开始可用的宏。它等效于 `make %{?_smp_mflags}`.

%make_install是一个从 rpm-4.10 开始可用的宏。它等效于 `make install DESTDIR="%{?buildroot}"`.

避免使用%makeinstall(注意:没有下划线)。该宏会增加编写不佳的软件在安装时失败的机会。(有关详细信息,请参阅 [1]。)

您还可以使用单独的构建目录,以获得乐趣和收益(以及发现无法应对它的软件)[也 SLE11 上不可用]

%build
%define _configure ../configure
mkdir obj
pushd obj/
%configure
popd

%install
%make_install -C obj

autoconf

在上游软件中使用 autoconf 而不使用 automake 经常会带来许多意想不到的糟糕问题,当使用手工制作的 Makefile 时——最常见的错误是变量赋值不被尊重(例如,设置 CFLAGS 会破坏重要的标志,导致产品无法编译),以及无法将标志传递给命令(例如,调用 CC 命令时无法传递 CPPFLAGS)。

当 Makefile 由其他软件自动生成时(例如,`scons autotools`),这可能不适用,或者仅部分适用,或者根本不适用。无论如何,autoconf 而不使用 automake 很容易出现错误,因此没有单一的配方可以涵盖大量内容。如果 Makefile 的行为合理地类似于 automake,请参阅上面的 automake 部分。

cmake

从 openSUSE-13.1[2]开始,该发行版提供了一个 %cmake,该宏来自 /etc/rpm/macros.cmakeBuildRequires: cmake),应该为您的需求设置基本值。

基本部分如下所示

%build
%cmake \
        -DSOME_SPECIAL_VARIABLE="SOME_VALUE"
%cmake_build

%install
%cmake_install

%check
%ctest

您还可以覆盖一些变量以获得所需的 cmake 行为

%build
# build in <someotherfolder> rather than in build directory
%define __builddir <someotherfolder>
%cmake
...
# use ninja instead of make
%define __builder ninja
%cmake
...

不幸的是,CMakeLists.txt文件允许很多自由,以至于有些软件可能会忽略某些参数。如果发生这种情况,也许还需要指定以下额外标志

-DCMAKE_BUILD_WITH_INSTALL_RPATH(:BOOL)="yes|no"
-DCMAKE_BUILD_TYPE="Release|RelWithDebInfo"
-DCMAKE_CONF_PATH(:PATH)="%_sysconfdir"
-DCMAKE_C_FLAGS:STRING="%optflags"
-DCMAKE_C_FLAGS_RELEASE:STRING="%optflags"
-DCMAKE_CXX_FLAGS:STRING="%optflags"
-DCMAKE_CXX_FLAGS_RELEASE:STRING="%optflags"
-DCMAKE_DATA_PATH(:PATH)="%_datadir"
-DCMAKE_DOC_PATH(:PATH)="%_docdir"
-DCMAKE_FIND_ROOT_PATH="/%{?_sysroot}"
-DCMAKE_INSTALL_DO_STRIP=0
-DCMAKE_INSTALL_LIBDIR="%_lib"
-DCMAKE_INSTALL_LIBEXECDIR(:PATH)="%_prefix"
-DCMAKE_INSTALL_PREFIX(:PATH)="%_prefix"
-DCMAKE_LD_FLAGS(:STRING)="-Wl,-z -Wl,defs"
-DCMAKE_LOCALE_PATH(:PATH)="%_datadir/locale"
-DCMAKE_SKIP_RPATH(:BOOL)=YES
-DCMAKE_STRIP(:FILEPATH)="/bin/true"
-DCMAKE_VERBOSE_MAKEFILE(:BOOL)="true"
-DNO_STRIP=1

还有一个 cmake 错误:不指定 :TYPE 部分会导致等号后的部分有时被忽略。

python (setup.py)

另请参阅:openSUSE:Packaging Python

旧版 Setuptools 风格

BuildRequires: fdupes
BuildRequires: python-rpm-macros
BuildRequires: %{python_module setuptools}
%python_subpackages

%build
%python_build

%install
%python_install
%python_expand %fdupes %{buildroot}%{python_sitelib}
%check
%pyunittest -v

%files %python_files
%{python_sitelib}/name
%{python_sitelib}/name-%{version}*-info
/other/files/not/conflicting-for-all-supported-flavors-e.g.-distinguished-by-%{python_bin-suffix}

PEP517 风格

BuildRequires: fdupes
BuildRequires: python-rpm-macros
BuildRequires: %{python_module pip}
BuildRequires: %{python_module wheel}
%python_subpackages

%build
%pyproject_wheel

%install
%pyproject_install
%python_expand %fdupes %{buildroot}%{python_sitelib}
%check
%pyunittest -v

%files %python_files
%{python_sitelib}/name
%{python_sitelib}/name-%{version}*-info
/other/files/not/conflicting-for-all-supported-flavors-e.g.-distinguished-by-%{python_bin-suffix}

qmake

无花招的样板

%build
qmake-qt5 QMAKE_CFLAGS+="%optflags" QMAKE_CXXFLAGS+="%optflags" QMAKE_STRIP="/bin/true"
%make_build / make %{?_smp_mflags} as with automake (see above)

%install
make install INSTALL_ROOT="%buildroot"

qmake 可以在 libqt5-qtbase-devel 包中找到。

meson

另请参阅 打包 Meson 页面。

BuildRequires: meson

%build
%meson
%meson_build

%install
%meson_install

%check
%meson_test

对于其他所有情况

请参阅 Category:Packaging,了解何时有宏或其他专用说明(Perl、Python 等)