LoginSignup
6
3

More than 5 years have passed since last update.

CMake で GLFW を見つける

Last updated at Posted at 2017-03-12

初めに

CMake にはデフォルトで FindGLUT などはあるのですが、まだ FindGLFW がありません。

そこで、 FindGLFW モジュールを作成してみました。

参考

https://github.com/PixarAnimationStudios/OpenSubdiv/blob/master/cmake/FindGLFW.cmake
https://gist.github.com/Caellian/9be4a8a617e59ec3eee93b37a9cf19c9

FindGLFW.cmake

以下のような FindGLFW.cmake を用意します。

# GLFW_FOUND
# GLFW_INCLUDE_DIR
# GLFW_LIBRARIES
#

find_path (GLFW_INCLUDE_DIR
    NAMES
        GLFW/glfw3.h
    PATHS
        "${GLFW_ROOT}/include"
        /usr/X11R6/include
        /usr/include/X11
        /opt/graphics/OpenGL/include
        /opt/graphics/OpenGL/contrib/libglfw
        /usr/local/include
        /usr/include/GL
        /usr/include
    DOC
        "The directory where GL/glfw.h resides"
)

if (WIN32)
    if (MSVC11 OR (${MSVC_VERSION} EQUAL 1700))
        find_library (GLFW_LIBRARIES
            NAMES
                glfw3
            PATHS
                "${GLFW_ROOT}/lib"
                "${GLFW_ROOT}/lib-vc2012"
            DOCS
                "The GLFW library"
        )
    elseif (MSVC12 OR (${MSVC_VERSION} EQUAL 1800))
        find_library (GLFW_LIBRARIES
            NAMES
                glfw3
            PATHS
                "${GLFW_ROOT}/lib"
                "${GLFW_ROOT}/lib-vc2013"
            DOCS
                "The GLFW library"
        )
    elseif (MSVC14 OR (${MSVC_VERSION} EQUAL 1900))
        find_library (GLFW_LIBRARIES
            NAMES
                glfw3
            PATHS
                "${GLFW_ROOT}/lib"
                "${GLFW_ROOT}/lib-vc2015"
            DOCS
                "The GLFW library"
        )
    elseif (MINGW)
        if (CMAKE_CL_64)
            find_library (GLFW_LIBRARIES
                NAMES
                    glfw3
                PATHS
                    "${GLFW_ROOT}/lib"
                    "${GLFW_ROOT}/lib-mingw-w64"
                DOCS
                    "The GLFW library"
            )
        else ()
            find_library (GLFW_LIBRARIES
                NAMES
                    glfw3
                PATHS
                    "${GLFW_ROOT}/lib"
                    "${GLFW_ROOT}/lib-mingw"
                DOCS
                    "The GLFW library"
            )
        endif ()
    else()
        find_library (GLFW_LIBRARIES
            NAMES
                glfw3
            PATHS
                "${GLFW_ROOT}/lib"
            DOCS
                "The GLFW library"
        )
    endif()
else ()
    find_library (GLFW_LIBRARIES
        NAMES
            glfw
            glfw3
        PATHS
            "${GLFW_ROOT}/lib"
            "${GLFW_ROOT}/lib/x11"
            /usr/lib64
            /usr/lib
            /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}
            /usr/local/lib64
            /usr/local/lib
            /usr/local/lib/${CMAKE_LIBRARY_ARCHITECTURE}
            /usr/X11R6/lib
        DOCS
            "The GLFW library"
    )
    if (APPLE)
        list (APPEND GLFW_LIBRARIES
            "-framework Cocoa"
            "-framework CoreVideo"
            "-framework IOKit"
        )
    else ()
        find_package(Threads REQUIRED)

        find_package(X11 REQUIRED)

        # Set up library and include paths
        list(APPEND GLFW_INCLUDE_DIR "${X11_X11_INCLUDE_PATH}")
        list(APPEND GLFW_LIBRARIES "${X11_X11_LIB}" "${CMAKE_THREAD_LIBS_INIT}" "${CMAKE_DL_LIBS}")

        # Check for XRandR (modern resolution switching and gamma control)
        if (NOT X11_Xrandr_FOUND)
            message(FATAL_ERROR "The RandR library and headers were not found")
        endif()

        list(APPEND GLFW_INCLUDE_DIR "${X11_Xrandr_INCLUDE_PATH}")
        list(APPEND GLFW_LIBRARIES "${X11_Xrandr_LIB}")

        # Check for Xinerama (legacy multi-monitor support)
        if (NOT X11_Xinerama_FOUND)
            message(FATAL_ERROR "The Xinerama library and headers were not found")
        endif()

        list(APPEND GLFW_INCLUDE_DIR "${X11_Xinerama_INCLUDE_PATH}")
        list(APPEND GLFW_LIBRARIES "${X11_Xinerama_LIB}")

        # Check for Xkb (X keyboard extension)
        if (NOT X11_Xkb_FOUND)
            message(FATAL_ERROR "The X keyboard extension headers were not found")
        endif()

        list(APPEND GLFW_INCLUDE_DIR "${X11_Xkb_INCLUDE_PATH}")

        # Check for Xcursor
        if (NOT X11_Xcursor_FOUND)
            message(FATAL_ERROR "The Xcursor libraries and headers were not found")
        endif()

        list(APPEND GLFW_INCLUDE_DIR "${X11_Xcursor_INCLUDE_PATH}")
        list(APPEND GLFW_LIBRARIES "${X11_Xcursor_LIB}")

        # Check for Xrandr
        if(NOT X11_Xrandr_FOUND)
            message(FATAL_ERROR "Xrandr library not found - required for GLFW")
        endif()

        list(APPEND GLFW_LIBRARIES "${X11_Xrandr_LIB}")

        # Check for xf86vmode
        if(NOT X11_xf86vmode_FOUND)
            message(FATAL_ERROR "xf86vmode library not found - required for GLFW")
        endif()

        list(APPEND GLFW_LIBRARIES "${X11_Xxf86vm_LIB}")

    endif ()
endif()

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(GLFW DEFAULT_MSG GLFW_LIBRARIES GLFW_INCLUDE_DIR)

mark_as_advanced(GLFW_INCLUDE_DIR GLFW_LIBRARIES)

配置

用意した FindGLFW.cmake をプロジェクトトップディレクトリ内の cmake ディレクトリに配置します。

使用方法

プロジェクトの CMakeLists.txt 内で以下のようにして使用します。

set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
find_package(GLFW REQUIRED)
find_package(OpenGL REQUIRED)

include_directories(${GLFW_INCLUDE_DIR})
add_executable(glfw_app main.cpp)
target_link_libraries(glfw_app ${GLFW_LIBRARIES} ${OPENGL_LIBRARY})

Linux や macOS では通常ライブラリの配置されるディレクトリをサーチするようになっています。

GLFW の配置位置を指定する場合は cmake 実行時に以下のようにして指定します。

cmake -D GLFW_ROOT=<GLFW のディレクトリ>

説明

GLFW をサーチするディレクトリは CMake 変数 GLFW_ROOT を使用します。
Linux 、 macOS では、通常 GLFW が配置されていると思われる場所を PATHS に追加します。

Windows

Visual Studio のライブラリはバージョンごとに用意されているため CMake 変数 MSVC14 等で場合分けし、サーチディレクトリを指定します。

macOS

macOS では GLFW のライブラリ以外に、 -framework Cocoa -framework CoreVideo -framework IOKit を追加します。
これは gl3w 等を使用する際に使用するに必要となるため、追加しました。
GLFW の CMakeLists.txt でも追加されています。

Linux

Travis CI に対応する際、X関連のライブラリーが足りずにリンクが失敗するため、必要となったものを追加しました。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3