Skip to content

Commit a85a799

Browse files
Martin KingMartin King
authored andcommitted
Update to handle fat builds
1 parent c3c1ccf commit a85a799

1 file changed

Lines changed: 61 additions & 28 deletions

File tree

3rdparty/png/CMakeLists.txt

Lines changed: 61 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -22,51 +22,84 @@ set(${target_name}_src
2222
pngwutil.c
2323
)
2424

25-
set(_PNG_ISA_SIMD ${AX_ISA_SIMD})
25+
add_library(${target_name} STATIC
26+
${${target_name}_src}
27+
)
28+
29+
# -----------------------------------------------------------------------------
30+
# macOS Universal Binary Logic (Fat Build)
31+
# -----------------------------------------------------------------------------
32+
if(APPLE AND CMAKE_SYSTEM_NAME STREQUAL "Darwin")
33+
# We rely on CMAKE_OSX_ARCHITECTURES being set by the user/system
34+
# (e.g., -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64") to control the output.
2635

27-
if(_PNG_ISA_SIMD STREQUAL "neon")
28-
set(libpng_arm_sources
36+
# --- NEON OBJECT LIBRARY (for arm64 slice) ---
37+
add_library(png_arm_neon OBJECT
2938
arm/arm_init.c
3039
arm/filter_neon_intrinsics.c
31-
arm/palette_neon_intrinsics.c)
32-
33-
# notes:
34-
# - android armv7: needs PNG_ARM_NEON_CHECK_SUPPORTED for very older devices, but axmol no longer support them
35-
# PNG_ARM_NEON_IMPLEMENTATION:
36-
# 1: use instrinsics
37-
# 2: use handcode
38-
set(libpng_optimize_flag "PNG_ARM_NEON_OPT=1")
39-
elseif(_PNG_ISA_SIMD MATCHES "sse")
40-
set(libpng_intel_sources
40+
arm/palette_neon_intrinsics.c
41+
)
42+
target_compile_definitions(png_arm_neon PRIVATE "PNG_ARM_NEON_OPT=1")
43+
44+
# Restrict compilation/use of these objects to the arm64 slice only
45+
set_target_properties(png_arm_neon PROPERTIES
46+
OSX_ARCHITECTURES "arm64"
47+
COMPILE_FLAGS "-march=armv8-a+simd"
48+
)
49+
50+
# --- SSE OBJECT LIBRARY (for x86_64 slice) ---
51+
add_library(png_intel_sse OBJECT
4152
intel/intel_init.c
42-
intel/filter_sse2_intrinsics.c)
43-
set(libpng_optimize_flag "PNG_INTEL_SSE_OPT=1")
53+
intel/filter_sse2_intrinsics.c
54+
)
55+
target_compile_definitions(png_intel_sse PRIVATE "PNG_INTEL_SSE_OPT=1")
56+
57+
# Restrict compilation/use of these objects to the x86_64 slice only
58+
set_target_properties(png_intel_sse PROPERTIES
59+
OSX_ARCHITECTURES "x86_64"
60+
COMPILE_FLAGS "-msse2"
61+
)
62+
63+
# Link object libraries into main library
64+
target_sources(${target_name} PRIVATE
65+
$<TARGET_OBJECTS:png_arm_neon>
66+
$<TARGET_OBJECTS:png_intel_sse>
67+
)
68+
69+
# -----------------------------------------------------------------------------
70+
# Non-Darwin Conditional SIMD Logic (Android, iOS, Windows, Linux)
71+
# -----------------------------------------------------------------------------
72+
else()
73+
set(_PNG_ISA_SIMD ${AX_ISA_SIMD})
74+
if(_PNG_ISA_SIMD STREQUAL "neon")
75+
target_sources(${target_name} PRIVATE
76+
arm/arm_init.c
77+
arm/filter_neon_intrinsics.c
78+
arm/palette_neon_intrinsics.c)
79+
target_compile_definitions(${target_name} PUBLIC "PNG_ARM_NEON_OPT=1")
80+
elseif(_PNG_ISA_SIMD MATCHES "sse")
81+
target_sources(${target_name} PRIVATE
82+
intel/intel_init.c
83+
intel/filter_sse2_intrinsics.c)
84+
target_compile_definitions(${target_name} PUBLIC "PNG_INTEL_SSE_OPT=1")
85+
endif()
4486
endif()
4587

46-
add_library(${target_name} STATIC
47-
${${target_name}_src}
48-
${libpng_arm_sources}
49-
${libpng_intel_sources}
50-
)
5188

52-
# cmake builtin FindPNG.cmake detect cached variable PNG_PNG_INCLUDE_DIR
5389
set(PNG_PNG_INCLUDE_DIR "${CMAKE_CURRENT_LIST_DIR}" CACHE INTERNAL "png include dir" FORCE)
54-
5590
set(PNG_INCLUDE_DIR "${PNG_PNG_INCLUDE_DIR}" CACHE INTERNAL "" FORCE)
5691
target_include_directories(${target_name} PUBLIC "${PNG_INCLUDE_DIR}")
5792

58-
if(_PNG_ISA_SIMD)
59-
target_compile_definitions(${target_name} PUBLIC ${libpng_optimize_flag})
60-
endif()
61-
6293
target_include_directories(${target_name} PRIVATE "${ZLIB_INCLUDE_DIR}")
6394

95+
# Android Specific Linking for CPU Features
6496
if(ANDROID)
6597
target_include_directories(${target_name} PRIVATE ${cpufeatures_include_dir})
6698
target_link_libraries(${target_name} INTERFACE cpufeatures)
6799
endif()
68100

69-
# Export png as PNG::PNG to avoid cmake builtin FindPNG.cmake add target again
101+
# Export png as PNG::PNG to avoid conflicts and enable modern linking
70102
add_library(PNG::PNG ALIAS ${target_name})
71103

72-
set(PNG_LIBRARY "png" CACHE INTERNAL "png include dir" FORCE)
104+
# Set compatibility variable
105+
set(PNG_LIBRARY "png" CACHE INTERNAL "png library" FORCE)

0 commit comments

Comments
 (0)