专栏/CMake 安装多个版本 FLTK

CMake 安装多个版本 FLTK

2023年04月01日 04:35--浏览 · --点赞 · --评论
粉丝:8文章:9

安装多个版本的 FLTK,这里选的是 1.3.8,其他版本也类似。

我的想法是安装到 /repository/cmake/fltk/{version} 用路径来区分版本号,找的时候也这么找。

生成

下载源代码并解压到 /path/to/fltk-1.3.8

# powershell
cmake -S /path/to/fltk-1.3.8 `
  -B /path/to/fltk-1.3.8/build `
  -G "Visual Studio 17 2022" `
  -DCMAKE_INSTALL_PREFIX=/path/to/repo/fltk/1.3.8

构建

# powershell
cmake --build /path/to/fltk-1.3.8/build --config Release -- "-m:30"

安装

# powershell
# 生成的时候指定过安装路径,这里不指定了
cmake --install /path/to/fltk-1.3.8/build

FindFLTK.cmake 文件修改

要复制构建目录下的 CMakeCache.txt 文件到 /path/to/repo/fltk/1.3.8/CMake 文件夹。
不然后面的 load_cache() 命令会报错。

# powershell
cp /path/to/fltk-1.3.8/build/CMakeCache.txt /path/to/repo/fltk/1.3.8/CMake

全贴了代码换行符会消失,所以只贴修改过的地方。

1. 根据第一行注释可以搜索到

# Construct a set of paths relative to the system search path.
# 这一块原先的有问题, Windows安装的话必须把安装目录名称改成 lib 这个文件才能找到
set(FLTK_DIR_SEARCH "")
foreach(dir ${FLTK_DIR_SEARCH2})
  if(WIN32)
    # 添加 fltk/{version} 的支持
    # 将原先的目录改成 ${dir}/fltk
    set(FLTK_DIR_SEARCH ${FLTK_DIR_SEARCH} "${dir}/fltk;${dir}/fltk/${FLTK_FIND_VERSION}")
  else()
  	 set(FLTK_DIR_SEARCH ${FLTK_DIR_SEARCH} "${dir}/../lib/fltk")
  endif()
endforeach()
string(REPLACE "//" "/" FLTK_DIR_SEARCH "${FLTK_DIR_SEARCH}")

2. 也是根据注释可以搜到

#
# Look for an installation or build tree.
#
# Win32 需要重写 find_path(), 不然根本找不到 FLTKConfig.cmake
# 看原来的代码,好像 FLTKConfig.cmake 文件是在 fltk 文件夹下的,但 Windows install 了之后,是在 fltk/CMake 下面
if(WIN32)
  find_path(FLTK_DIR FLTKConfig.cmake
    HINTS
    ENV FLTK_DIR
    ${FLTK_DIR_SEARCH}

    PATH_SUFFIXES
    include
    lib
    bin
    CMake

    DOC "The ${FLTK_DIR_STRING}"
  )
else()
  find_path(FLTK_DIR FLTKConfig.cmake
    HINTS
    ENV FLTK_DIR
    ${FLTK_DIR_SEARCH}

    PATH_SUFFIXES
    fltk
    fltk/include
    lib/fltk
    lib/fltk/include

    DOC "The ${FLTK_DIR_STRING}"
  )
endif()

3. 搜索 set(FLTK_INCLUDE_DIR ${FLTK_DIR})

# Windows FLTK_DIR 的值是 /path/to/repo/fltk/1.3.8/CMake
if(NOT FLTK_INCLUDE_DIR)
  if(WIN32)
    set(FLTK_INCLUDE_DIR "${FLTK_DIR}/../include")
  else()
  	 set(FLTK_INCLUDE_DIR ${FLTK_DIR})
  endif()
endif()


投诉或建议