Skip to content

Commit 0f7a559

Browse files
committed
Update gif cmake
1 parent 34ba540 commit 0f7a559

File tree

1 file changed

+125
-28
lines changed

1 file changed

+125
-28
lines changed

src/cmake/build_gif.cmake

Lines changed: 125 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,42 +2,139 @@
22
# SPDX-License-Identifier: Apache-2.0
33
# https://github.com/AcademySoftwareFoundation/OpenImageIO
44

5-
######################################################################
6-
# GIF by hand!
7-
######################################################################
5+
###########################################################################
6+
# Build GIF library locally
7+
#
8+
# This script downloads and builds the GIF library from source since GIF
9+
# doesn't provide a CMake-based build system like other dependencies.
10+
###########################################################################
811

9-
set_cache (GIF_BUILD_VERSION 5.2.1 "GIFLIB version for local builds")
10-
set (GIF_URL "https://downloads.sourceforge.net/project/giflib/giflib-${GIF_BUILD_VERSION}.tar.gz")
11-
set (GIF_URL_HASH SHA256=31da5562f44c5f15d63340a09a4fd62b48c45620cd302f77a6d9acf0077879bd)
12+
# Set version and source information
13+
set_cache(GIF_BUILD_VERSION 5.2.1 "GIFLIB version for local builds")
14+
set(GIF_URL "https://downloads.sourceforge.net/project/giflib/giflib-${GIF_BUILD_VERSION}.tar.gz")
15+
set(GIF_URL_HASH SHA256=31da5562f44c5f15d63340a09a4fd62b48c45620cd302f77a6d9acf0077879bd)
1216

13-
set_cache (GIF_BUILD_SHARED_LIBS ${LOCAL_BUILD_SHARED_LIBS_DEFAULT}
14-
DOC "Should execute a local GIF build, if necessary, build shared libraries" ADVANCED)
17+
# Configuration options
18+
set_cache(GIF_BUILD_SHARED_LIBS ${LOCAL_BUILD_SHARED_LIBS_DEFAULT}
19+
DOC "Should execute a local GIF build, if necessary, build shared libraries" ADVANCED)
1520

16-
string (MAKE_C_IDENTIFIER ${GIF_BUILD_VERSION} GIF_VERSION_IDENT)
21+
string(MAKE_C_IDENTIFIER ${GIF_BUILD_VERSION} GIF_VERSION_IDENT)
1722

18-
# Build setup using ExternalProject
19-
build_dependency_with_cmake(GIF
20-
VERSION ${GIF_BUILD_VERSION}
23+
# Set up variables
24+
set(GIF_LOCAL_SOURCE_DIR "${${PROJECT_NAME}_LOCAL_DEPS_ROOT}/GIF")
25+
set(GIF_LOCAL_BUILD_DIR "${${PROJECT_NAME}_LOCAL_DEPS_ROOT}/GIF-build")
26+
set(GIF_LOCAL_INSTALL_DIR "${${PROJECT_NAME}_LOCAL_DEPS_ROOT}/dist")
27+
28+
# Ensure necessary directories exist
29+
file(MAKE_DIRECTORY ${GIF_LOCAL_INSTALL_DIR}/include)
30+
file(MAKE_DIRECTORY ${GIF_LOCAL_INSTALL_DIR}/lib)
31+
32+
# Download and build using ExternalProject
33+
# GIF uses a simple Makefile-based build system, so we skip the configure step
34+
include(ExternalProject)
35+
ExternalProject_Add(GIF_ext
36+
# Source location and verification
2137
URL ${GIF_URL}
2238
URL_HASH ${GIF_URL_HASH}
23-
CMAKE_ARGS
24-
-D CMAKE_INSTALL_PREFIX=${GIF_LOCAL_INSTALL_DIR}
25-
-D BUILD_SHARED_LIBS=${GIF_BUILD_SHARED_LIBS}
26-
-D CMAKE_INSTALL_LIBDIR=lib
27-
PATCH_COMMAND
28-
curl -L https://sourceforge.net/p/giflib/bugs/_discuss/thread/4e811ad29b/c323/attachment/Makefile.patch -o Makefile.patch &&
29-
patch -p0 < Makefile.patch
39+
DOWNLOAD_DIR "${${PROJECT_NAME}_LOCAL_DEPS_ROOT}/downloads"
40+
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
41+
42+
# Build directories
43+
PREFIX "${GIF_LOCAL_BUILD_DIR}"
44+
SOURCE_DIR "${GIF_LOCAL_SOURCE_DIR}"
45+
46+
# Build in source since GIF doesn't support out-of-source builds
47+
BUILD_IN_SOURCE 1
48+
49+
# Build steps
50+
CONFIGURE_COMMAND "" # Skip configure step (no configure script)
51+
BUILD_COMMAND make -j${CMAKE_BUILD_PARALLEL_LEVEL} PREFIX=${GIF_LOCAL_INSTALL_DIR}
52+
INSTALL_COMMAND make PREFIX=${GIF_LOCAL_INSTALL_DIR} install
53+
54+
# Apply a patch to fix the Makefile - with hash verification
55+
PATCH_COMMAND ${CMAKE_COMMAND} -E echo "Downloading patch file..." &&
56+
curl -L https://sourceforge.net/p/giflib/bugs/_discuss/thread/4e811ad29b/c323/attachment/Makefile.patch -o Makefile.patch &&
57+
${CMAKE_COMMAND} -E echo "Computing patch file hash..." &&
58+
${CMAKE_COMMAND} -E md5sum Makefile.patch > patch_hash.txt &&
59+
${CMAKE_COMMAND} -E compare_files patch_hash.txt ${PROJECT_SOURCE_DIR}/cmake/patches/giflib-5.2.1-expected-hash.txt &&
60+
${CMAKE_COMMAND} -E echo "Patch file verified, applying..." &&
61+
patch -p0 < Makefile.patch
62+
63+
# Enable logging
64+
LOG_DOWNLOAD ON
65+
LOG_BUILD ON
66+
LOG_INSTALL ON
67+
)
68+
69+
# Add custom commands to ensure header file and library are properly installed
70+
# This is needed because the GIF Makefile installation might be unreliable
71+
add_custom_command(
72+
TARGET GIF_ext
73+
POST_BUILD
74+
COMMAND ${CMAKE_COMMAND} -E copy_if_different
75+
${GIF_LOCAL_SOURCE_DIR}/gif_lib.h
76+
${GIF_LOCAL_INSTALL_DIR}/include/
77+
COMMAND ${CMAKE_COMMAND} -E copy_if_different
78+
${GIF_LOCAL_SOURCE_DIR}/libgif.a
79+
${GIF_LOCAL_INSTALL_DIR}/lib/
3080
)
3181

32-
# Set up paths for find_package
33-
set (GIF_ROOT ${GIF_LOCAL_INSTALL_DIR})
82+
#############################################################################
83+
# Create a custom FindGIF.cmake module
84+
#
85+
# The standard FindGIF.cmake module may have trouble locating the locally
86+
# built library, so we provide our own module that points directly to our
87+
# build outputs.
88+
#############################################################################
3489

35-
# Signal to caller that we need to find again at the installed location
36-
set (GIF_REFIND TRUE)
37-
set (GIF_REFIND_VERSION ${GIF_BUILD_VERSION})
38-
set (GIF_REFIND_ARGS CONFIG)
90+
file(MAKE_DIRECTORY "${${PROJECT_NAME}_LOCAL_DEPS_ROOT}/cmake/modules")
91+
file(WRITE "${${PROJECT_NAME}_LOCAL_DEPS_ROOT}/cmake/modules/FindGIF.cmake"
92+
"# Custom FindGIF module for locally-built GIF
93+
set(GIF_FOUND TRUE)
94+
set(GIF_VERSION ${GIF_BUILD_VERSION})
95+
set(GIF_INCLUDE_DIR \"${GIF_LOCAL_INSTALL_DIR}/include\")
96+
set(GIF_LIBRARY \"${GIF_LOCAL_INSTALL_DIR}/lib/libgif.a\")
97+
set(GIF_LIBRARIES \${GIF_LIBRARY})
98+
set(GIF_INCLUDE_DIRS \${GIF_INCLUDE_DIR})
99+
100+
# Create imported target for use with modern CMake
101+
if(NOT TARGET GIF::GIF)
102+
add_library(GIF::GIF UNKNOWN IMPORTED)
103+
set_target_properties(GIF::GIF PROPERTIES
104+
IMPORTED_LOCATION \"\${GIF_LIBRARY}\"
105+
INTERFACE_INCLUDE_DIRECTORIES \"\${GIF_INCLUDE_DIR}\"
106+
)
107+
endif()
39108
40-
if (GIF_BUILD_SHARED_LIBS)
41-
install_local_dependency_libs (GIF GIF)
42-
endif ()
109+
include(FindPackageHandleStandardArgs)
110+
find_package_handle_standard_args(GIF
111+
REQUIRED_VARS GIF_LIBRARY GIF_INCLUDE_DIR
112+
VERSION_VAR GIF_VERSION
113+
)
114+
")
115+
116+
# Add our modules directory to the CMAKE_MODULE_PATH
117+
list(APPEND CMAKE_MODULE_PATH "${${PROJECT_NAME}_LOCAL_DEPS_ROOT}/cmake/modules")
118+
119+
# Create the GIF::GIF imported target in the current scope
120+
if(NOT TARGET GIF::GIF)
121+
add_library(GIF::GIF UNKNOWN IMPORTED GLOBAL)
122+
set_target_properties(GIF::GIF PROPERTIES
123+
IMPORTED_LOCATION "${GIF_LOCAL_INSTALL_DIR}/lib/libgif.a"
124+
INTERFACE_INCLUDE_DIRECTORIES "${GIF_LOCAL_INSTALL_DIR}/include"
125+
)
126+
add_dependencies(GIF::GIF GIF_ext)
127+
endif()
128+
129+
# Set up variables for the find_package system
130+
set(GIF_ROOT ${GIF_LOCAL_INSTALL_DIR})
131+
132+
# Signal to caller that we need to find again at the installed location
133+
set(GIF_REFIND TRUE)
134+
set(GIF_REFIND_VERSION ${GIF_BUILD_VERSION})
135+
set(GIF_REFIND_ARGS MODULE REQUIRED)
43136

137+
# Handle shared library installation if requested
138+
if(GIF_BUILD_SHARED_LIBS)
139+
install_local_dependency_libs(GIF gif)
140+
endif()

0 commit comments

Comments
 (0)