diff --git a/recipes/giflib/5.2.x/CMakeLists.txt b/recipes/giflib/5.2.x/CMakeLists.txt index d3488899fb..d481315ab4 100644 --- a/recipes/giflib/5.2.x/CMakeLists.txt +++ b/recipes/giflib/5.2.x/CMakeLists.txt @@ -19,9 +19,38 @@ if(NOT BUILD_SHARED_LIBS) endif() add_library(${PROJECT_NAME} ${SOURCE_FILES}) +if(WIN32 AND BUILD_SHARED_LIBS) + set_property(TARGET ${PROJECT_NAME} PROPERTY PREFIX "") +endif() -install(TARGETS ${PROJECT_NAME} +set(GIF_UTILS + gif2rgb + gifbuild + giffix + giftext + giftool + gifclrmp +) + +add_library(giflib_util STATIC + "source_subfolder/qprintf.c" + "source_subfolder/quantize.c" + "source_subfolder/getarg.c" +) +target_link_libraries(giflib_util PRIVATE ${PROJECT_NAME}) + +foreach(GIF_UTIL ${GIF_UTILS}) + add_executable(${GIF_UTIL} "source_subfolder/${GIF_UTIL}.c") + target_link_libraries(${GIF_UTIL} PRIVATE ${PROJECT_NAME} giflib_util) +endforeach() +find_library(M_LIBRARY NAMES m) +if(M_LIBRARY) + target_link_libraries(gifclrmp PRIVATE ${M_LIBRARY}) +endif() + +install(TARGETS ${PROJECT_NAME} ${GIF_UTILS} ARCHIVE DESTINATION "lib" LIBRARY DESTINATION "lib" - RUNTIME DESTINATION "bin") + RUNTIME DESTINATION "bin" + BUNDLE DESTINATION "bin") install(FILES "source_subfolder/gif_lib.h" DESTINATION "include") diff --git a/recipes/giflib/5.2.x/conanfile.py b/recipes/giflib/5.2.x/conanfile.py index adc0a7535c..14e4db2692 100644 --- a/recipes/giflib/5.2.x/conanfile.py +++ b/recipes/giflib/5.2.x/conanfile.py @@ -1,18 +1,27 @@ from conans import CMake, ConanFile, tools -from conans.errors import ConanInvalidConfiguration import os +required_conan_version = ">=1.33.0" + + class GiflibConan(ConanFile): name = "giflib" description = "A library and utilities for reading and writing GIF images." url = "https://github.com/conan-io/conan-center-index" license = "MIT" homepage = "http://giflib.sourceforge.net" - topics = ("conan", "giflib", "image", "multimedia", "format", "graphics") + topics = ("giflib", "image", "multimedia", "format", "graphics") settings = "os", "arch", "compiler", "build_type" - options = {"shared": [True, False], "fPIC": [True, False]} - default_options = {"shared": False, "fPIC": True} - exports_sources = ["CMakeLists.txt", "patches/*"] + options = { + "shared": [True, False], + "fPIC": [True, False], + } + default_options = { + "shared": False, + "fPIC": True, + } + + exports_sources = "CMakeLists.txt", "patches/*" generators = "cmake" _cmake = None @@ -31,16 +40,18 @@ class GiflibConan(ConanFile): del self.settings.compiler.libcxx del self.settings.compiler.cppstd + def requirements(self): + if self.settings.compiler == "Visual Studio": + self.requires("getopt-for-visual-studio/20200201") + def source(self): - tools.get(**self.conan_data["sources"][self.version]) - os.rename("%s-%s" % (self.name, self.version), self._source_subfolder) + tools.get(**self.conan_data["sources"][self.version], + destination=self._source_subfolder, strip_root=True) def _configure_cmake(self): if self._cmake: return self._cmake - self._cmake = CMake(self) - self._cmake.configure() return self._cmake @@ -50,19 +61,21 @@ class GiflibConan(ConanFile): def build(self): self._patch_sources() - cmake = self._configure_cmake() cmake.build() def package(self): + self.copy("COPYING", src=self._source_subfolder, dst="licenses") cmake = self._configure_cmake() cmake.install() - self.copy("COPYING", src=self._source_subfolder, dst="licenses") - def package_info(self): self.cpp_info.names["cmake_find_package"] = "GIF" self.cpp_info.names["cmake_find_package_multi"] = "GIF" - self.cpp_info.libs = tools.collect_libs(self) + self.cpp_info.libs = ["gif"] if self.settings.compiler == "Visual Studio": self.cpp_info.defines.append("USE_GIF_DLL" if self.options.shared else "USE_GIF_LIB") + + bin_path = os.path.join(self.package_folder, "bin") + self.output.info("Appending PATH environment variable: {}".format(bin_path)) + self.env_info.PATH.append(bin_path) diff --git a/recipes/giflib/5.2.x/test_package/CMakeLists.txt b/recipes/giflib/5.2.x/test_package/CMakeLists.txt index 34af13462f..dbaecefb32 100644 --- a/recipes/giflib/5.2.x/test_package/CMakeLists.txt +++ b/recipes/giflib/5.2.x/test_package/CMakeLists.txt @@ -1,8 +1,10 @@ cmake_minimum_required(VERSION 3.1) -project(test_package) +project(test_package C) include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) -conan_basic_setup() +conan_basic_setup(TARGETS) + +find_package(GIF REQUIRED CONFIG) add_executable(${PROJECT_NAME} test_package.c) -target_link_libraries(${PROJECT_NAME} ${CONAN_LIBS}) +target_link_libraries(${PROJECT_NAME} PRIVATE GIF::GIF) diff --git a/recipes/giflib/5.2.x/test_package/conanfile.py b/recipes/giflib/5.2.x/test_package/conanfile.py index 188432bc4f..4a64433a83 100644 --- a/recipes/giflib/5.2.x/test_package/conanfile.py +++ b/recipes/giflib/5.2.x/test_package/conanfile.py @@ -1,9 +1,10 @@ from conans import ConanFile, CMake, tools import os + class TestPackageConan(ConanFile): settings = "os", "compiler", "build_type", "arch" - generators = "cmake" + generators = "cmake", "cmake_find_package_multi" def build(self): cmake = CMake(self) @@ -11,7 +12,9 @@ class TestPackageConan(ConanFile): cmake.build() def test(self): - if not tools.cross_building(self.settings): + if not tools.cross_building(self): bin_path = os.path.join("bin", "test_package") - command = "%s testimg.gif" % bin_path - self.run(command, run_environment=True) + self.run("{} testimg.gif".format(bin_path), run_environment=True) + assert os.path.isfile("testimg.gif") + self.run("gif2rgb -o testimg.rgb testimg.gif".format(bin_path), run_environment=True) + assert os.path.isfile("testimg.rgb.R") diff --git a/recipes/giflib/5.2.x/test_package/test_package.c b/recipes/giflib/5.2.x/test_package/test_package.c index 7e36b18101..7c3b23c1cd 100644 --- a/recipes/giflib/5.2.x/test_package/test_package.c +++ b/recipes/giflib/5.2.x/test_package/test_package.c @@ -1,92 +1,96 @@ -#include -#include -#include -#include - #include "gif_lib.h" +#include +#include +#include +#include -#define LINE_LEN 40 -#define IMAGEWIDTH LINE_LEN*GIF_FONT_WIDTH +#define LINE_LEN 40 +#define IMAGEWIDTH LINE_LEN*GIF_FONT_WIDTH static int BackGround = 0; static void QuitGifError(GifFileType *GifFile); static void GenRasterTextLine(GifRowType *RasterBuffer, char *TextLine, - int BufferWidth, int ForeGroundIndex); + int BufferWidth, int ForeGroundIndex); /****************************************************************************** Interpret the command line and generate the given GIF file. ******************************************************************************/ int main(int argc, char **argv) { - int i, j, l, ColorMapSize, ErrorCode; + int i, j, l, ColorMapSize, ErrorCode; char Line[LINE_LEN]; GifRowType RasterBuffer[GIF_FONT_HEIGHT]; ColorMapObject *ColorMap; GifFileType *GifFile; - GifColorType ScratchMap[256]; + GifColorType ScratchMap[256]; + + if (argc < 2) { + fprintf(stderr, "Usage: %s OUTPUTGIF\n", argv[0]); + exit(1); + } /* Allocate the raster buffer for GIF_FONT_HEIGHT scan lines. */ for (i = 0; i < GIF_FONT_HEIGHT; i++) { - if ((RasterBuffer[i] = (GifRowType) malloc(sizeof(GifPixelType) * - IMAGEWIDTH)) == NULL) - exit(1); + if ((RasterBuffer[i] = (GifRowType) malloc(sizeof(GifPixelType) * IMAGEWIDTH)) == NULL) + exit(1); } /* Open stdout for the output file: */ - if ((GifFile = EGifOpenFileName("out.gif", 0, &ErrorCode)) == NULL) { - printf("error: %d\n", ErrorCode); - exit(EXIT_FAILURE); + if ((GifFile = EGifOpenFileName(argv[1], 0, &ErrorCode)) == NULL) { + printf("error: %d\n", ErrorCode); + exit(EXIT_FAILURE); } /* Read the color map in ColorFile into this color map: */ for (ColorMapSize = 0; ColorMapSize < 256; ColorMapSize++) { ScratchMap[ColorMapSize].Red = ColorMapSize; - ScratchMap[ColorMapSize].Green = ColorMapSize; - ScratchMap[ColorMapSize].Blue = ColorMapSize; + ScratchMap[ColorMapSize].Green = ColorMapSize; + ScratchMap[ColorMapSize].Blue = ColorMapSize; } if ((ColorMap = GifMakeMapObject(1 << GifBitSize(ColorMapSize), ScratchMap)) == NULL) - exit(1); + exit(1); if (EGifPutScreenDesc(GifFile, - IMAGEWIDTH, ColorMapSize * GIF_FONT_HEIGHT, - GifBitSize(ColorMapSize), - BackGround, ColorMap) == GIF_ERROR) - QuitGifError(GifFile); + IMAGEWIDTH, ColorMapSize * GIF_FONT_HEIGHT, + GifBitSize(ColorMapSize), + BackGround, ColorMap) == GIF_ERROR) + QuitGifError(GifFile); /* Dump out the image descriptor: */ if (EGifPutImageDesc(GifFile, - 0, 0, IMAGEWIDTH, ColorMapSize * GIF_FONT_HEIGHT, false, NULL) == GIF_ERROR) - QuitGifError(GifFile); + 0, 0, IMAGEWIDTH, ColorMapSize * GIF_FONT_HEIGHT, false, NULL) == GIF_ERROR) + QuitGifError(GifFile); printf("\n%s: Image 1 at (%d, %d) [%dx%d]: \n", - "test_package", GifFile->Image.Left, GifFile->Image.Top, - GifFile->Image.Width, GifFile->Image.Height); + "test_package", GifFile->Image.Left, GifFile->Image.Top, + GifFile->Image.Width, GifFile->Image.Height); - for (i = l = 0; i < ColorMap->ColorCount; i++) { - (void)snprintf(Line, sizeof(Line), - "Color %-3d: [%-3d, %-3d, %-3d] ", i, - ColorMap->Colors[i].Red, - ColorMap->Colors[i].Green, - ColorMap->Colors[i].Blue); - GenRasterTextLine(RasterBuffer, Line, IMAGEWIDTH, i); - for (j = 0; j < GIF_FONT_HEIGHT; j++) { - if (EGifPutLine(GifFile, RasterBuffer[j], IMAGEWIDTH) == GIF_ERROR) - QuitGifError(GifFile); - printf("\b\b\b\b%-4d", l++); - } + for (i = l = 0; i < ColorMap->ColorCount; i++) + { + (void)snprintf(Line, sizeof(Line), + "Color %-3d: [%-3d, %-3d, %-3d] ", i, + ColorMap->Colors[i].Red, + ColorMap->Colors[i].Green, + ColorMap->Colors[i].Blue); + GenRasterTextLine(RasterBuffer, Line, IMAGEWIDTH, i); + for (j = 0; j < GIF_FONT_HEIGHT; j++) + { + if (EGifPutLine(GifFile, RasterBuffer[j], IMAGEWIDTH) == GIF_ERROR) + QuitGifError(GifFile); + printf("\b\b\b\b%-4d", l++); + } } - if (EGifCloseFile(GifFile, &ErrorCode) == GIF_ERROR) - { + if (EGifCloseFile(GifFile, &ErrorCode) == GIF_ERROR) { printf("error: %d\n", ErrorCode); - if (GifFile != NULL) { - EGifCloseFile(GifFile, NULL); - } - exit(EXIT_FAILURE); + if (GifFile != NULL) { + EGifCloseFile(GifFile, NULL); + } + exit(EXIT_FAILURE); } return 0; @@ -96,23 +100,24 @@ int main(int argc, char **argv) Close output file (if open), and exit. ******************************************************************************/ static void GenRasterTextLine(GifRowType *RasterBuffer, char *TextLine, - int BufferWidth, int ForeGroundIndex) + int BufferWidth, int ForeGroundIndex) { unsigned char c; unsigned char Byte, Mask; int i, j, k, CharPosX, Len = (int)strlen(TextLine); for (i = 0; i < BufferWidth; i++) - for (j = 0; j < GIF_FONT_HEIGHT; j++) RasterBuffer[j][i] = BackGround; + for (j = 0; j < GIF_FONT_HEIGHT; j++) + RasterBuffer[j][i] = BackGround; for (i = CharPosX = 0; i < Len; i++, CharPosX += GIF_FONT_WIDTH) { - c = TextLine[i]; - for (j = 0; j < GIF_FONT_HEIGHT; j++) { - Byte = GifAsciiTable8x8[(unsigned short)c][j]; - for (k = 0, Mask = 128; k < GIF_FONT_WIDTH; k++, Mask >>= 1) - if (Byte & Mask) - RasterBuffer[j][CharPosX + k] = ForeGroundIndex; - } + c = TextLine[i]; + for (j = 0; j < GIF_FONT_HEIGHT; j++) { + Byte = GifAsciiTable8x8[(unsigned short)c][j]; + for (k = 0, Mask = 128; k < GIF_FONT_WIDTH; k++, Mask >>= 1) + if (Byte & Mask) + RasterBuffer[j][CharPosX + k] = ForeGroundIndex; + } } } @@ -123,9 +128,7 @@ static void QuitGifError(GifFileType *GifFile) { if (GifFile != NULL) { printf("error: %d\n", GifFile->Error); - EGifCloseFile(GifFile, NULL); + EGifCloseFile(GifFile, NULL); } exit(EXIT_FAILURE); } - -/* vim: ts=8 sw=8 et */