前回はOpenFXの概要と仕様回りを確認したので今回は早速サンプルとして公開されているプラグインをビルド…したかったのですが、その前にまずサポートライブラリをビルドする必要がありました。
よって今回はプラグイン開発のサポートライブラリをビルドする方法をシェアします。
開発環境
OpenFX 1.4
Windows 11
CMake 3.22 (以上)
Visual Studio 2022 (Community Edition)
- C++ v143 build tools (x86 & x64)
- MSBuild 17
CUDA Toolkit 11.8
OpenFXはcuda以外にopenCLもサポートしていますが今回はcudaでやってみます。
OpenGLは特にバージョン指定なし。多分どこかにインストールされている前提で。。。
OpenFX Support Libのプロジェクト構築
まずはプロジェクトをDLします。
git clone --branch OFX_Release_1_4_TAG https://github.com/AcademySoftwareFoundation/openfx.git
初心者にはファイルが多すぎて全容把握が難しいので、別フォルダを作りそこに必要なものだけコピーします。
今回はincludeフォルダ,Supportのinclude,Libraryフォルダ2つです。
プロジェクトの構成は下記を想定しています。
my project/
├ include/
├ Support/
├ include/
└ Library/
CMakeプロジェクトの作成
OpenFXの1.4ではcmakeに対応していないので、自分で作る茨の道を選択します。
CMakeLists.txtを3つとCMakePresets.jsonの計4つのファイルを作成します。
CMakePresets.json(my project/CMakePresets.json)
プロジェクトルートに置きます。
目的は主に2つで
- windows 64bit以外のOSを弾く
- ビルドフォルダを作る(out-of-source build)
{
"version": 3,
"cmakeMinimumRequired": {
"major": 3,
"minor": 22,
"patch": 0
},
"configurePresets": [
{
"name": "windows-x64",
"description": "Default Windows build (x64)",
"hidden": false,
"generator": "Visual Studio 17 2022",
"binaryDir": "${sourceDir}/build/build_x64",
"cacheVariables": {
"OFX_ARCH_NAME": "Windows",
"CMAKE_BUILD_TYPE": "Debug"
}
},
{
"name": "macos",
"description": "Default macOS build",
"hidden": false,
"generator": "Xcode",
"binaryDir": "${sourceDir}/build/build_macos",
"cacheVariables": {
"OFX_ARCH_NAME": "MacOS",
"CMAKE_BUILD_TYPE": "Debug"
}
}
]
}
CMakeLists1個目(my project/CMakeLists.txt)
極論するとこのファイルにビルド情報を全部入れ込むと良いですが、今回は一応体裁を気にしてファイルを分けています。
最新のmainブランチをみるにバージョン1.5以降は用意してくれると思いますが、その場合はパーケージソフトのconanを入れる必要があります。(OpenFX Build Instructions)
以下は今回作るCMakeListsの主要目的。Debugビルドを考えています。
- プロジェクトの作成
- パス設定
- OpenGL/CUDA(又はOpenCL)の設定
- コンパイルオプションの設定
cmake_minimum_required(VERSION 3.22...3.25)
if(WIN32)
project(openfx VERSION 1.4.0 LANGUAGES CXX CUDA)
else()
project(openfx VERSION 1.4.0 LANGUAGES CXX) # no CUDA
endif()
add_definitions(-D_HAS_AUTO_PTR_ETC)
# C Headers
set(OFX_HEADER_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include")
file(GLOB_RECURSE OFX_HEADER_FILES "${OFX_HEADER_DIR}/*.h")
# OpenGL
find_package(OpenGL REQUIRED)
if(OpenGL_FOUND)
message(STATUS "OpenGL was found.")
add_compile_definitions(OFX_SUPPORTS_OPENGLRENDER)
else()
message(FATAL_ERROR "OpenCL not found.")
endif()
# OpenCL
find_package(OpenCL REQUIRED)
if(OpenCL_FOUND)
message(STATUS "OpenCL was found.")
else()
message(FATAL_ERROR "OpenCL not found.")
endif()
# CUDA
if(WIN32)
set(OFX_SUPPORTS_CUDARENDER ON)
else(APPLE)
set(OFX_SUPPORTS_CUDARENDER OFF)
endif()
if(OFX_SUPPORTS_CUDARENDER)
message("CUDA ON")
add_definitions(-DOFX_SUPPORTS_CUDARENDER)
set(CMAKE_CUDA_ARCHITECTURES "all-major")
endif()
# DEBUG examples
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DDEBUG")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG")
set_property(GLOBAL PROPERTY OFX_PROJECT_SOURCE_DIR "${PROJECT_SOURCE_DIR}")
# Flags
if(!MSVC)
set(CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} -Wall -Wextra -Wno-deprecated -Wno-deprecated-declarations"
)
endif()
add_subdirectory(Support)
CMakeLists2個目(my project/Support/CMakeLists.txt)
サポートライブラリのヘッダパス設定をしたらLibraryフォルダのCMakeLists.txtに渡すだけです。
set(OFX_SUPPORT_HEADER_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include")
file(GLOB_RECURSE OFX_SUPPORT_HEADER_FILES "${OFX_SUPPORT_HEADER_DIR}/*.h")
add_subdirectory(Library)
CMakeLists3個目(my project/Support/Library/CMakeLists.txt)
サポートライブラリ本体のビルドを担当。
set(OFX_SUPPORT_LIBRARY_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
file(GLOB_RECURSE OFX_SUPPORT_LIBRARY_FILES "${OFX_SUPPORT_LIBRARY_DIR}/*.cpp")
add_library(OfxSupport STATIC
${OFX_HEADER_FILES}
${OFX_SUPPORT_HEADER_FILES}
${OFX_SUPPORT_LIBRARY_FILES})
set_target_properties(OfxSupport PROPERTIES LINKER_LANGUAGE CXX)
if(NOT MSVC)
set_target_properties(OfxSupport PROPERTIES COMPILE_FLAGS "-fPIC")
endif()
target_include_directories(OfxSupport PUBLIC
${OFX_HEADER_DIR}
${OFX_SUPPORT_HEADER_DIR})
プロジェクトフォルダ構成
my project/
├ include/
├ Support/
├ CMakeLists.txt (作成2)
├ include/
└ Library/
└ CMakeLists.txt (作成3)
├ CMakeLists.txt (作成1)
└ CMakePresets.json (作成)
CMakeコマンドの実行
下記のようなコマンドでプロジェクトを作成させます。
cmake --preset windows-x64
No CUDA toolset found. エラーの対処
VS2022&CUDA11.8の場合でCMakeでCUDAを使うのが初めての場合に多分出ます。
VSにtoolset参照を与えれば解決なのですが、今回は下記の方法で解決させます。
setp1 : 必要なファイルを探す
「C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\extras\visual_studio_integration\MSBuildExtensions」フォルダ内に下記の4つのファイルがあるか探します。
- CUDA 11.8.props
- CUDA 11.8.targets
- CUDA 11.8.xml
- Nvda.Build.CudaTasks.v11.8.dll
setp2 : VSインストールフォルダにコピーする
「C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\BuildCustomizations」へ4つのファイルをコピーします。
step3 : レジストリ登録(option)
レジストリエディタ(winボタンを押して「regedit」と打ち込む)を開いてCUDAの項目にインストールディレクトリを追加。
場所:HKEY_LOCAL_MACHINE\SOFTWARE\NVIDIA Corporation\GPU Computing Toolkit\CUDA\v11.8
設定値:InstallDir REG_SZ (文字列) C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8
ビルド
cmakeに成功すると「build/build_x64」以下にopenfx.slnファイルが生成されます。
開いてOfxSupportプロジェクトをビルドします。
ビルドに成功すると「my project\build\build_x64\Support\Library\Debug」以下にOfxSupport.libファイルが生成されます。
お疲れさまでした。