Skip to content

Commit

Permalink
support files installation (#1)
Browse files Browse the repository at this point in the history
* fix many builtin paths

* add a zeroconf build

* move the quotes

* use macOS 13 for now

* do not share caches between jobs

* no need for shared zeroconf builds

* run a single workflow at a time

* build all conan artifacts only once

* checkout the conanfile

* go back to cairo 1.17.8

* schedule a regular Sunday Mass

* extra builds are now much cheaper

* reduce the number of debug builds

* drop the windows debug build with conan

* windows / pkgconf is not a supported build

* add the conan pkg-config name of openjpeg

* zstd should be expected

* add zstd pkgconfig name
  • Loading branch information
mmomtchev committed Apr 27, 2024
1 parent 849d5da commit 312cca2
Show file tree
Hide file tree
Showing 5 changed files with 151 additions and 87 deletions.
97 changes: 76 additions & 21 deletions .github/workflows/cmake-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,38 +2,88 @@ name: CMake portable build

on:
push:
branches: cmake-portable-build
branches:
- cmake-portable-build
- cmake-testing
schedule:
# schedule a regular Sunday Mass to check that
# everything still works
- cron: '30 12 * * 0'

concurrency:
group: cmake-${{ github.ref }}
cancel-in-progress: true


jobs:
native:

conan:

runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
os: [ubuntu-latest, macos-13, windows-latest]
libtype: [shared, static]
provider: [conan, system, pkgconf]
buildtype: [Release, Debug]
exclude:
- buildtype: Debug
os: macos-latest
libtype: shared
- buildtype: Debug
os: windows-latest
- provider: pkgconf
os: windows-latest
- buildtype: Debug
os: ubuntu-latest
provider: pkgconf
- buildtype: Debug
os: ubuntu-latest
libtype: static
provider: system

steps:
- uses: actions/checkout@v4
with:
sparse-checkout: conanfile.py
sparse-checkout-cone-mode: false

- name: Get conan
id : conan
uses: turtlebrowser/get-conan@main

- name: Cache conan artifacts
id: conan-artifacts
uses: actions/cache@v4
with:
path: ~/.conan2
key: ${{ runner.os }}-${{ matrix.libtype }}-${{ matrix.buildtype }}

- name: Restart from scratch every Sunday
run: rm -rf ~/.conan2
shell: bash
if: github.event_name == 'schedule'

- name: Install all delegates
run: |
conan profile detect || echo ok
conan install . -of build --build=missing -o libtype=${{ matrix.libtype }} --settings=build_type=${{ matrix.buildtype }}
echo 'CONAN_TOOLCHAIN=-DCMAKE_TOOLCHAIN_FILE="${{ github.workspace }}/build/conan_toolchain.cmake"' >> $GITHUB_ENV
shell: bash


native:

runs-on: ${{ matrix.os }}
# This build job is self-contained but it will run faster if
# the conan job has completed (ie all the artifacts are prebuilt)
needs: conan
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-13, windows-latest]
libtype: [shared, static]
provider: [conan, system, pkgconf]
buildtype: [Release, Debug]
zeroconf: [zeroconf, support]
exclude:
- buildtype: Debug
os: ubuntu-latest
libtype: shared
- buildtype: Debug
os: windows-latest
provider: conan

- os: windows-latest
provider: pkgconf

steps:
- name: Checkout
Expand All @@ -48,12 +98,12 @@ jobs:
uses: ilammy/msvc-dev-cmd@v1
if: runner.os == 'Windows' && matrix.provider != 'conan'

- name: Cache conan artifacts (conan/pkgconf)
- name: Restore conan artifacts from shared cache (conan/pkgconf)
id: conan-artifacts
uses: actions/cache@v4
uses: actions/cache/restore@v3
with:
path: ~/.conan2
key: ${{ matrix.provider }}-${{ runner.os }}-${{ matrix.libtype }}-${{ matrix.buildtype }}
key: ${{ runner.os }}-${{ matrix.libtype }}-${{ matrix.buildtype }}
if: matrix.provider == 'conan' || matrix.provider == 'pkgconf'

- name: Install all delegates (conan)
Expand Down Expand Up @@ -81,21 +131,26 @@ jobs:
if: matrix.libtype == 'static'
run: echo "LIBTYPE=-DMAGICK_BUILD_STATIC=ON" >> $GITHUB_ENV

- name: Set zero configuration
shell: bash
run: echo "ZERO_CONF=-DZERO_CONFIGURATION_SUPPORT=ON" >> $GITHUB_ENV
if: matrix.zeroconf == 'zeroconf'

- name: Set install prefix
shell: bash
run: echo "INSTALL_PREFIX=${{ github.workspace }}/install" >> $GITHUB_ENV

- name: Set expected delegates (conan/pkgconfig)
shell: bash
run: echo "EXPECTED_DELEGATES=bzlib cairo fftw fontconfig freetype heic jbig jng jp2 jpeg lcms lzma openexr png raw tiff webp xml zlib" >> $GITHUB_ENV
run: echo "EXPECTED_DELEGATES=bzlib cairo fftw fontconfig freetype heic jbig jng jp2 jpeg lcms lzma openexr png raw tiff webp xml zlib zstd" >> $GITHUB_ENV
if: matrix.provider == 'conan' || matrix.provider == 'pkgconf'

- name: Generate CMake build
shell: bash
run: |
mkdir -p build
cd build
cmake .. ${{ env.CONAN_TOOLCHAIN }} -DCMAKE_BUILD_TYPE=${{ matrix.buildtype }} ${{ env.LIBTYPE }} -DCMAKE_INSTALL_PREFIX="${{ env.INSTALL_PREFIX }}"
cmake .. ${{ env.CONAN_TOOLCHAIN }} -DCMAKE_BUILD_TYPE=${{ matrix.buildtype }} ${{ env.LIBTYPE }} -DCMAKE_INSTALL_PREFIX="${{ env.INSTALL_PREFIX }}" ${{ env.ZERO_CONF }}
- name: Build
run: cmake --build build --config ${{ matrix.buildtype }}
Expand Down
47 changes: 26 additions & 21 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -292,29 +292,33 @@ endif()
set(_FORTIFY_SOURCE FALSE)

####### PATHS #######
set(CODER_PATH "\"${CMAKE_INSTALL_PREFIX}/local/lib/ImageMagick-${MAGICK_MAJOR_VERSION}/modules-${MAGICK_ABI_SUFFIX}/coders\"")
set(CONFIGURE_RELATIVE_PATH "\"ImageMagick-${MAGICK_MAJOR_VERSION}\"")
set(CONFIGURE_PATH "\"${CMAKE_INSTALL_PREFIX}/\" ${CONFIGURE_RELATIVE_PATH}")
set(DOCUMENTATION_PATH "${CMAKE_INSTALL_PREFIX}/share/doc/ImageMagick-${MAGICK_MAJOR_VERSION}")
set(EXECUTABLE_PATH "\"${CMAKE_INSTALL_PREFIX}/bin\"")
set(CODER_PATH "${CMAKE_INSTALL_PREFIX}/local/lib/ImageMagick-${MAGICK_MAJOR_VERSION}/modules-${MAGICK_ABI_SUFFIX}/coders/")
set(CONFIGURE_RELATIVE_PATH "ImageMagick-${MAGICK_MAJOR_VERSION}")
set(CONFIGURE_PATH "${CMAKE_INSTALL_PREFIX}/etc/${CONFIGURE_RELATIVE_PATH}/")
set(DOCUMENTATION_PATH "${CMAKE_INSTALL_PREFIX}/share/doc/ImageMagick-${MAGICK_MAJOR_VERSION}/")
set(EXECUTABLE_PATH "${CMAKE_INSTALL_PREFIX}/bin/")
set(FILTER_DIRNAME "")
set(INCLUDEARCH_PATH "\"${CMAKE_INSTALL_PREFIX}/include\"")
set(INCLUDE_PATH "\"${CMAKE_INSTALL_PREFIX}/include\"")
set(INSTALLED_SUPPORT "")
set(LIBRARY_RELATIVE_PATH "\"ImageMagick-${MAGICK_MAJOR_VERSION}\"")
set(LIBRARY_PATH "\"${CMAKE_INSTALL_PREFIX}/ImageMagick-${MAGICK_MAJOR_VERSION}\"")
set(LIB_BIN_BASEDIRNAME "\"bin\"")
set(SHAREARCH_BASEDIRNAME "\"share\"")
set(SHAREARCH_DIRNAME "\"share\"")
set(SHARE_RELATIVE_PATH "\"ImageMagick-7\"")
set(SHARE_PATH "\"${CMAKE_INSTALL_PREFIX}/\" ${SHAREARCH_DIRNAME} \"/\" ${SHARE_RELATIVE_PATH}")
set(MODULES_BASEDIRNAME "\"modules\"")
set(MODULES_DIRNAME "\"modules\"")
set(INCLUDEARCH_PATH "${CMAKE_INSTALL_PREFIX}/include/")
set(INCLUDE_PATH "${CMAKE_INSTALL_PREFIX}/include/")
if(ZERO_CONFIGURATION_SUPPORT)
set(INSTALLED_SUPPORT "")
else()
set(INSTALLED_SUPPORT "1")
endif()
set(LIBRARY_RELATIVE_PATH "lib/ImageMagick-${MAGICK_MAJOR_VERSION}")
set(LIBRARY_PATH "${CMAKE_INSTALL_PREFIX}/${LIBRARY_RELATIVE_PATH}/")
set(LIB_BIN_BASEDIRNAME "bin")
set(SHAREARCH_BASEDIRNAME "share")
set(SHAREARCH_DIRNAME "share")
set(SHARE_RELATIVE_PATH "ImageMagick-7")
set(SHARE_PATH "${CMAKE_INSTALL_PREFIX}/${SHAREARCH_DIRNAME}/${SHARE_RELATIVE_PATH}/")
set(MODULES_BASEDIRNAME "modules")
set(MODULES_DIRNAME "modules")
set(LT_OBJDIR "")

# Set the default font search path
if(WIN32)
set(MAGICK_FONT_PATH "\"$ENV{WINDIR}\\FONTS\\\"")
set(MAGICK_FONT_PATH "$ENV{WINDIR}\\FONTS\\")
# Escape the path C way where '\' must be '\\' (regex and cmake also escapes '\' so to find one we need '\\\\')
string(REGEX REPLACE "\\\\" "\\\\\\\\" MAGICK_FONT_PATH ${MAGICK_FONT_PATH})
elseif(UNIX AND NOT APPLE)
Expand All @@ -328,8 +332,8 @@ magick_find_delegate(DELEGATE BZLIB_DELEGATE NAME BZip2 DEFAULT TRUE)
magick_find_delegate(DELEGATE LZMA_DELEGATE NAME LibLZMA DEFAULT TRUE)
magick_find_delegate(DELEGATE ZLIB_DELEGATE NAME ZLIB DEFAULT TRUE)
magick_find_delegate(DELEGATE ZIP_DELEGATE NAME ZIP DEFAULT TRUE TARGETS libzip::zip)
# TODO: Detect whether zstd is static or not
magick_find_delegate(DELEGATE ZSTD_DELEGATE NAME zstd DEFAULT TRUE TARGETS zstd::libzstd_static)
magick_find_delegate(DELEGATE ZSTD_DELEGATE NAME zstd DEFAULT TRUE
TARGETS zstd::libzstd_static PKGCONFIG libzstd)
magick_find_delegate(DELEGATE BROTLI_DELEGATE NAME brotli DEFAULT TRUE)
magick_find_delegate(DELEGATE FREETYPE_DELEGATE NAME Freetype DEFAULT TRUE)

Expand Down Expand Up @@ -384,7 +388,8 @@ endif()

magick_find_delegate(DELEGATE JBIG_DELEGATE NAME jbig DEFAULT TRUE)
magick_find_delegate(DELEGATE JPEG_DELEGATE NAME JPEG DEFAULT TRUE)
magick_find_delegate(DELEGATE LIBOPENJP2_DELEGATE NAME OpenJPEG DEFAULT TRUE TARGETS openjp2)
magick_find_delegate(DELEGATE LIBOPENJP2_DELEGATE NAME OpenJPEG DEFAULT TRUE
TARGETS openjp2 PKGCONFIG libopenjp2)
# OpenJPEG has an ancient CMake that wasn't fixed until 2.5
if(OPENJPEG_INCLUDE_DIRS)
list(APPEND IMAGEMAGICK_DELEGATES_INCLUDE_DIRS ${OPENJPEG_INCLUDE_DIRS})
Expand Down
55 changes: 28 additions & 27 deletions conanfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,59 +88,60 @@ def requirements(self):

# Fonts are not available on WASM targets
if self.options.fonts and self.settings.arch != 'wasm':
[self.requires(x) for x in ('libffi/3.4.4', 'fontconfig/2.14.2', 'freetype/2.13.2', 'fribidi/1.0.12', 'glib/2.78.1', 'harfbuzz/8.3.0')]
[self.requires(x, force=True) for x in
('libffi/3.4.4', 'fontconfig/2.14.2', 'freetype/2.13.2', 'fribidi/1.0.12', 'glib/2.78.1', 'harfbuzz/8.3.0')]

# LZMA for WASM is blocked by https://github.com/conan-io/conan-center-index/issues/20602
if self.options.lzma and self.settings.arch != 'wasm':
self.requires('lzma_sdk/9.20')
self.requires('lzma_sdk/9.20', force=True)

if self.options.bzip2:
self.requires('bzip2/1.0.8')
self.requires('bzip2/1.0.8', force=True)

if self.options.zstd:
self.requires('zstd/1.5.5')
self.requires('zstd/1.5.5', force=True)

if self.options.zip:
self.requires('libzip/1.9.2')
self.requires('libzip/1.9.2', force=True)

if self.options.brotli:
self.requires('brotli/1.1.0')
self.requires('brotli/1.1.0', force=True)

if self.options.xz:
self.requires('xz_utils/5.4.5')
self.requires('xz_utils/5.4.5', force=True)

if self.options.gzip:
self.requires('zlib/1.2.13')
self.requires('zlib/1.2.13', force=True)

if self.options.fftw:
self.requires('fftw/3.3.10')
self.requires('fftw/3.3.10', force=True)

if self.options.color:
self.requires('lcms/2.14')
self.requires('lcms/2.14', force=True)

if self.options.xml:
self.requires('libxml2/2.10.4')
self.requires('libxml2/2.10.4', force=True)

if self.options.openmedia:
self.requires('libaom-av1/3.6.0')
self.requires('libaom-av1/3.6.0', force=True)

if self.options.h265:
self.requires('libde265/1.0.12')
self.requires('libde265/1.0.12', force=True)

if self.options.heif:
self.requires('libheif/1.13.0')
self.requires('libheif/1.13.0', force=True)

if self.options.jbig:
self.requires('jbig/20160605')
self.requires('jbig/20160605', force=True)

if self.options.exr:
self.requires('openexr/3.1.5')
self.requires('openexr/3.1.5', force=True)

if self.options.png:
self.requires('libpng/1.6.42', force=True)

if self.options.webp:
self.requires('libwebp/1.3.2')
self.requires('libwebp/1.3.2', force=True)

if self.options.jpeg2000 or self.options.tiff or self.options.raw:
self.requires('libjpeg-turbo/3.0.2', force=True)
Expand All @@ -149,34 +150,34 @@ def requirements(self):
self.requires('jasper/4.2.0', force=True)

if self.options.tiff:
self.requires('libtiff/4.6.0')
self.requires('libtiff/4.6.0', force=True)

if self.options.raw:
self.requires('libraw/0.21.2')
self.requires('libraw/0.21.2', force=True)

if self.options.jpeg:
self.requires('openjpeg/2.5.0')
self.requires('openjpeg/2.5.0', force=True)

if self.options.cairo and self.settings.arch != 'wasm':
self.requires('cairo/1.18.0')
self.requires('expat/2.6.0', override=True)
self.requires('cairo/1.17.8', force=True)
self.requires('expat/2.6.0', force=True)

if self.options.simd and self.settings.arch != 'wasm':
self.requires('highway/1.0.3')
self.requires('highway/1.0.3', force=True)

if self.options.openmp and self.settings.arch != 'wasm' and self.settings.os != 'Windows':
self.requires('llvm-openmp/17.0.6')
self.requires('llvm-openmp/17.0.6', force=True)

if self.options.display and self.settings.arch != 'wasm':
self.requires('pixman/0.42.2')
self.requires('pixman/0.42.2', force=True)

# Although supported in theory, using jemalloc on Windows is very difficult especially
# with a generic build that supports options and shared/static builds
if self.options.jemalloc and self.settings.arch != 'wasm' and self.settings.os != 'Windows':
self.requires('jemalloc/5.3.0')
self.requires('jemalloc/5.3.0', force=True)

if self.options.opencl:
self.requires('opencl-headers/2023.12.14')
self.requires('opencl-headers/2023.12.14', force=True)

def configure(self):
if self.settings.arch != 'wasm' and self.options.fonts:
Expand Down

0 comments on commit 312cca2

Please sign in to comment.