161 lines
6.2 KiB
CMake
161 lines
6.2 KiB
CMake
# Findtinyobjloader.cmake
|
|
# Find the tinyobjloader library
|
|
#
|
|
# This module defines the following variables:
|
|
# tinyobjloader_FOUND - True if tinyobjloader was found
|
|
# tinyobjloader_INCLUDE_DIRS - Include directories for tinyobjloader
|
|
# tinyobjloader_LIBRARIES - Libraries to link against tinyobjloader
|
|
#
|
|
# It also defines the following targets:
|
|
# tinyobjloader::tinyobjloader
|
|
|
|
# Try to find the package using pkg-config first
|
|
find_package(PkgConfig QUIET)
|
|
if(PKG_CONFIG_FOUND)
|
|
pkg_check_modules(PC_tinyobjloader QUIET tinyobjloader)
|
|
endif()
|
|
|
|
# Find the include directory
|
|
find_path(tinyobjloader_INCLUDE_DIR
|
|
NAMES tiny_obj_loader.h
|
|
PATHS
|
|
${PC_tinyobjloader_INCLUDE_DIRS}
|
|
/usr/include
|
|
/usr/local/include
|
|
$ENV{VULKAN_SDK}/include
|
|
${ANDROID_NDK}/sources/third_party
|
|
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../external
|
|
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party
|
|
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../attachments/external
|
|
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../attachments/third_party
|
|
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../attachments/include
|
|
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../../external
|
|
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../../third_party
|
|
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../../include
|
|
PATH_SUFFIXES tinyobjloader tiny_obj_loader
|
|
)
|
|
|
|
# Find the library
|
|
find_library(tinyobjloader_LIBRARY
|
|
NAMES tinyobjloader
|
|
PATHS
|
|
${PC_tinyobjloader_LIBRARY_DIRS}
|
|
/usr/lib
|
|
/usr/local/lib
|
|
$ENV{VULKAN_SDK}/lib
|
|
${ANDROID_NDK}/sources/third_party
|
|
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../external
|
|
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../third_party
|
|
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../attachments/external
|
|
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../attachments/third_party
|
|
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../attachments/lib
|
|
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../../external
|
|
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../../third_party
|
|
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../../lib
|
|
PATH_SUFFIXES lib
|
|
)
|
|
|
|
# If the include directory wasn't found, use FetchContent to download and build
|
|
if(NOT tinyobjloader_INCLUDE_DIR)
|
|
# If not found, use FetchContent to download and build
|
|
include(FetchContent)
|
|
|
|
message(STATUS "tinyobjloader not found, fetching from GitHub...")
|
|
FetchContent_Declare(
|
|
tinyobjloader
|
|
GIT_REPOSITORY https://github.com/tinyobjloader/tinyobjloader.git
|
|
GIT_TAG v2.0.0rc10 # Use a specific tag for stability
|
|
)
|
|
|
|
# Set options before making tinyobjloader available
|
|
set(TINYOBJLOADER_BUILD_TEST_LOADER OFF CACHE BOOL "Do not build test loader" FORCE)
|
|
set(TINYOBJLOADER_BUILD_OBJ_STICHER OFF CACHE BOOL "Do not build obj sticher" FORCE)
|
|
set(TINYOBJLOADER_INSTALL OFF CACHE BOOL "Do not install tinyobjloader" FORCE)
|
|
|
|
# Update CMake policy to suppress the deprecation warning
|
|
if(POLICY CMP0169)
|
|
cmake_policy(SET CMP0169 OLD)
|
|
endif()
|
|
|
|
# Populate the content but don't configure it yet
|
|
FetchContent_GetProperties(tinyobjloader)
|
|
if(NOT tinyobjloader_POPULATED)
|
|
FetchContent_Populate(tinyobjloader)
|
|
|
|
# Update the minimum required CMake version before including the CMakeLists.txt
|
|
file(READ "${tinyobjloader_SOURCE_DIR}/CMakeLists.txt" TINYOBJLOADER_CMAKE_CONTENT)
|
|
string(REPLACE "cmake_minimum_required(VERSION 3.2)"
|
|
"cmake_minimum_required(VERSION 3.10)"
|
|
TINYOBJLOADER_CMAKE_CONTENT "${TINYOBJLOADER_CMAKE_CONTENT}")
|
|
string(REPLACE "cmake_minimum_required(VERSION 3.5)"
|
|
"cmake_minimum_required(VERSION 3.10)"
|
|
TINYOBJLOADER_CMAKE_CONTENT "${TINYOBJLOADER_CMAKE_CONTENT}")
|
|
file(WRITE "${tinyobjloader_SOURCE_DIR}/CMakeLists.txt" "${TINYOBJLOADER_CMAKE_CONTENT}")
|
|
|
|
# Now add the subdirectory manually
|
|
add_subdirectory(${tinyobjloader_SOURCE_DIR} ${tinyobjloader_BINARY_DIR})
|
|
else()
|
|
# If already populated, just make it available
|
|
FetchContent_MakeAvailable(tinyobjloader)
|
|
endif()
|
|
|
|
# Get the include directory from the target
|
|
get_target_property(tinyobjloader_INCLUDE_DIR tinyobjloader INTERFACE_INCLUDE_DIRECTORIES)
|
|
if(NOT tinyobjloader_INCLUDE_DIR)
|
|
# If we can't get the include directory from the target, use the source directory
|
|
set(tinyobjloader_INCLUDE_DIR ${tinyobjloader_SOURCE_DIR})
|
|
endif()
|
|
endif()
|
|
|
|
# Set the variables
|
|
include(FindPackageHandleStandardArgs)
|
|
find_package_handle_standard_args(tinyobjloader
|
|
REQUIRED_VARS tinyobjloader_INCLUDE_DIR
|
|
)
|
|
|
|
if(tinyobjloader_FOUND)
|
|
set(tinyobjloader_INCLUDE_DIRS ${tinyobjloader_INCLUDE_DIR})
|
|
|
|
if(tinyobjloader_LIBRARY)
|
|
set(tinyobjloader_LIBRARIES ${tinyobjloader_LIBRARY})
|
|
else()
|
|
# tinyobjloader is a header-only library, so no library is needed
|
|
set(tinyobjloader_LIBRARIES "")
|
|
endif()
|
|
|
|
# Create an imported target
|
|
if(NOT TARGET tinyobjloader::tinyobjloader)
|
|
add_library(tinyobjloader::tinyobjloader INTERFACE IMPORTED)
|
|
set_target_properties(tinyobjloader::tinyobjloader PROPERTIES
|
|
INTERFACE_INCLUDE_DIRECTORIES "${tinyobjloader_INCLUDE_DIRS}"
|
|
)
|
|
if(tinyobjloader_LIBRARIES)
|
|
set_target_properties(tinyobjloader::tinyobjloader PROPERTIES
|
|
INTERFACE_LINK_LIBRARIES "${tinyobjloader_LIBRARIES}"
|
|
)
|
|
endif()
|
|
endif()
|
|
elseif(TARGET tinyobjloader)
|
|
# If find_package_handle_standard_args failed but we have a tinyobjloader target from FetchContent
|
|
# Create an alias for the tinyobjloader target
|
|
if(NOT TARGET tinyobjloader::tinyobjloader)
|
|
add_library(tinyobjloader::tinyobjloader ALIAS tinyobjloader)
|
|
endif()
|
|
|
|
# Set variables to indicate that tinyobjloader was found
|
|
set(tinyobjloader_FOUND TRUE)
|
|
set(TINYOBJLOADER_FOUND TRUE)
|
|
|
|
# Set include directories
|
|
get_target_property(tinyobjloader_INCLUDE_DIR tinyobjloader INTERFACE_INCLUDE_DIRECTORIES)
|
|
if(tinyobjloader_INCLUDE_DIR)
|
|
set(tinyobjloader_INCLUDE_DIRS ${tinyobjloader_INCLUDE_DIR})
|
|
else()
|
|
# If we can't get the include directory from the target, use the source directory
|
|
set(tinyobjloader_INCLUDE_DIR ${tinyobjloader_SOURCE_DIR})
|
|
set(tinyobjloader_INCLUDE_DIRS ${tinyobjloader_INCLUDE_DIR})
|
|
endif()
|
|
endif()
|
|
|
|
mark_as_advanced(tinyobjloader_INCLUDE_DIR tinyobjloader_LIBRARY)
|