openeuler不识别cmake_build

在openeuler系统打包rpm时遇到src.rpm内%cmake_build宏不被支持的问题,由于默认cmake版本为3.22。解决方法是修改/usr/lib/rpm/macros.d/macros.cmake文件,以适应更高版本的cmake编译。

背景

在openeuler上面打包rpm的时候,有的src.rpm内部调用了%cmake_build的宏变量,openeuler的默认cmake3.22版本不支持,可以通过修改宏变量来实现可用

修改

修改文件路径为: /usr/lib/rpm/macros.d/macros.cmake

[root@openeuler ~]# cat /usr/lib/rpm/macros.d/macros.cmake
#
# Macros for cmake
#
%_cmake_lib_suffix64 -DLIB_SUFFIX=64
%_cmake_skip_rpath -DCMAKE_SKIP_RPATH:BOOL=ON
%_cmake_version 3.22.0
%__cmake /usr/bin/cmake
%__ctest /usr/bin/ctest
%__cmake_builddir %{!?__cmake_in_source_build:%{_vpath_builddir}}%{?__cmake_in_source_build:.}


# - Set default compile flags
# - CMAKE_*_FLAGS_RELEASE are added *after* the *FLAGS environment variables
# and default to -O3 -DNDEBUG.  Strip the -O3 so we can override with *FLAGS
# - Turn on verbose makefiles so we can see and verify compile flags
# - Set default install prefixes and library install directories
# - Turn on shared libraries by default
%cmake \
  CFLAGS="${CFLAGS:-%optflags}" ; export CFLAGS ; \
  CXXFLAGS="${CXXFLAGS:-%optflags}" ; export CXXFLAGS ; \
  FFLAGS="${FFLAGS:-%optflags%{?_fmoddir: -I%_fmoddir}}" ; export FFLAGS ; \
  FCFLAGS="${FCFLAGS:-%optflags%{?_fmoddir: -I%_fmoddir}}" ; export FCFLAGS ; \
  %{?__global_ldflags:LDFLAGS="${LDFLAGS:-%__global_ldflags}" ; export LDFLAGS ;} \
  %__cmake \\\
        %{!?__cmake_in_source_build:-S "%{_vpath_srcdir}"} \\\
        %{!?__cmake_in_source_build:-B "%{__cmake_builddir}"} \\\
        -DCMAKE_C_FLAGS_RELEASE:STRING="-DNDEBUG" \\\
        -DCMAKE_CXX_FLAGS_RELEASE:STRING="-DNDEBUG" \\\
        -DCMAKE_Fortran_FLAGS_RELEASE:STRING="-DNDEBUG" \\\
        -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \\\
        -DCMAKE_INSTALL_PREFIX:PATH=%{_prefix} \\\
        -DINCLUDE_INSTALL_DIR:PATH=%{_includedir} \\\
        -DLIB_INSTALL_DIR:PATH=%{_libdir} \\\
        -DSYSCONF_INSTALL_DIR:PATH=%{_sysconfdir} \\\
        -DSHARE_INSTALL_PREFIX:PATH=%{_datadir} \\\
%if "%{?_lib}" == "lib64" \
        %{?_cmake_lib_suffix64} \\\
%endif \
        -DBUILD_SHARED_LIBS:BOOL=ON

%cmake_build \
  %__cmake --build "%{__cmake_builddir}" %{?_smp_mflags} --verbose

%cmake_install \
  DESTDIR="%{buildroot}" %__cmake --install "%{__cmake_builddir}"

%ctest(:-:) \
cd "%{__cmake_builddir}" \
%__ctest --output-on-failure --force-new-ctest-process %{?_smp_mflags} %{**} \
cd -

%cmake3 %cmake
%cmake3_build %cmake_build
%cmake3_install %cmake_install
%ctest3(:-:) %ctest %{**}

通过上面的修改后,即可适配高版本的编译

### CMAKE_BUILD_TYPE 与 CMAKE_CONFIGURATION_TYPES 的区别 在使用 `cmake-gui` 安装 **ncnn** 或其他 CMake 项目时,理解 `CMAKE_BUILD_TYPE` 和 `CMAKE_CONFIGURATION_TYPES` 的区别非常重要,因为它们直接影响构建配置和输出结果。 #### CMAKE_BUILD_TYPE `CMAKE_BUILD_TYPE` 用于指定单配置生成器(如 Makefile、Ninja)的构建类型。常见的值包括 `Debug`、`Release`、`RelWithDebInfo` 和 `MinSizeRel`。这些选项决定了编译器的优化级别、调试信息的生成以及是否包含断言等调试功能。例如,在构建 ncnn 时,如果设置 `CMAKE_BUILD_TYPE=Release`,编译器将启用最高级别的优化以提高性能,而会包含调试符号。 ```cmake set(CMAKE_BUILD_TYPE Release) ``` #### CMAKE_CONFIGURATION_TYPES `CMAKE_CONFIGURATION_TYPES` 用于多配置生成器(如 Visual Studio 或 Xcode),它允许用户在单次配置中定义多个构建类型。例如,可以同时指定 `Debug` 和 `Release` 配置,以便在 IDE 中切换同的构建模式。该变量通常在跨平台开发或使用 IDE 时使用,以确保项目支持多种构建类型。 ```cmake set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Configurations") ``` #### 适用场景 - **单配置生成器**:如使用 `make` 或 `ninja`,应使用 `CMAKE_BUILD_TYPE` 来指定构建类型。 - **多配置生成器**:如使用 Visual Studio,应使用 `CMAKE_CONFIGURATION_TYPES` 来定义多个构建配置。 #### 注意事项 - 如果在多配置生成器中设置了 `CMAKE_BUILD_TYPE`,它可能会生效,因为优先级较低。此时应使用 `CMAKE_CONFIGURATION_TYPES`。 - 在 `CMakeLists.txt` 中,如果没有显式设置 `CMAKE_CONFIGURATION_TYPES`,默认情况下,多配置生成器将支持所有标准构建类型。 #### 示例:ncnn 构建中的应用 在构建 **ncnn** 时,如果使用 `cmake-gui` 进行配置,可以通过以下方式设置构建类型: 1. **单配置构建**:选择 `CMAKE_BUILD_TYPE` 并设置为 `Release` 或 `Debug`。 2. **多配置构建**:设置 `CMAKE_CONFIGURATION_TYPES` 为 `Debug;Release`,以便在 IDE 中切换构建类型。 ```cmake # 单配置构建 set(CMAKE_BUILD_TYPE Release) # 多配置构建 set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Configurations") ``` ### 相关问题 1. 如何在 CMake 中为 ncnn 启用特定的构建选项,例如 `NCNN_SIMPLE_ONE_LAYERS`? 2. 使用 CMake 构建 ncnn 时,如何确保 OpenMP 支持被正确启用? 3. 在 CMake 中,如何为 ncnn 指定交叉编译工具链? 4. CMake 中的 `CMAKE_INSTALL_PREFIX` 变量对 ncnn 的安装路径有何影响? 5. 如何通过 CMake 配置 ncnn 的静态库和动态库构建选项?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

武汉磨磨

打赏是写出更好教程的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值