2
2
# SPDX-License-Identifier: Apache-2.0
3
3
# https://github.com/AcademySoftwareFoundation/OpenImageIO
4
4
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
+ ###########################################################################
8
11
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)
12
16
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 )
15
20
16
- string (MAKE_C_IDENTIFIER ${GIF_BUILD_VERSION} GIF_VERSION_IDENT)
21
+ string (MAKE_C_IDENTIFIER ${GIF_BUILD_VERSION} GIF_VERSION_IDENT)
17
22
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
21
37
URL ${GIF_URL}
22
38
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/
30
80
)
31
81
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
+ #############################################################################
34
89
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()
39
108
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)
43
136
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