From 8837b95327e559dd34992827a79e80c73e4dfb84 Mon Sep 17 00:00:00 2001 From: Ioannis Tsakpinis Date: Sat, 5 Nov 2022 14:05:40 +0200 Subject: [PATCH] LWJGL configuration --- .github/workflows/lwjgl.yml | 264 ++++++++++++++++++++ lwjgl_linux_arm32.cross | 12 + lwjgl_linux_arm64.cross | 12 + lwjgl_linux_ppc64le.cross | 12 + lwjgl_linux_riscv64.cross | 12 + lwjgl_macos_arm64.cross | 21 ++ lwjgl_macos_x64.cross | 21 ++ lwjgl_windows_arm64.cross | 12 + meson.build | 30 ++- subprojects/harfbuzz.wrap | 10 +- subprojects/libpng.wrap | 4 +- subprojects/packagefiles/libpng/meson.build | 160 ++++++++++++ 12 files changed, 553 insertions(+), 17 deletions(-) create mode 100644 .github/workflows/lwjgl.yml create mode 100644 lwjgl_linux_arm32.cross create mode 100644 lwjgl_linux_arm64.cross create mode 100644 lwjgl_linux_ppc64le.cross create mode 100644 lwjgl_linux_riscv64.cross create mode 100644 lwjgl_macos_arm64.cross create mode 100644 lwjgl_macos_x64.cross create mode 100644 lwjgl_windows_arm64.cross create mode 100644 subprojects/packagefiles/libpng/meson.build diff --git a/.github/workflows/lwjgl.yml b/.github/workflows/lwjgl.yml new file mode 100644 index 000000000..30c05344f --- /dev/null +++ b/.github/workflows/lwjgl.yml @@ -0,0 +1,264 @@ +# IMPORTANT: after HEAD is updated, the "LWJGL" tag must be recreated! +name: LWJGL Build + +on: + workflow_dispatch: + push: + branches: + - master + +env: + AWS_DEFAULT_REGION: us-east-1 + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + S3_PARAMS: --cache-control "public,must-revalidate,proxy-revalidate,max-age=0" + FREETYPE_PARAMS: --wrap-mode=default --force-fallback-for=harfbuzz,libpng,zlib -Dbrotli=disabled -Dbzip2=disabled -Dharfbuzz=enabled -Dpng=enabled -Dzlib=system -Dtests=disabled -Dbuildtype=release -Dfreetype2:zlib=disabled -Dfreetype2:png=disabled -Dharfbuzz:experimental_api=true -Db_lto=true -Db_ndebug=true + +jobs: + linux: + name: Linux + runs-on: ubuntu-latest + container: + image: centos:7 + strategy: + fail-fast: false + matrix: + ARCH: [x64] + include: + - ARCH: x64 + defaults: + run: + shell: bash + steps: + - name: Upgrade git + run: | + yum -y install https://packages.endpointdev.com/rhel/7/os/x86_64/endpoint-repo.x86_64.rpm + yum -y install git + - uses: actions/checkout@v3 + with: + fetch-depth: 3 + - name: Configure yum + run: | + yum -y install epel-release + yum -y update + - name: Install build dependencies + run: | + yum -y install centos-release-scl + yum -y install devtoolset-11-gcc-c++ + yum -y install python3 awscli libpng-dev + - name: Install HarfBuzz dependencies + run: | + yum -y install ninja-build + pip3 install meson + - name: Configure build + run: | + source scl_source enable devtoolset-11 || true + meson setup build $FREETYPE_PARAMS + - name: Build + run: | + source scl_source enable devtoolset-11 || true + meson compile --verbose -C build + strip build/libfreetype.so + - name: Upload artifact + run: aws s3 cp build/libfreetype.so s3://lwjgl-build/nightly/linux/${{matrix.ARCH}}/ $S3_PARAMS + - name: Upload git revision + run: | + git config --global --add safe.directory $PWD + git log --first-parent --pretty=format:%H HEAD~2..HEAD~1 > libfreetype.so.git + aws s3 cp libfreetype.so.git s3://lwjgl-build/nightly/linux/${{matrix.ARCH}}/ $S3_PARAMS + + linux-cross: + name: Linux Cross + runs-on: ubuntu-latest + container: + image: ${{matrix.CONTAINER}} + strategy: + fail-fast: false + matrix: + ARCH: [arm32, arm64, ppc64le, riscv64] + include: + # ----- + - ARCH: arm32 + CROSS_ARCH: armhf + CONTAINER: ubuntu:18.04 + TRIPLET: arm-linux-gnueabihf + # ----- + - ARCH: arm64 + CROSS_ARCH: arm64 + CONTAINER: ubuntu:18.04 + TRIPLET: aarch64-linux-gnu + # ----- + - ARCH: ppc64le + CROSS_ARCH: ppc64el + CONTAINER: ubuntu:18.04 + TRIPLET: powerpc64le-linux-gnu + # ----- + - ARCH: riscv64 + CROSS_ARCH: riscv64 + CONTAINER: ubuntu:20.04 + TRIPLET: riscv64-linux-gnu + env: + LWJGL_ARCH: ${{matrix.ARCH}} + defaults: + run: + shell: bash + steps: + - name: Update apt repositories + run: | + apt-get -y update + apt-get -y install software-properties-common + apt-get -y install --reinstall ca-certificates + add-apt-repository -y ppa:git-core/ppa + if: ${{ matrix.CONTAINER == 'ubuntu:18.04' }} + - name: Upgrade git + run: | + apt-get -y update + apt-get -y upgrade + DEBIAN_FRONTEND=noninteractive apt-get -yq install awscli git ninja-build python3-pip + - uses: actions/checkout@v3 + with: + fetch-depth: 3 + - name: Install dependencies + run: DEBIAN_FRONTEND=noninteractive apt-get -yq install cmake gcc-${{matrix.TRIPLET}} g++-${{matrix.TRIPLET}} libc6-dev-${{matrix.CROSS_ARCH}}-cross + - name: Install meson + run: pip3 install meson + - name: Prepare cross-compilation for ${{matrix.CROSS_ARCH}} + run: | + sed -i 's/deb http/deb [arch=amd64,i386] http/' /etc/apt/sources.list + grep "ubuntu.com/ubuntu" /etc/apt/sources.list | tee /etc/apt/sources.list.d/ports.list + sed -i 's/amd64,i386/${{matrix.CROSS_ARCH}}/' /etc/apt/sources.list.d/ports.list + sed -i 's#http://.*/ubuntu#http://ports.ubuntu.com/ubuntu-ports#' /etc/apt/sources.list.d/ports.list + dpkg --add-architecture ${{matrix.CROSS_ARCH}} + apt-get update || true + - name: Configure build + run: meson setup build $FREETYPE_PARAMS --cross-file lwjgl_linux_${{matrix.ARCH}}.cross + - name: Build + run: | + meson compile --verbose -C build + ${{matrix.TRIPLET}}-strip build/libfreetype.so + - name: Upload artifact + run: aws s3 cp build/libfreetype.so s3://lwjgl-build/nightly/linux/${{matrix.ARCH}}/ $S3_PARAMS + - name: Upload git revision + run: | + git config --global --add safe.directory $(pwd) + git log --first-parent --pretty=format:%H HEAD~2..HEAD~1 > libfreetype.so.git + aws s3 cp libfreetype.so.git s3://lwjgl-build/nightly/linux/${{matrix.ARCH}}/ $S3_PARAMS + + freebsd-cross: + name: FreeBSD Cross + runs-on: ubuntu-latest + strategy: + fail-fast: false + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 3 + - name: Build + uses: cross-platform-actions/action@v0.24.0 + with: + operating_system: freebsd + architecture: x86-64 + version: '13.2' + memory: 4G + shell: bash + environment_variables: FREETYPE_PARAMS + run: | + sudo pkg install -y git python3 png ninja + python3 -m ensurepip --upgrade + export PATH=$PATH:/home/runner/.local/bin + pip3 install meson + meson setup build $FREETYPE_PARAMS + meson compile --verbose -C build + strip build/libfreetype.so + - name: Upload artifact # Symlinks are not copied out of the VM. These SOs are versioned. + #run: aws s3 cp `find -E . -maxdepth 2 -regex './build/libfreetype.so(\.[0-9]+)*'` s3://lwjgl-build/nightly/freebsd/x64/libfreetype.so $S3_PARAMS + run: aws s3 cp build/libfreetype.so s3://lwjgl-build/nightly/freebsd/x64/ $S3_PARAMS + - name: Upload git revision + run: | + git config --global --add safe.directory $PWD + git log --first-parent --pretty=format:%H HEAD~2..HEAD~1 > libfreetype.so.git + aws s3 cp libfreetype.so.git s3://lwjgl-build/nightly/freebsd/x64/ $S3_PARAMS + + macos: + name: macOS + runs-on: macos-latest + strategy: + fail-fast: false + matrix: + ARCH: [x64, arm64] + include: + - ARCH: x64 + MACOS: 10.11 + MESON_PARAMS: --cross-file lwjgl_macos_x64.cross + - ARCH: arm64 + MACOS: 11.0 + MESON_PARAMS: --cross-file lwjgl_macos_arm64.cross + env: + MACOSX_DEPLOYMENT_TARGET: 11.0 + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 3 + - name: Install dependencies + run: brew install meson + - name: Configure build + run: MACOSX_DEPLOYMENT_TARGET=${{matrix.MACOS}} meson setup build $FREETYPE_PARAMS -Dharfbuzz:coretext=enabled ${{matrix.MESON_PARAMS}} + - name: Build + run: | + MACOSX_DEPLOYMENT_TARGET=${{matrix.MACOS}} meson compile --verbose -C build + strip -u -r build/libfreetype.dylib + - name: Upload artifact + run: aws s3 cp build/libfreetype.dylib s3://lwjgl-build/nightly/macosx/${{matrix.ARCH}}/ $S3_PARAMS + - name: Upload git revision + run: | + git log --first-parent --pretty=format:%H HEAD~2..HEAD~1 > libfreetype.dylib.git + aws s3 cp libfreetype.dylib.git s3://lwjgl-build/nightly/macosx/${{matrix.ARCH}}/ $S3_PARAMS + + windows: + name: Windows + runs-on: windows-latest + strategy: + fail-fast: false + matrix: + ARCH: [x86, x64, arm64] + include: + - ARCH: x86 + MSVC_ARCH: amd64_x86 + PLATFORM: Win32 + MESON_PARAMS: + - ARCH: x64 + MSVC_ARCH: amd64 + PLATFORM: x64 + MESON_PARAMS: + - ARCH: arm64 + MSVC_ARCH: amd64_arm64 + PLATFORM: ARM64 + MESON_PARAMS: --cross-file lwjgl_windows_arm64.cross + defaults: + run: + shell: cmd + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 3 + - uses: ilammy/msvc-dev-cmd@v1 + with: + arch: ${{matrix.MSVC_ARCH}} + # Strawberry Perl is installed by default on the Windows runner, adding a bunch of horrible stuff to PATH. + # Including a freetype build... which Meson picks up. Just nuke it here and everything will be fine. + # See https://github.com/actions/runner-images/issues/5459 for details. We haven't encountered this before + # because Meson uses .a for static MSVC libraries, instead of the usual .lib suffix. + - name: Install dependencies + run: | + pip3 install meson + rmdir C:\Strawberry /s /q + - name: Configure build + run: meson setup build %FREETYPE_PARAMS% -Db_vscrt=mt -Dharfbuzz:gdi=enabled -Dharfbuzz:directwrite=enabled ${{matrix.MESON_PARAMS}} + - name: Build + run: meson compile --verbose -C build + - name: Upload artifact + run: aws s3 cp build\freetype-6.dll s3://lwjgl-build/nightly/windows/${{matrix.ARCH}}/freetype.dll %S3_PARAMS% + - name: Upload git revision + run: | + git log --first-parent --pretty=format:%%H HEAD~2..HEAD~1 > freetype.dll.git + aws s3 cp freetype.dll.git s3://lwjgl-build/nightly/windows/${{matrix.ARCH}}/ %S3_PARAMS% diff --git a/lwjgl_linux_arm32.cross b/lwjgl_linux_arm32.cross new file mode 100644 index 000000000..e563d9900 --- /dev/null +++ b/lwjgl_linux_arm32.cross @@ -0,0 +1,12 @@ +[host_machine] +system = 'linux' +cpu_family = 'arm' +cpu = 'armhf' +endian = 'little' + +[binaries] +c = '/usr/bin/arm-linux-gnueabihf-gcc' +cpp = '/usr/bin/arm-linux-gnueabihf-g++' +ar = '/usr/bin/arm-linux-gnueabihf-ar' +strip = '/usr/bin/arm-linux-gnueabihf-strip' +pkgconfig = '/usr/bin/arm-linux-gnueabihf-pkg-config' \ No newline at end of file diff --git a/lwjgl_linux_arm64.cross b/lwjgl_linux_arm64.cross new file mode 100644 index 000000000..4c612a4db --- /dev/null +++ b/lwjgl_linux_arm64.cross @@ -0,0 +1,12 @@ +[host_machine] +system = 'linux' +cpu_family = 'aarch64' +cpu = 'arm64' +endian = 'little' + +[binaries] +c = '/usr/bin/aarch64-linux-gnu-gcc' +cpp = '/usr/bin/aarch64-linux-gnu-g++' +ar = '/usr/bin/aarch64-linux-gnu-gcc-ar' +strip = '/usr/bin/aarch64-linux-gnu-strip' +pkgconfig = '/usr/bin/aarch64-linux-gnu-pkg-config' \ No newline at end of file diff --git a/lwjgl_linux_ppc64le.cross b/lwjgl_linux_ppc64le.cross new file mode 100644 index 000000000..f59543e29 --- /dev/null +++ b/lwjgl_linux_ppc64le.cross @@ -0,0 +1,12 @@ +[host_machine] +system = 'linux' +cpu_family = 'ppc64' +cpu = 'ppc64' +endian = 'little' + +[binaries] +c = '/usr/bin/powerpc64le-linux-gnu-gcc' +cpp = '/usr/bin/powerpc64le-linux-gnu-g++' +ar = '/usr/bin/powerpc64le-linux-gnu-gcc-ar' +strip = '/usr/bin/powerpc64le-linux-gnu-strip' +pkgconfig = '/usr/bin/powerpc64le-linux-gnu-pkg-config' \ No newline at end of file diff --git a/lwjgl_linux_riscv64.cross b/lwjgl_linux_riscv64.cross new file mode 100644 index 000000000..f1af6fc1e --- /dev/null +++ b/lwjgl_linux_riscv64.cross @@ -0,0 +1,12 @@ +[host_machine] +system = 'linux' +cpu_family = 'riscv64' +cpu = 'riscv64' +endian = 'little' + +[binaries] +c = '/usr/bin/riscv64-linux-gnu-gcc' +cpp = '/usr/bin/riscv64-linux-gnu-g++' +ar = '/usr/bin/riscv64-linux-gnu-gcc-ar' +strip = '/usr/bin/riscv64-linux-gnu-strip' +pkgconfig = '/usr/bin/riscv64-linux-gnu-pkg-config' \ No newline at end of file diff --git a/lwjgl_macos_arm64.cross b/lwjgl_macos_arm64.cross new file mode 100644 index 000000000..9910546f9 --- /dev/null +++ b/lwjgl_macos_arm64.cross @@ -0,0 +1,21 @@ +[host_machine] +system = 'darwin' +cpu_family = 'aarch64' +cpu = 'arm64' +endian = 'little' + +[binaries] +c = ['clang'] +cpp = ['clang++'] +objc = ['clang'] +objcpp = ['clang++'] + +[built-in options] +c_args = ['-target', 'aarch64-apple-darwin', '-arch', 'arm64'] +cpp_args = ['-target', 'aarch64-apple-darwin', '-arch', 'arm64'] +objc_args = ['-target', 'aarch64-apple-darwin', '-arch', 'arm64'] +objcpp_args = ['-target', 'aarch64-apple-darwin', '-arch', 'arm64'] +c_link_args = ['-target', 'aarch64-apple-darwin', '-arch', 'arm64'] +cpp_link_args = ['-target', 'aarch64-apple-darwin', '-arch', 'arm64'] +objc_link_args = ['-target', 'aarch64-apple-darwin', '-arch', 'arm64'] +objcpp_link_args = ['-target', 'aarch64-apple-darwin', '-arch', 'arm64'] \ No newline at end of file diff --git a/lwjgl_macos_x64.cross b/lwjgl_macos_x64.cross new file mode 100644 index 000000000..4ff6a1a09 --- /dev/null +++ b/lwjgl_macos_x64.cross @@ -0,0 +1,21 @@ +[host_machine] +system = 'darwin' +cpu_family = 'x86_64' +cpu = 'x64' +endian = 'little' + +[binaries] +c = ['clang'] +cpp = ['clang++'] +objc = ['clang'] +objcpp = ['clang++'] + +[built-in options] +c_args = ['-target', 'x64-apple-darwin', '-arch', 'x86_64'] +cpp_args = ['-target', 'x64-apple-darwin', '-arch', 'x86_64'] +objc_args = ['-target', 'x64-apple-darwin', '-arch', 'x86_64'] +objcpp_args = ['-target', 'x64-apple-darwin', '-arch', 'x86_64'] +c_link_args = ['-target', 'x64-apple-darwin', '-arch', 'x86_64'] +cpp_link_args = ['-target', 'x64-apple-darwin', '-arch', 'x86_64'] +objc_link_args = ['-target', 'x64-apple-darwin', '-arch', 'x86_64'] +objcpp_link_args = ['-target', 'x64-apple-darwin', '-arch', 'x86_64'] \ No newline at end of file diff --git a/lwjgl_windows_arm64.cross b/lwjgl_windows_arm64.cross new file mode 100644 index 000000000..e7e5939aa --- /dev/null +++ b/lwjgl_windows_arm64.cross @@ -0,0 +1,12 @@ +[host_machine] +system = 'windows' +cpu_family = 'aarch64' +cpu = 'armv8' +endian = 'little' + +[binaries] +c = 'cl' +cpp = 'cl' +fc = 'false' +ar = 'lib' +windres = 'rc' \ No newline at end of file diff --git a/meson.build b/meson.build index 18d812499..411aae43d 100644 --- a/meson.build +++ b/meson.build @@ -24,7 +24,7 @@ # project('freetype2', 'c', - meson_version: '>= 0.55.0', + meson_version: '>= 0.56.0', version: run_command('builds/meson/extract_freetype_version.py', 'include/freetype/freetype.h', check: true).stdout().strip(), @@ -304,7 +304,8 @@ elif zlib_option == 'external' ft2_deps += [zlib_dep] elif zlib_option == 'system' zlib_dep = dependency('zlib', - required: true) + required: true, + static: true) assert(zlib_dep.found(), 'Could not find system zlib installation!') ftoption_command += [ '--enable=FT_CONFIG_OPTION_USE_ZLIB', @@ -330,7 +331,8 @@ endif # PNG support libpng_dep = dependency('libpng', required: get_option('png'), - fallback: 'libpng') + fallback: 'libpng', + static: true) if libpng_dep.found() ftoption_command += ['--enable=FT_CONFIG_OPTION_USE_PNG'] @@ -338,10 +340,22 @@ if libpng_dep.found() endif # Harfbuzz support -harfbuzz_dep = dependency('harfbuzz', - version: '>= 2.0.0', - required: get_option('harfbuzz'), - default_options: ['freetype=disabled']) +if meson.current_build_dir().contains('subprojects') + # LWJGL: Not used in this case, first freetype is built without harfbuzz + harfbuzz_dep = dependency('harfbuzz', + version: '>= 2.0.0', + required: get_option('harfbuzz'), + static: true, + default_options: ['freetype=disabled', 'tests=disabled', 'benchmark=disabled', 'docs=disabled'] + ) +else + # LWJGL: This is a workaround to create an "internal" meson dependency, which is the only one + # that supports as_link_whole. We need that to keep all HarfBuzz functions. + harfbuzz_project = subproject('harfbuzz', + required: true, + default_options: ['default_library=static', 'freetype=enabled', 'tests=disabled', 'benchmark=disabled', 'docs=disabled']) + harfbuzz_dep = harfbuzz_project.get_variable('libharfbuzz_dep').as_link_whole() +endif if harfbuzz_dep.found() ftoption_command += ['--enable=FT_CONFIG_OPTION_USE_HARFBUZZ'] @@ -415,7 +429,7 @@ freetype_dep = declare_dependency( link_with: ft2_lib, version: ft2_pkgconfig_version) -meson.override_dependency('freetype2', freetype_dep) +#meson.override_dependency('freetype2', freetype_dep) # NOTE: Using both `install_dir` and `subdir` doesn't seem to work below, diff --git a/subprojects/harfbuzz.wrap b/subprojects/harfbuzz.wrap index 341be634e..094935ce8 100644 --- a/subprojects/harfbuzz.wrap +++ b/subprojects/harfbuzz.wrap @@ -1,9 +1,7 @@ -[wrap-file] -directory = harfbuzz-5.2.0 -source_url = https://github.com/harfbuzz/harfbuzz/releases/download/5.2.0/harfbuzz-5.2.0.tar.xz -source_filename = harfbuzz-5.2.0.tar.xz -source_hash = 735a94917b47936575acb4d4fa7e7986522f8a89527e4635721474dee2bc942c -wrapdb_version = 5.2.0-1 +[wrap-git] +directory=harfbuzz +url=https://github.com/LWJGL-CI/harfbuzz.git +revision=LWJGL [provide] harfbuzz = libharfbuzz_dep diff --git a/subprojects/libpng.wrap b/subprojects/libpng.wrap index eb0785d9d..725d0c06d 100644 --- a/subprojects/libpng.wrap +++ b/subprojects/libpng.wrap @@ -3,9 +3,7 @@ directory = libpng-1.6.40 source_url = https://github.com/glennrp/libpng/archive/v1.6.40.tar.gz source_filename = libpng-1.6.40.tar.gz source_hash = 62d25af25e636454b005c93cae51ddcd5383c40fa14aa3dae8f6576feb5692c2 -patch_filename = libpng_1.6.40-1_patch.zip -patch_url = https://wrapdb.mesonbuild.com/v2/libpng_1.6.40-1/get_patch -patch_hash = bad558070e0a82faa5c0ae553bcd12d49021fc4b628f232a8e58c3fbd281aae1 +patch_directory = libpng source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/libpng_1.6.40-1/libpng-1.6.40.tar.gz wrapdb_version = 1.6.40-1 diff --git a/subprojects/packagefiles/libpng/meson.build b/subprojects/packagefiles/libpng/meson.build new file mode 100644 index 000000000..c99c985aa --- /dev/null +++ b/subprojects/packagefiles/libpng/meson.build @@ -0,0 +1,160 @@ +project( + 'libpng', + 'c', + version: '1.6.40', license: 'libpng', + meson_version: '>=0.50.0', +) + +png_versions = meson.project_version().split('.') +png_major_version = png_versions[0] +png_minor_version = png_versions[1] +png_micro_version = png_versions[2] +png_libname = 'png@0@@1@'.format(png_major_version, png_minor_version) +png_libversion = '@0@@1@.@2@.0'.format(png_major_version, png_minor_version, png_micro_version) + +cc = meson.get_compiler('c') + +include = include_directories('.') + +c_args = [] + +if host_machine.system() == 'windows' + add_project_arguments( + '-D_CRT_NONSTDC_NO_DEPRECATE', + '-D_CRT_SECURE_NO_DEPRECATE', + language : 'c' + ) + if get_option('default_library') != 'static' + c_args += '-DPNG_BUILD_DLL' + endif +endif + +libpng_deps = [ + dependency('zlib'), + cc.find_library('m', required: false), +] + +png_src = files( + 'png.c', + 'pngerror.c', + 'pngget.c', + 'pngmem.c', + 'pngpread.c', + 'pngread.c', + 'pngrio.c', + 'pngrtran.c', + 'pngrutil.c', + 'pngset.c', + 'pngtrans.c', + 'pngwio.c', + 'pngwrite.c', + 'pngwtran.c', + 'pngwutil.c', +) + + +if host_machine.cpu_family() == 'aarch64' or cc.get_define('__ARM_NEON').strip() != '' + png_src += files( + 'arm/arm_init.c', + 'arm/filter_neon_intrinsics.c', + 'arm/palette_neon_intrinsics.c', + ) + if cc.get_id() == 'msvc' + cl = find_program('cl') + msvc_preprocessed_asm_files = custom_target( + 'MSVC assembly preprocessing', + output: '@BASENAME@.i', + input: 'arm/filter_neon.S', + command: [cl, '/Fi@OUTPUT@', '/P', '@INPUT@', '-I@OUTDIR@', c_args], + ) + msvc_armasm = find_program('armasm64') + png_src += custom_target( + 'MSVC assembly compilation', + output: '@BASENAME@.obj', + input: msvc_preprocessed_asm_files, + command: [msvc_armasm, '@INPUT@', '/Fo@OUTPUT@', '-I@OUTDIR@'], + ) + else + png_src += files('arm/filter_neon.S') + endif + + c_args += '-DPNG_ARM_NEON_OPT=2' +elif host_machine.cpu_family() in ['x86', 'x86_64'] + png_src += files( + 'intel/filter_sse2_intrinsics.c', + 'intel/intel_init.c', + ) + c_args += '-DPNG_INTEL_SSE_OPT=1' +# LWJGL: added ppc64 support +elif host_machine.cpu_family() in ['ppc64'] + png_src += files( + 'powerpc/filter_vsx_intrinsics.c', + 'powerpc/powerpc_init.c', + ) + c_args += '-DPNG_POWERPC_VSX_OPT=2' +endif + +libpng = library( + png_libname, + png_src, + version: png_libversion, + dependencies: libpng_deps, + c_args: c_args, + install: true, +) + +pngincsubdir = 'lib' + png_libname +pngincludedir = get_option('includedir') / pngincsubdir + +pkglibconf = configure_file( + input: 'scripts/pnglibconf.h.prebuilt', + output: 'pnglibconf.h', + copy: true, +) + +install_headers( + 'png.h', + 'pngconf.h', + pkglibconf, + subdir: pngincsubdir, +) + +cdata = configuration_data() +cdata.set('prefix', get_option('prefix')) +cdata.set('exec_prefix', get_option('prefix')) +cdata.set('libdir', '${prefix}/' + get_option('libdir')) +cdata.set('includedir', '${prefix}/' + get_option('includedir')) +cdata.set('PNGLIB_MAJOR', png_major_version) +cdata.set('PNGLIB_MINOR', png_minor_version) +cdata.set('PNGLIB_VERSION', meson.project_version()) +# FIXME: should auto-generate pkg-config file to get this right +cdata.set('LIBS', '-lz') + +configure_file( + input: 'libpng.pc.in', + output: 'libpng16.pc', + configuration: cdata, + install_dir: get_option('libdir') / 'pkgconfig', + install: true, +) + +# FIXME: this should be a symlink to libpng16.pc +configure_file( + input: 'libpng.pc.in', + output: 'libpng.pc', + configuration: cdata, + install_dir: get_option('libdir') / 'pkgconfig', + install: true, +) + +libpng_dep = declare_dependency( + include_directories: include, + link_with: libpng, + dependencies: libpng_deps, +) +# Keep the older dependency name for backwards-compat with old-style +# dependency(..., fallback ['libpng': 'png_dep']) +png_dep = libpng_dep + +png_test = executable('pngtest', 'pngtest.c', dependencies: libpng_dep) +test('pngtest', png_test, args: files('pngtest.png'))