From bdfafabf12634d7475ce49a99c529d51d74a39dd Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Thu, 19 May 2022 11:16:42 +0200 Subject: [PATCH] Merge pull request #5744 from rouault/fix_5741_5742 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CMake: fix build without PNG and JPEG (fixes #5741, fixes #5742) --- .github/workflows/cmake_builds.yml | 10 ++++ frmts/grib/CMakeLists.txt | 12 +++-- frmts/gtiff/CMakeLists.txt | 82 +++++++++++++++--------------- frmts/gtiff/libtiff/CMakeLists.txt | 2 +- frmts/mrf/CMakeLists.txt | 25 ++++++--- frmts/mrf/GNUmakefile | 2 +- frmts/mrf/makefile.vc | 2 + frmts/mrf/marfa.h | 13 ++++- frmts/mrf/marfa_dataset.cpp | 24 +++++++-- frmts/mrf/mrf_util.cpp | 58 ++++++++++++++++++--- frmts/pcidsk/CMakeLists.txt | 2 +- frmts/pcidsk/sdk/CMakeLists.txt | 17 +++---- 12 files changed, 174 insertions(+), 75 deletions(-) diff --git a/.github/workflows/cmake_builds.yml b/.github/workflows/cmake_builds.yml index 00f906641e6a..85b2f8a08325 100644 --- a/.github/workflows/cmake_builds.yml +++ b/.github/workflows/cmake_builds.yml @@ -456,6 +456,16 @@ jobs: - name: Build shell: bash -l {0} run: cmake --build $GITHUB_WORKSPACE/build --config RelWithDebInfo -j 2 + - name: Configure with even less dependencies + shell: bash -l {0} + run: | + export CONDA_PREFIX_BACKUP=${CONDA_PREFIX} + conda deactivate + rm -f build/CMakeCache.txt + cmake -A ${architecture} -G "${generator}" -Werror=dev "-DCMAKE_C_COMPILER_LAUNCHER=clcache" "-DCMAKE_CXX_COMPILER_LAUNCHER=clcache" "-DPROJ_INCLUDE_DIR=${CONDA_PREFIX_BACKUP}/Library/include" "-DPROJ_LIBRARY=${CONDA_PREFIX_BACKUP}/Library/lib/proj.lib" -DCMAKE_UNITY_BUILD=${CMAKE_UNITY_BUILD} -S "$GITHUB_WORKSPACE" -B "$GITHUB_WORKSPACE/build" -DCMAKE_C_FLAGS=" /WX" -DCMAKE_CXX_FLAGS=" /WX" -DGDAL_USE_EXTERNAL_LIBS:BOOL=OFF -DGDAL_USE_PNG_INTERNAL=OFF -DGDAL_USE_JPEG_INTERNAL=OFF -DGDAL_USE_JPEG12_INTERNAL=OFF -DGDAL_USE_GIF_INTERNAL=OFF -DGDAL_USE_LERC_INTERNAL=OFF -DGDAL_USE_LERCV1_INTERNAL=OFF -DGDAL_USE_QHULL_INTERNAL=OFF -DGDAL_USE_OPENCAD_INTERNAL=OFF -DWERROR_DEV_FLAG="-Werror=dev" + - name: Build + shell: bash -l {0} + run: cmake --build $GITHUB_WORKSPACE/build --config RelWithDebInfo -j 2 - name: Show gdal.pc shell: bash -l {0} run: cat $GITHUB_WORKSPACE/build/gdal.pc diff --git a/frmts/grib/CMakeLists.txt b/frmts/grib/CMakeLists.txt index 3a5685a700fb..6d23690be441 100644 --- a/frmts/grib/CMakeLists.txt +++ b/frmts/grib/CMakeLists.txt @@ -107,14 +107,18 @@ if (GDAL_USE_PNG_INTERNAL) gdal_add_vendored_lib(gdal_GRIB libpng) target_compile_definitions(gdal_GRIB PRIVATE -DUSE_PNG) target_sources(gdal_GRIB PRIVATE degrib/g2clib/pngunpack.c degrib/g2clib/dec_png.c) -else () +endif() + +if (GDAL_USE_ZLIB_INTERNAL) + gdal_add_vendored_lib(gdal_GRIB libz) +endif () + +if (GDAL_USE_PNG AND NOT GDAL_USE_PNG_INTERNAL) target_compile_definitions(gdal_GRIB PRIVATE -DUSE_PNG) gdal_target_link_libraries(gdal_GRIB PRIVATE PNG::PNG) target_sources(gdal_GRIB PRIVATE degrib/g2clib/pngunpack.c degrib/g2clib/dec_png.c) endif () -if (GDAL_USE_ZLIB_INTERNAL) - gdal_add_vendored_lib(gdal_GRIB libz) -else () +if (GDAL_USE_ZLIB AND NOT GDAL_USE_ZLIB_INTERNAL) gdal_target_link_libraries(gdal_GRIB PRIVATE ZLIB::ZLIB) endif () diff --git a/frmts/gtiff/CMakeLists.txt b/frmts/gtiff/CMakeLists.txt index 71304c3faccc..fc63963f807a 100644 --- a/frmts/gtiff/CMakeLists.txt +++ b/frmts/gtiff/CMakeLists.txt @@ -108,43 +108,45 @@ if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.16) PROPERTY SKIP_UNITY_BUILD_INCLUSION ON) endif () -add_executable(generate_quant_table_md5sum EXCLUDE_FROM_ALL generate_quant_table_md5sum.cpp) -gdal_standard_includes(generate_quant_table_md5sum) -target_link_libraries(generate_quant_table_md5sum PRIVATE ${GDAL_LIB_TARGET_NAME}) -if (GDAL_USE_TIFF_INTERNAL) - target_sources(generate_quant_table_md5sum PRIVATE $ ../../port/cpl_md5.cpp) - target_include_directories(generate_quant_table_md5sum PRIVATE $) - if (RENAME_INTERNAL_TIFF_SYMBOLS) - target_compile_definitions(generate_quant_table_md5sum PRIVATE -DRENAME_INTERNAL_LIBTIFF_SYMBOLS) - endif () - if (GDAL_USE_ZLIB_INTERNAL) - target_sources(generate_quant_table_md5sum PRIVATE $) - else () - target_link_libraries(generate_quant_table_md5sum PRIVATE ZLIB::ZLIB) - endif () - if (GDAL_USE_DEFLATE) - target_link_libraries(generate_quant_table_md5sum PRIVATE Deflate::Deflate) - endif () - if (GDAL_USE_JPEG_INTERNAL) - target_sources(generate_quant_table_md5sum PRIVATE $) - else () - target_link_libraries(generate_quant_table_md5sum PRIVATE JPEG::JPEG) - endif () - if (GDAL_USE_JPEG12_INTERNAL) - target_sources(generate_quant_table_md5sum PRIVATE $) - endif () - if (GDAL_USE_ZSTD) - target_link_libraries(generate_quant_table_md5sum PRIVATE ${ZSTD_TARGET}) - endif () - if (GDAL_USE_LIBLZMA) - target_link_libraries(generate_quant_table_md5sum PRIVATE LibLZMA::LibLZMA) - endif () - if (GDAL_USE_WEBP) - target_link_libraries(generate_quant_table_md5sum PRIVATE WEBP::WebP) - endif () - if (GDAL_USE_LERC_INTERNAL) - target_sources(generate_quant_table_md5sum PRIVATE $) - endif () -else () - target_link_libraries(generate_quant_table_md5sum PRIVATE TIFF::TIFF) -endif () +if(GDAL_USE_JPEG OR GDAL_USE_JPEG_INTERNAL) + add_executable(generate_quant_table_md5sum EXCLUDE_FROM_ALL generate_quant_table_md5sum.cpp) + gdal_standard_includes(generate_quant_table_md5sum) + target_link_libraries(generate_quant_table_md5sum PRIVATE ${GDAL_LIB_TARGET_NAME}) + if (GDAL_USE_TIFF_INTERNAL) + target_sources(generate_quant_table_md5sum PRIVATE $ ../../port/cpl_md5.cpp) + target_include_directories(generate_quant_table_md5sum PRIVATE $) + if (RENAME_INTERNAL_TIFF_SYMBOLS) + target_compile_definitions(generate_quant_table_md5sum PRIVATE -DRENAME_INTERNAL_LIBTIFF_SYMBOLS) + endif () + if (GDAL_USE_ZLIB_INTERNAL) + target_sources(generate_quant_table_md5sum PRIVATE $) + else () + target_link_libraries(generate_quant_table_md5sum PRIVATE ZLIB::ZLIB) + endif () + if (GDAL_USE_DEFLATE) + target_link_libraries(generate_quant_table_md5sum PRIVATE Deflate::Deflate) + endif () + if (GDAL_USE_JPEG_INTERNAL) + target_sources(generate_quant_table_md5sum PRIVATE $) + else () + target_link_libraries(generate_quant_table_md5sum PRIVATE JPEG::JPEG) + endif () + if (GDAL_USE_JPEG12_INTERNAL) + target_sources(generate_quant_table_md5sum PRIVATE $) + endif () + if (GDAL_USE_ZSTD) + target_link_libraries(generate_quant_table_md5sum PRIVATE ${ZSTD_TARGET}) + endif () + if (GDAL_USE_LIBLZMA) + target_link_libraries(generate_quant_table_md5sum PRIVATE LibLZMA::LibLZMA) + endif () + if (GDAL_USE_WEBP) + target_link_libraries(generate_quant_table_md5sum PRIVATE WEBP::WebP) + endif () + if (GDAL_USE_LERC_INTERNAL) + target_sources(generate_quant_table_md5sum PRIVATE $) + endif () + else () + target_link_libraries(generate_quant_table_md5sum PRIVATE TIFF::TIFF) + endif () +endif() diff --git a/frmts/gtiff/libtiff/CMakeLists.txt b/frmts/gtiff/libtiff/CMakeLists.txt index 35b22e964216..26fae9c6ffb8 100644 --- a/frmts/gtiff/libtiff/CMakeLists.txt +++ b/frmts/gtiff/libtiff/CMakeLists.txt @@ -86,7 +86,7 @@ if (NOT GDAL_USE_ZLIB_INTERNAL) gdal_target_link_libraries(libtiff PRIVATE ZLIB::ZLIB) endif () -if (NOT GDAL_USE_JPEG_INTERNAL) +if (GDAL_USE_JPEG AND NOT GDAL_USE_JPEG_INTERNAL) # Use a separate object library so that external libjpeg headers are only applied to tif_jpeg.c and tif_ojpeg.c, but # not tif_jpeg_12.c ! add_library(libtiff_jpeg OBJECT tif_jpeg.c tif_ojpeg.c) diff --git a/frmts/mrf/CMakeLists.txt b/frmts/mrf/CMakeLists.txt index 0ff07ee6d119..8032042a674a 100644 --- a/frmts/mrf/CMakeLists.txt +++ b/frmts/mrf/CMakeLists.txt @@ -1,8 +1,6 @@ add_gdal_driver( TARGET gdal_MRF SOURCES BitMask2D.h - JPEG_band.cpp - PNG_band.cpp marfa.h marfa_dataset.cpp mrf_band.cpp @@ -11,13 +9,26 @@ add_gdal_driver( Packer.h Packer_RLE.cpp Packer_RLE.h - JPNG_band.cpp Tif_band.cpp BUILTIN) gdal_standard_includes(gdal_MRF) +if (GDAL_USE_JPEG OR GDAL_USE_JPEG_INTERNAL) + target_compile_definitions(gdal_MRF PRIVATE -DHAVE_JPEG) + target_sources(gdal_MRF PRIVATE JPEG_band.cpp) +endif() + +if (GDAL_USE_PNG OR GDAL_USE_PNG_INTERNAL) + target_compile_definitions(gdal_MRF PRIVATE -DHAVE_PNG) + target_sources(gdal_MRF PRIVATE PNG_band.cpp) +endif() + +if ((GDAL_USE_JPEG OR GDAL_USE_JPEG_INTERNAL) AND (GDAL_USE_PNG OR GDAL_USE_PNG_INTERNAL)) + target_sources(gdal_MRF PRIVATE JPNG_band.cpp) + endif() + # Internal libs first -if (GDAL_USE_JPEG12_INTERNAL) +if ((GDAL_USE_JPEG OR GDAL_USE_JPEG_INTERNAL) AND GDAL_USE_JPEG12_INTERNAL) target_sources(gdal_MRF PRIVATE JPEG12_band.cpp) target_compile_definitions(gdal_MRF PRIVATE -DJPEG12_SUPPORTED) target_include_directories(gdal_MRF PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) @@ -48,11 +59,11 @@ endif () # Now external libs -if (NOT GDAL_USE_JPEG_INTERNAL) +if (GDAL_USE_JPEG AND NOT GDAL_USE_JPEG_INTERNAL) gdal_target_link_libraries(gdal_MRF PRIVATE JPEG::JPEG) endif () -if (NOT GDAL_USE_PNG_INTERNAL) +if (GDAL_USE_PNG AND NOT GDAL_USE_PNG_INTERNAL) gdal_target_link_libraries(gdal_MRF PRIVATE PNG::PNG) endif () @@ -72,4 +83,4 @@ endif () if (GDAL_USE_BRUNSLI) target_compile_definitions(gdal_MRF PRIVATE -DBRUNSLI) gdal_target_link_libraries(gdal_MRF PRIVATE BRUNSLI::ENCODE BRUNSLI::DECODE) -endif () \ No newline at end of file +endif () diff --git a/frmts/mrf/GNUmakefile b/frmts/mrf/GNUmakefile index a2a1301e9b1a..08f966eea076 100644 --- a/frmts/mrf/GNUmakefile +++ b/frmts/mrf/GNUmakefile @@ -19,7 +19,7 @@ LO_O_OBJ = $(addsuffix .lo,$(basename $(O_OBJ))) DEPENDS = marfa.h # For GDAL < 2.1 -CPPFLAGS := $(GDAL_INCLUDE) $(CPPFLAGS) +CPPFLAGS := $(GDAL_INCLUDE) $(CPPFLAGS) -DHAVE_PNG -DHAVE_JPEG # JPEG12_ENABLED is set only with the internal jpeg library ifeq ($(JPEG12_ENABLED),yes) diff --git a/frmts/mrf/makefile.vc b/frmts/mrf/makefile.vc index 6ef4f1d34777..a6f43440376b 100644 --- a/frmts/mrf/makefile.vc +++ b/frmts/mrf/makefile.vc @@ -16,6 +16,8 @@ GDAL_ROOT = ..\.. OBJ = Packer_RLE.obj Tif_band.obj PNG_band.obj JPEG_band.obj JPNG_band.obj\ mrf_band.obj mrf_overview.obj mrf_util.obj marfa_dataset.obj +EXTRAFLAGS = -DHAVE_PNG -DHAVE_JPEG + # Internal libraries diff --git a/frmts/mrf/marfa.h b/frmts/mrf/marfa.h index a18a50fc6c52..2992036f0950 100644 --- a/frmts/mrf/marfa.h +++ b/frmts/mrf/marfa.h @@ -93,7 +93,16 @@ NAMESPACE_MRF_START // These are a pain to maintain in sync. They should be replaced with // C++11 uniform initializers. The externs reside in util.cpp enum ILCompression { - IL_PNG = 0, IL_PPNG, IL_JPEG, IL_JPNG, IL_NONE, IL_ZLIB, IL_TIF, +#ifdef HAVE_PNG + IL_PNG, IL_PPNG, +#endif +#ifdef HAVE_JPEG + IL_JPEG, +#endif +#if defined(HAVE_PNG) && defined(HAVE_JPEG) + IL_JPNG, +#endif + IL_NONE, IL_ZLIB, IL_TIF, #if defined(LERC) IL_LERC, #endif @@ -677,7 +686,7 @@ class JPEG_Codec { private: // not implemented. but suppress MSVC warning about 'assignment operator could not be generated' - JPEG_Codec& operator= (const JPEG_Codec& src); + JPEG_Codec& operator= (const JPEG_Codec& src); }; class JPEG_Band final: public MRFRasterBand { diff --git a/frmts/mrf/marfa_dataset.cpp b/frmts/mrf/marfa_dataset.cpp index bd8cf74292a6..2d42b11c7cfc 100644 --- a/frmts/mrf/marfa_dataset.cpp +++ b/frmts/mrf/marfa_dataset.cpp @@ -739,11 +739,12 @@ static CPLErr Init_Raster(ILImage& image, MRFDataset* ds, CPLXMLNode* defimage) } // Page Encoding, defaults to PNG - image.comp = CompToken(CPLGetXMLValue(defimage, "Compression", "PNG")); + const char* pszCompression = CPLGetXMLValue(defimage, "Compression", "PNG"); + image.comp = CompToken(pszCompression); if (image.comp == IL_ERR_COMP) { CPLError(CE_Failure, CPLE_IllegalArg, "GDAL MRF: Compression %s is unknown", - CPLGetXMLValue(defimage, "Compression", nullptr)); + pszCompression); return CE_Failure; } @@ -1110,8 +1111,12 @@ CPLXMLNode* MRFDataset::BuildConfig() XMLSetAttributeVal(raster, "Size", full.size, "%.0f"); XMLSetAttributeVal(raster, "PageSize", full.pagesize, "%.0f"); +#ifdef HAVE_PNG if (full.comp != IL_PNG) +#endif + { CPLCreateXMLElementAndValue(raster, "Compression", CompName(full.comp)); + } if (full.dt != GDT_Byte) CPLCreateXMLElementAndValue(raster, "DataType", GDALGetDataTypeName(full.dt)); @@ -1600,13 +1605,20 @@ GDALDataset* MRFDataset::CreateCopy(const char* pszFilename, char** papszCWROptions = nullptr; papszCWROptions = CSLAddNameValue(papszCWROptions, "COMPRESSED", "TRUE"); +#ifdef HAVE_JPEG // Use the Zen version of the CopyWholeRaster if input has a dataset mask and JPEGs are generated if (GMF_PER_DATASET == poSrcDS->GetRasterBand(1)->GetMaskFlags() && - (poDS->current.comp == IL_JPEG || poDS->current.comp == IL_JPNG)) { + (poDS->current.comp == IL_JPEG +#ifdef HAVE_PNG + || poDS->current.comp == IL_JPNG +#endif + )) { err = poDS->ZenCopy(poSrcDS, pfnProgress, pProgressData); nCloneFlags ^= GCIF_MASK; // Turn the external mask off } - else { + else +#endif + { err = GDALDatasetCopyWholeRaster((GDALDatasetH)poSrcDS, (GDALDatasetH)poDS, papszCWROptions, pfnProgress, pProgressData); } @@ -1928,7 +1940,11 @@ MRFDataset::Create(const char* pszName, // Use the full, set some initial parameters ILImage& img = poDS->full; img.size = ILSize(nXSize, nYSize, 1, nBandsIn); +#ifdef HAVE_PNG img.comp = IL_PNG; +#else + img.comp = IL_NONE; +#endif img.order = (nBandsIn < 5) ? IL_Interleaved : IL_Separate; img.pagesize = ILSize(512, 512, 1, 1); img.quality = 85; diff --git a/frmts/mrf/mrf_util.cpp b/frmts/mrf/mrf_util.cpp index d9194b4e7f12..a8b46aa281c1 100644 --- a/frmts/mrf/mrf_util.cpp +++ b/frmts/mrf/mrf_util.cpp @@ -54,7 +54,17 @@ CPL_C_END NAMESPACE_MRF_START // These have to be positionally in sync with the enums in marfa.h -static const char * const ILC_N[] = { "PNG", "PPNG", "JPEG", "JPNG", "NONE", "DEFLATE", "TIF", +static const char * const ILC_N[] = { +#ifdef HAVE_PNG + "PNG", "PPNG", +#endif +#ifdef HAVE_JPEG + "JPEG", +#endif +#if defined(HAVE_PNG) && defined(HAVE_JPEG) + "JPNG", +#endif + "NONE", "DEFLATE", "TIF", #if defined(LERC) "LERC", #endif @@ -63,7 +73,17 @@ static const char * const ILC_N[] = { "PNG", "PPNG", "JPEG", "JPNG", "NONE", "DE #endif "Unknown" }; -static const char * const ILC_E[]={ ".ppg", ".ppg", ".pjg", ".pjp", ".til", ".pzp", ".ptf", +static const char * const ILC_E[]={ +#ifdef HAVE_PNG + ".ppg", ".ppg", +#endif +#ifdef HAVE_JPEG + ".pjg", +#endif +#if defined(HAVE_PNG) && defined(HAVE_JPEG) + ".pjp", +#endif + ".til", ".pzp", ".ptf", #if defined(LERC) ".lrc", #endif @@ -192,7 +212,11 @@ ILImage::ILImage() : size(ILSize(1, 1, 1, 1, 0)), pagesize(ILSize(384, 384, 1, 1, 0)), pagecount(pcount(size, pagesize)), +#ifdef HAVE_PNG comp(IL_PNG), +#else + comp(IL_NONE), +#endif order(IL_Interleaved), nbo(false), hasNoData(FALSE), @@ -242,7 +266,7 @@ CPLString getFname(CPLXMLNode *node, const char *token, const CPLString &in, con if (slashPos == 0 // Starts with slash || (slashPos == 2 && fn[1] == ':') // Starts with disk letter column // Does not start with dots then slash - || (slashPos != fn.npos && slashPos != fn.find_first_not_of('.')) + || (slashPos != fn.npos && slashPos != fn.find_first_not_of('.')) || EQUALN(in,"", 10) // XML string input || in.find_first_of("\\/") == in.npos) // We can't get a basename from 'in' return fn; @@ -286,10 +310,16 @@ MRFRasterBand *newMRFRasterBand(MRFDataset *pDS, const ILImage &image, int b, in MRFRasterBand *bnd = nullptr; CPLErrorReset(); switch (pDS->current.comp) { +#ifdef HAVE_PNG case IL_PPNG: // Uses the PNG code, just has a palette in each PNG case IL_PNG: bnd = new PNG_Band(pDS, image, b, level); break; +#endif +#ifdef HAVE_JPEG case IL_JPEG: bnd = new JPEG_Band(pDS, image, b, level); break; +#endif +#if defined(HAVE_PNG) && defined(HAVE_JPEG) case IL_JPNG: bnd = new JPNG_Band(pDS, image, b, level); break; +#endif case IL_NONE: bnd = new Raw_Band(pDS, image, b, level); break; #if defined(LERC) case IL_LERC: bnd = new LERC_Band(pDS, image, b, level); break; @@ -490,9 +520,25 @@ void GDALRegister_mrf() { driver->SetMetadataItem( GDAL_DMD_CREATIONOPTIONLIST, "" - "