image_optim_pack 0.13.1-aarch64-linux

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. checksums.yaml +7 -0
  2. data/.dockerignore +10 -0
  3. data/.github/dependabot.yml +8 -0
  4. data/.github/workflows/build.yml +67 -0
  5. data/.github/workflows/check.yml +34 -0
  6. data/.github/workflows/docker-build.yml +29 -0
  7. data/.github/workflows/livecheck.yml +35 -0
  8. data/.github/workflows/rubocop.yml +16 -0
  9. data/.gitignore +7 -0
  10. data/.rubocop.yml +100 -0
  11. data/CHANGELOG.markdown +629 -0
  12. data/Dockerfile +184 -0
  13. data/Dockerfile.debian +190 -0
  14. data/Gemfile +14 -0
  15. data/LICENSE.txt +27 -0
  16. data/Makefile +572 -0
  17. data/README.markdown +120 -0
  18. data/acknowledgements/7z.txt +56 -0
  19. data/acknowledgements/advancecomp.txt +674 -0
  20. data/acknowledgements/bmp2png.txt +8 -0
  21. data/acknowledgements/cexcept.txt +8 -0
  22. data/acknowledgements/gifread.txt +14 -0
  23. data/acknowledgements/gifsicle.txt +343 -0
  24. data/acknowledgements/iqa.txt +30 -0
  25. data/acknowledgements/jhead.txt +12 -0
  26. data/acknowledgements/jpeg-archive.txt +20 -0
  27. data/acknowledgements/jpegoptim.txt +339 -0
  28. data/acknowledgements/libjpeg-turbo.txt +27 -0
  29. data/acknowledgements/libjpeg-x86-simd.txt +17 -0
  30. data/acknowledgements/libjpeg.txt +64 -0
  31. data/acknowledgements/liblcms2.txt +21 -0
  32. data/acknowledgements/libpng.txt +90 -0
  33. data/acknowledgements/mozjpeg.txt +7 -0
  34. data/acknowledgements/optipng-authors.txt +26 -0
  35. data/acknowledgements/optipng.txt +21 -0
  36. data/acknowledgements/oxipng.txt +20 -0
  37. data/acknowledgements/pngcrush.txt +35 -0
  38. data/acknowledgements/pngout.txt +9 -0
  39. data/acknowledgements/pngquant.txt +56 -0
  40. data/acknowledgements/smallfry.txt +13 -0
  41. data/acknowledgements/zlib.txt +34 -0
  42. data/acknowledgements/zopfli-contributors.txt +6 -0
  43. data/acknowledgements/zopfli.txt +201 -0
  44. data/checksums.mk +17 -0
  45. data/image_optim_pack-darwin-arm64.gemspec +3 -0
  46. data/image_optim_pack-darwin-x86_64.gemspec +3 -0
  47. data/image_optim_pack-linux-aarch64-gnu.gemspec +3 -0
  48. data/image_optim_pack-linux-aarch64-musl.gemspec +3 -0
  49. data/image_optim_pack-linux-aarch64.gemspec +3 -0
  50. data/image_optim_pack-linux-x86_64-gnu.gemspec +3 -0
  51. data/image_optim_pack-linux-x86_64-musl.gemspec +3 -0
  52. data/image_optim_pack-linux-x86_64.gemspec +3 -0
  53. data/image_optim_pack.gemspec +70 -0
  54. data/lib/image_optim/pack.rb +136 -0
  55. data/lib/image_optim_pack.rb +3 -0
  56. data/patches/pngcrush.patch +15 -0
  57. data/script/extract +19 -0
  58. data/script/livecheck +263 -0
  59. data/script/platform_downloads +63 -0
  60. data/script/run +167 -0
  61. data/spec/image_optim/pack_spec.rb +122 -0
  62. data/spec/image_optim_spec.rb +42 -0
  63. data/spec/spec_helper.rb +10 -0
  64. data/vendor/linux-aarch64-gnu/advpng +0 -0
  65. data/vendor/linux-aarch64-gnu/gifsicle +0 -0
  66. data/vendor/linux-aarch64-gnu/jhead +0 -0
  67. data/vendor/linux-aarch64-gnu/jpeg-recompress +0 -0
  68. data/vendor/linux-aarch64-gnu/jpegoptim +0 -0
  69. data/vendor/linux-aarch64-gnu/jpegtran +0 -0
  70. data/vendor/linux-aarch64-gnu/libjpeg.so +0 -0
  71. data/vendor/linux-aarch64-gnu/liblcms2.so +0 -0
  72. data/vendor/linux-aarch64-gnu/libpng.so +0 -0
  73. data/vendor/linux-aarch64-gnu/libz.so +0 -0
  74. data/vendor/linux-aarch64-gnu/optipng +0 -0
  75. data/vendor/linux-aarch64-gnu/oxipng +0 -0
  76. data/vendor/linux-aarch64-gnu/pngcrush +0 -0
  77. data/vendor/linux-aarch64-gnu/pngout +0 -0
  78. data/vendor/linux-aarch64-gnu/pngquant +0 -0
  79. data/vendor/linux-aarch64-musl/advpng +0 -0
  80. data/vendor/linux-aarch64-musl/gifsicle +0 -0
  81. data/vendor/linux-aarch64-musl/jhead +0 -0
  82. data/vendor/linux-aarch64-musl/jpeg-recompress +0 -0
  83. data/vendor/linux-aarch64-musl/jpegoptim +0 -0
  84. data/vendor/linux-aarch64-musl/jpegtran +0 -0
  85. data/vendor/linux-aarch64-musl/libjpeg.so +0 -0
  86. data/vendor/linux-aarch64-musl/liblcms2.so +0 -0
  87. data/vendor/linux-aarch64-musl/libpng.so +0 -0
  88. data/vendor/linux-aarch64-musl/libz.so +0 -0
  89. data/vendor/linux-aarch64-musl/optipng +0 -0
  90. data/vendor/linux-aarch64-musl/oxipng +0 -0
  91. data/vendor/linux-aarch64-musl/pngcrush +0 -0
  92. data/vendor/linux-aarch64-musl/pngout +0 -0
  93. data/vendor/linux-aarch64-musl/pngquant +0 -0
  94. metadata +219 -0
data/Makefile ADDED
@@ -0,0 +1,572 @@
1
+ all :
2
+
3
+ ORIGINAL_VARIABLES := $(.VARIABLES)
4
+ print-variables :
5
+ $(foreach v, $(sort $(filter-out $(ORIGINAL_VARIABLES) ORIGINAL_VARIABLES,$(.VARIABLES))), $(info $(v) = $($(v))))
6
+ .PHONY : print-variables
7
+
8
+ # ====== VERSIONS ======
9
+
10
+ ADVANCECOMP_VER := 2.6
11
+ GIFSICLE_VER := 1.96
12
+ JHEAD_VER := 3.08
13
+ JPEGARCHIVE_VER := 2.2.0
14
+ JPEGOPTIM_VER := 1.5.6
15
+ LIBJPEG_VER := 9f
16
+ LIBLCMS2_VER := 2.17
17
+ LIBMOZJPEG_VER := 4.1.5
18
+ LIBPNG_VER := 1.6.57
19
+ LIBZ_VER := 1.3.2
20
+ OPTIPNG_VER := 7.9.1
21
+ OXIPNG_VER := 10.1.0
22
+ PNGCRUSH_VER := 1.8.13
23
+ PNGOUT_VER = $(if $(IS_DARWIN),$(PNGOUT_DARWIN_VER),$(PNGOUT_LINUX_VER))
24
+ PNGOUT_LINUX_VER := 20200115
25
+ PNGOUT_LINUX_STATIC_VER := $(PNGOUT_LINUX_VER)
26
+ PNGOUT_DARWIN_VER := 20230322
27
+ PNGQUANT_VER := 3.0.3
28
+
29
+ # ====== CHECKSUMS ======
30
+
31
+ include checksums.mk
32
+
33
+ # ====== CONSTANTS ======
34
+
35
+ OS := $(shell uname -s | tr A-Z a-z)
36
+ HOST_ARCH := $(shell uname -m)
37
+ ARCH := $(HOST_ARCH)
38
+
39
+ IS_DARWIN := $(findstring darwin,$(OS))
40
+ IS_LINUX := $(findstring linux,$(OS))
41
+ IS_BSD := $(findstring bsd,$(OS))
42
+ IS_FREEBSD := $(findstring freebsd,$(OS))
43
+ IS_OPENBSD := $(findstring openbsd,$(OS))
44
+
45
+ IS_LINUX_MUSL := $(findstring linux-musl,$(shell gcc -dumpmachine))
46
+
47
+ DLEXT := $(if $(IS_DARWIN),.dylib,.so)
48
+ HOST := $(ARCH:arm64=arm)-$(if $(IS_DARWIN),apple,pc)-$(OS)
49
+ LIBC_SUFFIX := $(if $(IS_DARWIN),,$(if $(IS_LINUX_MUSL),-musl,-gnu))
50
+ RUST_HOST := $(ARCH:arm64=aarch64)-$(if $(IS_DARWIN),apple-darwin,unknown-linux$(LIBC_SUFFIX))
51
+
52
+ DL_DIR := $(CURDIR)/download
53
+ BUILD_ROOT_DIR := $(CURDIR)/build
54
+ BUILD_DIR := $(BUILD_ROOT_DIR)/$(OS)-$(ARCH)$(LIBC_SUFFIX)
55
+ OUTPUT_ROOT_DIR := $(CURDIR)/vendor
56
+ OUTPUT_DIR := $(OUTPUT_ROOT_DIR)/$(OS)-$(ARCH)$(LIBC_SUFFIX)
57
+ PATCHES_DIR := $(CURDIR)/patches
58
+
59
+ export CARGO_HOME := $(DL_DIR)/cargo
60
+
61
+ ANSI_RED=\033[31m
62
+ ANSI_GREEN=\033[32m
63
+ ANSI_MAGENTA=\033[35m
64
+ ANSI_RESET=\033[0m
65
+
66
+ # ====== HELPERS ======
67
+
68
+ downcase = $(shell echo $1 | tr A-Z a-z)
69
+
70
+ tar := $(shell if command -v bsdtar >/dev/null 2>&1; then echo bsdtar; else echo tar; fi)
71
+ sha256sum := $(shell \
72
+ empty_sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855; \
73
+ for cmd in sha256sum "shasum -a 256" gsha256sum sha256; do \
74
+ if echo "$$empty_sha256 /dev/null" | $$cmd -c >/dev/null 2>&1; then \
75
+ echo "$$cmd"; \
76
+ exit 0; \
77
+ fi; \
78
+ done; \
79
+ echo false)
80
+
81
+ # ====== ARCHIVES ======
82
+
83
+ ARCHIVES :=
84
+
85
+ # $1 - name of archive
86
+ # $2 - extension to use (instead of default tar.gz)
87
+ define archive
88
+ ARCHIVES += $1
89
+ $1_DIR := $(BUILD_DIR)/$(call downcase,$1)
90
+ $1_ARC := $(DL_DIR)/$(call downcase,$1)-$($1_VER).$(or $2,tar.gz)
91
+ $1_EXTRACTED := $$($1_DIR)/__$$(notdir $$($1_ARC))__
92
+ $$($1_EXTRACTED) : $$($1_ARC)
93
+ mkdir -p $(BUILD_DIR)
94
+ rm -rf $$(@D)
95
+ echo "$$($1_SHA256) $$<" | $(sha256sum) -c
96
+ mkdir $$(@D)
97
+ $(tar) -C $$(@D) --strip-components=1 -xzf $$<
98
+ touch $$(@D)/__$$(notdir $$<)__
99
+ endef
100
+
101
+ # $1 - name of archive
102
+ # $2 - url of archive with [VER] for replace with version
103
+ # $3 - extension to use
104
+ define archive-dl
105
+ $(call archive,$1,$3)
106
+ # download archive from url
107
+ $$($1_ARC) :
108
+ mkdir -p $(DL_DIR)
109
+ test -w $(DL_DIR)
110
+ tmpfile=`mktemp "$$@.XXXXXXXXXX"` && \
111
+ wget -O "$$$$tmpfile" --no-use-server-timestamps "$(subst [VER],$($1_VER),$(strip $2))" && \
112
+ chmod 644 "$$$$tmpfile" && \
113
+ mv "$$$$tmpfile" "$$@"
114
+ endef
115
+
116
+ $(eval $(call archive-dl,ADVANCECOMP, https://github.com/amadvance/advancecomp/releases/download/v[VER]/advancecomp-[VER].tar.gz))
117
+ $(eval $(call archive-dl,GIFSICLE, https://www.lcdf.org/gifsicle/gifsicle-[VER].tar.gz))
118
+ $(eval $(call archive-dl,JHEAD, https://github.com/Matthias-Wandel/jhead/archive/[VER].tar.gz))
119
+ $(eval $(call archive-dl,JPEGARCHIVE, https://github.com/danielgtaylor/jpeg-archive/archive/v[VER].tar.gz))
120
+ $(eval $(call archive-dl,JPEGOPTIM, https://github.com/tjko/jpegoptim/archive/v[VER].tar.gz))
121
+ $(eval $(call archive-dl,LIBJPEG, https://www.ijg.org/files/jpegsrc.v[VER].tar.gz))
122
+ $(eval $(call archive-dl,LIBLCMS2, https://prdownloads.sourceforge.net/lcms/lcms2-[VER].tar.gz?download))
123
+ $(eval $(call archive-dl,LIBMOZJPEG, https://github.com/mozilla/mozjpeg/archive/v[VER].tar.gz))
124
+ $(eval $(call archive-dl,LIBPNG, https://prdownloads.sourceforge.net/libpng/libpng-[VER].tar.gz?download))
125
+ $(eval $(call archive-dl,LIBZ, https://github.com/madler/zlib/archive/v[VER].tar.gz))
126
+ $(eval $(call archive-dl,OPTIPNG, https://prdownloads.sourceforge.net/optipng/optipng-[VER].tar.gz?download))
127
+ $(eval $(call archive-dl,OXIPNG, https://github.com/oxipng/oxipng/archive/v[VER].tar.gz))
128
+ $(eval $(call archive-dl,PNGCRUSH, https://prdownloads.sourceforge.net/pmt/pngcrush-[VER]-nolib.tar.gz?download))
129
+ $(eval $(call archive-dl,PNGOUT_LINUX,https://www.jonof.id.au/files/kenutils/pngout-[VER]-linux.tar.gz))
130
+ $(eval $(call archive-dl,PNGOUT_LINUX_STATIC,https://www.jonof.id.au/files/kenutils/pngout-[VER]-linux-static.tar.gz))
131
+ $(eval $(call archive-dl,PNGOUT_DARWIN,https://www.jonof.id.au/files/kenutils/pngout-[VER]-mac.zip,zip))
132
+ $(eval $(call archive-dl,PNGQUANT, https://crates.io/api/v1/crates/pngquant/[VER]/download))
133
+
134
+ download : $(foreach archive,$(ARCHIVES),$($(archive)_ARC))
135
+ .PHONY : download
136
+
137
+ download-dependencies : $(OXIPNG_EXTRACTED) $(PNGQUANT_EXTRACTED)
138
+ cd $(OXIPNG_DIR) && cargo fetch --locked
139
+ cd $(PNGQUANT_DIR) && cargo fetch --locked
140
+ .PHONY : download-dependencies
141
+
142
+ download-tidy-up :
143
+ rm -f $(filter-out $(foreach archive,$(ARCHIVES),$($(archive)_ARC)),$(wildcard $(DL_DIR)/*.*))
144
+ .PHONY : download-tidy-up
145
+
146
+ checksum : download
147
+ @$(sha256sum) $(foreach archive,$(ARCHIVES),$($(archive)_ARC))
148
+ .PHONY : checksum
149
+
150
+ checksum-verify : download
151
+ @printf '%s %s\n' $(foreach archive,$(ARCHIVES),$($(archive)_SHA256) $($(archive)_ARC)) | $(sha256sum) -c
152
+ .PHONY : checksum-verify
153
+
154
+ checksum-update : download
155
+ @printf '%s := %s\n' $(foreach archive,$(ARCHIVES),$(archive)_SHA256 $(shell $(sha256sum) $($(archive)_ARC) | cut -d ' ' -f 1)) > checksums.mk
156
+ .PHONY : checksum-update
157
+
158
+ # ====== PRODUCTS ======
159
+
160
+ PRODUCTS :=
161
+
162
+ # $1 - product name
163
+ # $2 - archive name ($1 if empty)
164
+ # $3 - path ($1 if empty)
165
+ define target-build
166
+ $1_PATH := $(or $3,$(call downcase,$1))
167
+ $1_BASENAME := $$(notdir $$($1_PATH))
168
+ $1_DIR := $($(or $2,$1)_DIR)
169
+ $1_ARC := $($(or $2,$1)_ARC)
170
+ $1_EXTRACTED := $($(or $2,$1)_EXTRACTED)
171
+ $1_TARGET := $$($1_DIR)/$$($1_PATH)
172
+ $$($1_TARGET) : DIR := $$($1_DIR)
173
+ $$($1_TARGET) : $$($1_EXTRACTED)
174
+ endef
175
+
176
+ # $1 - product name
177
+ # $2 - archive name ($1 if empty)
178
+ # $3 - basename ($1 if empty)
179
+ # $4 - don't strip the target
180
+ define target
181
+ $(call target-build,$1,$2,$3)
182
+ PRODUCTS += $1
183
+ $1_DESTINATION := $$(OUTPUT_DIR)/$$($1_BASENAME)
184
+ # copy product to output dir
185
+ $$($1_DESTINATION) : $$($1_TARGET)
186
+ mkdir -p $(OUTPUT_DIR)
187
+ temppath=`mktemp "$(BUILD_DIR)"/tmp.XXXXXXXXXX` && \
188
+ $(if $4,cp $$< "$$$$temppath",strip $$< -Sx -o "$$$$temppath") && \
189
+ chmod 755 "$$$$temppath" && \
190
+ mv "$$$$temppath" $$@
191
+ # short name target
192
+ $(call downcase,$1) : | $$($1_DESTINATION)
193
+ endef
194
+
195
+ $(eval $(call target,ADVPNG,ADVANCECOMP))
196
+ $(eval $(call target,GIFSICLE,,src/gifsicle))
197
+ $(eval $(call target,JHEAD))
198
+ $(eval $(call target,JPEG-RECOMPRESS,JPEGARCHIVE))
199
+ $(eval $(call target,JPEGOPTIM))
200
+ $(eval $(call target,JPEGTRAN,LIBJPEG,.libs/jpegtran))
201
+ $(eval $(call target,LIBJPEG,,libjpeg$(DLEXT)))
202
+ $(eval $(call target,LIBLCMS2,,liblcms2$(DLEXT)))
203
+ $(eval $(call target-build,LIBMOZJPEG,,libjpeg.a))
204
+ $(eval $(call target,LIBPNG,,libpng$(DLEXT)))
205
+ $(eval $(call target,LIBZ,,libz$(DLEXT)))
206
+ $(eval $(call target,OPTIPNG,,src/optipng/optipng))
207
+ $(eval $(call target,OXIPNG,,target/$(RUST_HOST)/release/oxipng))
208
+ $(eval $(call target,PNGCRUSH))
209
+ ifdef IS_DARWIN
210
+ $(eval $(call target,PNGOUT,PNGOUT_DARWIN,,NOSTRIP))
211
+ else ifdef IS_LINUX_MUSL
212
+ $(eval $(call target,PNGOUT,PNGOUT_LINUX_STATIC,,NOSTRIP))
213
+ else
214
+ $(eval $(call target,PNGOUT,PNGOUT_LINUX,,NOSTRIP))
215
+ endif
216
+ $(eval $(call target,PNGQUANT,,target/$(RUST_HOST)/release/pngquant))
217
+
218
+ # ====== TARGETS ======
219
+
220
+ all : build
221
+ @$(MAKE) test
222
+ .PHONY : all
223
+
224
+ build : $(call downcase,$(PRODUCTS))
225
+ .PHONY : build
226
+
227
+ ifdef IS_DARWIN
228
+ ldd := otool -L
229
+ else
230
+ ldd := ldd
231
+ endif
232
+
233
+ ldd-version :; $(ldd) --version
234
+ .PHONY : ldd-version
235
+
236
+ define check_file_presence
237
+ @test -e $(OUTPUT_DIR)/$1 || \
238
+ { printf "%s: $(ANSI_RED)not found$(ANSI_RESET)\n" "$1"; exit 1; }
239
+ @test -f $(OUTPUT_DIR)/$1 || \
240
+ { printf "%s: $(ANSI_RED)not a regular file$(ANSI_RESET)\n" "$1"; exit 1; }
241
+ @test -s $(OUTPUT_DIR)/$1 || \
242
+ { printf "%s: $(ANSI_RED)has size zero$(ANSI_RESET)\n" "$1"; exit 1; }
243
+ endef
244
+
245
+ CHECK_VERSION := $(if $(findstring $(HOST_ARCH)/$(ARCH),x86_64/arm64),,check)
246
+
247
+ define check_version
248
+ @$(OUTPUT_DIR)/$1 $2 | fgrep -q "$3" || \
249
+ { printf "%s: $(ANSI_RED)Expected %s, got %s$(ANSI_RESET)\n" "$1" "$3" "$$($(OUTPUT_DIR)/$1 $2)"; exit 1; }
250
+ endef
251
+
252
+ define check_arch
253
+ @file -b $(OUTPUT_DIR)/$1 | fgrep -q '$(ARCH_STRING)' || \
254
+ { printf "%s: $(ANSI_RED)Expected %s, got %s$(ANSI_RESET)\n" "$1" "$(ARCH_STRING)" "$$(file -b $(OUTPUT_DIR)/$1)"; exit 1; }
255
+ endef
256
+
257
+ define check_output
258
+ @printf "%s: $(ANSI_GREEN)%s$(ANSI_RESET) / $(ANSI_MAGENTA)%s$(ANSI_RESET)\n" "$1" "$2" "$(ARCH_STRING)"
259
+ endef
260
+
261
+ define check_shlib
262
+ @if file $(OUTPUT_DIR)/$1 | fgrep -q 'statically linked'; then \
263
+ printf '\tstatically Linked\n'; \
264
+ else \
265
+ $(ldd) $(OUTPUT_DIR)/$1 | egrep "\s+.*/.*" && \
266
+ ! $(ldd) $(OUTPUT_DIR)/$1 | egrep -o $$'[^: \t]+/[^: \t]+' | egrep -v "^(@loader_path|/lib|/lib64|/usr|$(OUTPUT_DIR))/"; \
267
+ fi
268
+ endef
269
+
270
+ define check_lib
271
+ $(call check_file_presence,$1)
272
+ $(call check_arch,$1)
273
+ $(call check_output,$1,-)
274
+ $(call check_shlib,$1)
275
+ endef
276
+
277
+ define check_bin
278
+ $(call check_file_presence,$1)
279
+ $(if $(CHECK_VERSION),$(call check_version,$1,$2,$3))
280
+ $(call check_arch,$1)
281
+ $(call check_output,$1,$(if $(CHECK_VERSION),$3,[can't run $(ARCH) on $(HOST_ARCH)]))
282
+ $(call check_shlib,$1)
283
+ endef
284
+
285
+ ifdef IS_DARWIN
286
+ test : ARCH_STRING := $(ARCH)
287
+ else ifeq (amd64,$(ARCH:x86_64=amd64))
288
+ test : ARCH_STRING := x86-64
289
+ else
290
+ test : ARCH_STRING := $(ARCH)
291
+ endif
292
+ test :
293
+ $(call check_bin,advpng,--version 2>&1,$(ADVANCECOMP_VER))
294
+ $(call check_bin,gifsicle,--version,$(GIFSICLE_VER))
295
+ $(call check_bin,jhead,-V,$(JHEAD_VER))
296
+ $(call check_bin,jpeg-recompress,--version,$(JPEGARCHIVE_VER))
297
+ $(call check_bin,jpegoptim,--version,$(JPEGOPTIM_VER))
298
+ $(call check_bin,jpegtran,-v - 2>&1,$(LIBJPEG_VER))
299
+ $(call check_lib,libjpeg$(DLEXT))
300
+ $(call check_lib,liblcms2$(DLEXT))
301
+ $(call check_lib,libpng$(DLEXT))
302
+ $(call check_lib,libz$(DLEXT))
303
+ $(call check_bin,optipng,--version,$(OPTIPNG_VER))
304
+ $(call check_bin,oxipng,--version,$(OXIPNG_VER))
305
+ $(call check_bin,pngcrush,-version 2>&1,$(PNGCRUSH_VER))
306
+ $(call check_bin,pngout,2>&1 | head -n 1,$(shell perl -mTime::Piece -e 'print Time::Piece->strptime("$(PNGOUT_VER)", "%Y%m%d")->strftime("%b %e %Y")'))
307
+ $(call check_bin,pngquant,--help,$(PNGQUANT_VER))
308
+ .PHONY : test
309
+
310
+ update-versions :
311
+ script/livecheck --update
312
+ make checksum-update
313
+ make download-dependencies
314
+ .PHONY : update-versions
315
+
316
+ # ====== DOCKER ======
317
+
318
+ DOCKER_IMAGE := ghcr.io/toy/image_optim
319
+ DOCKER_TAG := $(shell date +%Y%m%d)
320
+ DOCKER_FILE := Dockerfile
321
+
322
+ docker-build : download
323
+ @docker build \
324
+ --pull \
325
+ $(foreach archive,$(ARCHIVES),--build-arg $(archive)_VER=$($(archive)_VER) --build-arg $(archive)_SHA256=$($(archive)_SHA256)) \
326
+ -t $(DOCKER_IMAGE):latest$(DOCKER_TAG_SUFFIX) \
327
+ -f $(DOCKER_FILE) \
328
+ .
329
+ @docker tag \
330
+ $(DOCKER_IMAGE):latest$(DOCKER_TAG_SUFFIX) \
331
+ $(DOCKER_IMAGE):$(DOCKER_TAG)$(DOCKER_TAG_SUFFIX)
332
+ .PHONY : docker-build
333
+
334
+ docker-test : docker-build
335
+ @docker run \
336
+ --rm \
337
+ $(DOCKER_IMAGE):latest$(DOCKER_TAG_SUFFIX) \
338
+ --info
339
+ .PHONY : docker-test
340
+
341
+ docker-push : docker-test
342
+ @docker push $(DOCKER_IMAGE):latest$(DOCKER_TAG_SUFFIX)
343
+ @docker push $(DOCKER_IMAGE):$(DOCKER_TAG)$(DOCKER_TAG_SUFFIX)
344
+ .PHONY : docker-push
345
+
346
+ # ====== CLEAN ======
347
+
348
+ clean :
349
+ rm -rf $(BUILD_DIR)
350
+ rm -rf $(OUTPUT_DIR)
351
+ .PHONY : clean
352
+
353
+ clean-all :
354
+ rm -rf $(BUILD_ROOT_DIR)
355
+ rm -rf $(OUTPUT_ROOT_DIR)
356
+ .PHONY : clean-all
357
+
358
+ clobber : clean-all
359
+ rm -rf $(DL_DIR)
360
+ .PHONY : clobber
361
+
362
+ # ====== BUILD HELPERS ======
363
+
364
+ # $1 - name of product
365
+ # $2 - list of dependency products
366
+ define depend-build
367
+ # depend this product on every specified product
368
+ $($1_EXTRACTED) : $$(filter-out $($1_EXTRACTED),$(foreach dep,$2,$$($(dep)_EXTRACTED)))
369
+ $($1_TARGET) : $(foreach dep,$2,$$($(dep)_TARGET))
370
+ # add dependent product dir to CPATH, LIBRARY_PATH and PKG_CONFIG_PATH
371
+ $($1_TARGET) : export CPATH := $(subst $(eval) ,:,$(foreach dep,$2,$$($(dep)_DIR)))
372
+ $($1_TARGET) : export LIBRARY_PATH := $$(CPATH)
373
+ $($1_TARGET) : export PKG_CONFIG_PATH := $$(CPATH)
374
+ endef
375
+
376
+ # $1 - name of product
377
+ # $2 - list of dependency products
378
+ define depend
379
+ $(call depend-build,$1,$2)
380
+ # depend output of this product on output of every specified product
381
+ $$($1_DESTINATION) : $(foreach dep,$2,$$($(dep)_DESTINATION))
382
+ endef
383
+
384
+ pkgconfig_pwd = perl -pi -e 's/(?<=dir=).*/$$ENV{PWD}/'
385
+
386
+ libtool_target_soname = perl -pi -e 's/(?<=soname_spec=)".*"/"$(@F)"/ ; s/(?<=library_names_spec=)".*"/"\\\$$libname\\\$$shared_ext"/' -- libtool
387
+
388
+ ifdef IS_DARWIN
389
+ chrpath_origin =
390
+ else ifdef IS_OPENBSD
391
+ chrpath_origin = perl -pi -e 's/XORIGIN/\$$ORIGIN/' -- $1
392
+ else
393
+ chrpath_origin = chrpath -r '$$ORIGIN' $1
394
+ endif
395
+
396
+ ifdef IS_LINUX
397
+ XORIGIN := -Wl,-rpath,XORIGIN
398
+ else ifdef IS_BSD
399
+ XORIGIN := -Wl,-rpath,XORIGIN -Wl,-z,origin
400
+ else
401
+ XORIGIN :=
402
+ endif
403
+
404
+ # ====== ENV ======
405
+
406
+ ifdef IS_DARWIN
407
+ export CC := clang
408
+ export CXX := clang++
409
+ else
410
+ export CC := gcc
411
+ export CXX := g++
412
+ endif
413
+
414
+ GCC_FLAGS := -O3
415
+
416
+ export CFLAGS = $(GCC_FLAGS)
417
+ export CXXFLAGS = $(GCC_FLAGS)
418
+ export CPPFLAGS = $(GCC_FLAGS)
419
+ export LDFLAGS = $(GCC_FLAGS)
420
+
421
+ ifdef IS_DARWIN
422
+ export MACOSX_DEPLOYMENT_TARGET := 10.12
423
+ GCC_FLAGS += -arch $(ARCH)
424
+ CXXFLAGS += -stdlib=libc++
425
+ export CMAKE_OSX_ARCHITECTURES := $(ARCH)
426
+ endif
427
+
428
+ ifdef IS_BSD
429
+ autotool_version = $(shell printf '%s\n' /usr/local/bin/$1-* | egrep -o '[0-9][^-]+$$' | tail -n 1)
430
+ export AUTOCONF_VERSION := $(call autotool_version,autoconf)
431
+ export AUTOMAKE_VERSION := $(call autotool_version,automake)
432
+ endif
433
+
434
+ # ====== BUILD TARGETS ======
435
+
436
+ ## advpng
437
+ $(eval $(call depend,ADVPNG,LIBZ))
438
+ $(ADVPNG_TARGET) :
439
+ cd $(DIR) && ./configure --host "$(HOST)" LDFLAGS="$(XORIGIN)"
440
+ cd $(DIR) && $(MAKE) advpng
441
+ $(call chrpath_origin,$@)
442
+
443
+ ## gifsicle
444
+ $(GIFSICLE_TARGET) :
445
+ cd $(DIR) && ./configure --host "$(HOST)"
446
+ cd $(DIR) && $(MAKE) gifsicle
447
+
448
+ ## jhead
449
+ $(JHEAD_TARGET) :
450
+ cd $(DIR) && $(MAKE) jhead CC="$(CC) $(CFLAGS)"
451
+
452
+ ## jpeg-recompress
453
+ $(eval $(call depend-build,JPEG-RECOMPRESS,LIBMOZJPEG))
454
+ $(JPEG-RECOMPRESS_TARGET) :
455
+ cd $(DIR) && $(MAKE) jpeg-recompress CC="$(CC) $(CFLAGS) -fcommon" LIBJPEG=$(LIBMOZJPEG_TARGET) \
456
+ MAKE=$(MAKE) # fix for bsd in jpeg-archive-2.1.1
457
+
458
+ ## jpegoptim
459
+ $(eval $(call depend,JPEGOPTIM,LIBJPEG))
460
+ $(JPEGOPTIM_TARGET) :
461
+ cd $(DIR) && ./configure --host "$(HOST)" LDFLAGS="$(XORIGIN)"
462
+ cd $(DIR) && $(MAKE) jpegoptim
463
+ $(call chrpath_origin,$@)
464
+
465
+ ## jpegtran
466
+ $(eval $(call depend,JPEGTRAN,LIBJPEG))
467
+ $(JPEGTRAN_TARGET) :
468
+ cd $(DIR) && $(MAKE) jpegtran LDFLAGS="$(XORIGIN)"
469
+ $(call chrpath_origin,$(JPEGTRAN_TARGET))
470
+
471
+ ## libjpeg
472
+ $(LIBJPEG_TARGET) :
473
+ cd $(DIR) && ./configure --host "$(HOST)" CC="$(CC) $(CFLAGS)"
474
+ cd $(DIR) && $(libtool_target_soname)
475
+ ifdef IS_DARWIN
476
+ cd $(DIR) && $(MAKE) libjpeg.la LDFLAGS="-Wl,-install_name,@loader_path/$(@F)"
477
+ else
478
+ cd $(DIR) && $(MAKE) libjpeg.la
479
+ endif
480
+ cd $(DIR) && ln -sf .libs/libjpeg$(DLEXT) .
481
+
482
+ ## liblcms2
483
+ $(LIBLCMS2_TARGET) :
484
+ cd $(DIR) && ./configure --host "$(HOST)"
485
+ cd $(DIR) && $(libtool_target_soname)
486
+ ifdef IS_DARWIN
487
+ cd $(DIR)/src && make liblcms2.la LDFLAGS="-Wl,-install_name,@loader_path/$(@F)"
488
+ else
489
+ cd $(DIR)/src && make liblcms2.la LDFLAGS="$(XORIGIN)"
490
+ endif
491
+ cd $(DIR) && ln -sf include/lcms2.h .
492
+ cd $(DIR) && ln -sf src/.libs/liblcms2$(DLEXT) .
493
+
494
+ ## libmozjpeg
495
+ $(LIBMOZJPEG_TARGET) :
496
+ cd $(DIR) && cmake -DPNG_SUPPORTED=0 -DCMAKE_POLICY_VERSION_MINIMUM=3.5 .
497
+ cd $(DIR) && $(MAKE) jpeg-static
498
+
499
+ ## libpng
500
+ $(eval $(call depend,LIBPNG,LIBZ))
501
+ $(LIBPNG_TARGET) :
502
+ cd $(DIR) && ./configure --host "$(HOST)" CC="$(CC) $(CFLAGS)"
503
+ cd $(DIR) && $(pkgconfig_pwd) -- *.pc
504
+ cd $(DIR) && perl -pi -e 's/(?<=lpng)\d+//g' -- *.pc # %MAJOR%%MINOR% suffix
505
+ cd $(DIR) && $(libtool_target_soname)
506
+ ifdef IS_DARWIN
507
+ cd $(DIR) && $(MAKE) libpng16.la LDFLAGS="-Wl,-install_name,@loader_path/$(@F)"
508
+ else
509
+ cd $(DIR) && $(MAKE) libpng16.la LDFLAGS="$(XORIGIN)"
510
+ endif
511
+ cd $(DIR) && ln -sf .libs/libpng16$(DLEXT) libpng$(DLEXT)
512
+ $(call chrpath_origin,$@)
513
+
514
+ ## libz
515
+ ifdef IS_DARWIN
516
+ $(LIBZ_TARGET) : export LDSHARED = $(CC) -dynamiclib -install_name @loader_path/$(@F) -compatibility_version 1 -current_version $(LIBZ_VER)
517
+ else
518
+ $(LIBZ_TARGET) : export LDSHARED = $(CC) -shared -Wl,-soname,$(@F),--version-script,zlib.map
519
+ endif
520
+ $(LIBZ_TARGET) :
521
+ cd $(DIR) && ./configure
522
+ cd $(DIR) && $(pkgconfig_pwd) -- *.pc
523
+ cd $(DIR) && $(MAKE) placebo
524
+
525
+ ## optipng
526
+ $(eval $(call depend,OPTIPNG,LIBPNG LIBZ))
527
+ $(OPTIPNG_TARGET) :
528
+ cd $(DIR) && ./configure -with-system-libs
529
+ cd $(DIR) && $(MAKE) all LDFLAGS="$(XORIGIN) $(LDFLAGS)"
530
+ $(call chrpath_origin,$@)
531
+
532
+ ## oxipng
533
+ ifdef IS_LINUX_MUSL
534
+ $(PNGQUANT_TARGET) : export RUSTFLAGS = -C target-feature=-crt-static
535
+ endif
536
+ $(OXIPNG_TARGET) :
537
+ cd $(DIR) && cargo build --release --frozen --offline --target=$(RUST_HOST)
538
+
539
+ ## pngcrush
540
+ $(eval $(call depend,PNGCRUSH,LIBPNG LIBZ))
541
+ $(PNGCRUSH_TARGET) :
542
+ cd $(DIR) && rm -f png.h pngconf.h
543
+ cd $(DIR) && patch < $(PATCHES_DIR)/pngcrush.patch
544
+ cd $(DIR) && $(MAKE) pngcrush \
545
+ CC="$(CC)" \
546
+ LD="$(CC)" \
547
+ LIBS="-lpng -lz -lm" \
548
+ CFLAGS="$(CFLAGS)" \
549
+ CPPFLAGS="$(CPPFLAGS)" \
550
+ LDFLAGS="$(XORIGIN) $(LDFLAGS)"
551
+ $(call chrpath_origin,$@)
552
+
553
+ ## pngout
554
+ $(PNGOUT_TARGET) :
555
+ ifdef IS_LINUX
556
+ cd $(DIR) && ln -sf $(ARCH:x86_64=amd64)/pngout$(if $(IS_LINUX_MUSL),-static) pngout
557
+ endif
558
+ cd $(DIR) && touch pngout
559
+
560
+ ## pngquant
561
+ $(eval $(call depend,PNGQUANT,LIBLCMS2 LIBPNG LIBZ))
562
+ $(PNGQUANT_TARGET) : export RUSTFLAGS = -C link-arg=$(XORIGIN) $(if $(IS_LINUX_MUSL),-C target-feature=-crt-static)
563
+ $(PNGQUANT_TARGET) :
564
+ printf "%s\n" \
565
+ $(foreach LIB,PNG Z LCMS2, \
566
+ "[target.$(RUST_HOST).$(call downcase,$(LIB))]" \
567
+ "rustc-link-lib = ['$(call downcase,$(LIB))']" \
568
+ "rustc-link-search = ['native=$(LIB$(LIB)_DIR)']" \
569
+ "include = '$(LIB$(LIB)_DIR)'" \
570
+ ) > $(DIR)/override.toml
571
+ cd $(DIR) && cargo build --release --frozen --offline --target=$(RUST_HOST) --config override.toml
572
+ $(call chrpath_origin,$@)
data/README.markdown ADDED
@@ -0,0 +1,120 @@
1
+ [![Gem Version](https://img.shields.io/gem/v/image_optim_pack?logo=rubygems)](https://rubygems.org/gems/image_optim_pack)
2
+ [![Check](https://img.shields.io/github/actions/workflow/status/toy/image_optim_pack/check.yml?label=check&logo=github)](https://github.com/toy/image_optim_pack/actions/workflows/check.yml)
3
+ [![Rubocop](https://img.shields.io/github/actions/workflow/status/toy/image_optim_pack/rubocop.yml?label=rubocop&logo=rubocop)](https://github.com/toy/image_optim_pack/actions/workflows/rubocop.yml)
4
+ [![Docker build](https://img.shields.io/github/actions/workflow/status/toy/image_optim_pack/docker-build.yml?label=docker+build&logo=docker)](https://github.com/toy/image_optim_pack/actions/workflows/docker-build.yml)
5
+ [![Livecheck](https://img.shields.io/github/actions/workflow/status/toy/image_optim_pack/livecheck.yml?label=livecheck&logo=github)](https://github.com/toy/image_optim_pack/actions/workflows/livecheck.yml)
6
+ [![Build](https://img.shields.io/github/actions/workflow/status/toy/image_optim_pack/build.yml?label=build&logo=github)](https://github.com/toy/image_optim_pack/actions/workflows/build.yml)
7
+ [![Depfu](https://img.shields.io/depfu/toy/image_optim_pack)](https://depfu.com/github/toy/image_optim_pack)
8
+ [![Inch CI](https://inch-ci.org/github/toy/image_optim_pack.svg?branch=master)](https://inch-ci.org/github/toy/image_optim_pack)
9
+
10
+ # image\_optim\_pack
11
+
12
+ Precompiled binaries for [`image_optim`](https://github.com/toy/image_optim).
13
+
14
+ Contains binaries for Mac OS X (>= 10.12, x86\_64, arm64) and Linux (x86\_64).
15
+
16
+ A test application with latest `image_optim` and `image_optim_pack` is available on render: https://iopack.onrender.com/.
17
+
18
+ ## Binaries and libraries
19
+
20
+ * [advpng](https://www.advancemame.it/doc-advpng.html) by Andrea Mazzoleni and Filipe Estima ([GNU GPLv3](acknowledgements/advancecomp.txt))
21
+ * contains parts of [7z](https://7-zip.org) by Igor Pavlov with modifications by Andrea Mazzoleni ([license](acknowledgements/7z.txt))
22
+ * and [zopfli](https://code.google.com/p/zopfli/) by Lode Vandevenne and Jyrki Alakuijala ([license](acknowledgements/zopfli.txt), [contributors](acknowledgements/zopfli-contributors.txt))
23
+ * [gifsicle](https://lcdf.org/gifsicle/) by Eddie Kohler ([GNU GPLv2](acknowledgements/gifsicle.txt))
24
+ * [jhead](https://github.com/Matthias-Wandel/jhead) by Matthias Wandel ([public domain](acknowledgements/jhead.txt))
25
+ * [jpeg-recompress](https://github.com/danielgtaylor/jpeg-archive) by Daniel G. Taylor ([license](acknowledgements/jpeg-archive.txt))
26
+ * includes [Image Quality Assessment (IQA)](http://tdistler.com/iqa/) by Tom Distler ([license](acknowledgements/iqa.txt))
27
+ * includes [SmallFry](https://github.com/dwbuiten/smallfry) by Derek Buitenhuis ([license](acknowledgements/smallfry.txt))
28
+ * statically linked against mozjpeg, see below
29
+ * [jpegoptim](https://www.kokkonen.net/tjko/projects.html) by Timo Kokkonen ([GNU GPLv2](acknowledgements/jpegoptim.txt) or later)
30
+ * [libjpeg and jpegtran](https://ijg.org/) by the Independent JPEG Group ([license](acknowledgements/libjpeg.txt))
31
+ * [libjpeg-turbo](https://www.libjpeg-turbo.org/) by libjpeg-turbo Project ([license](acknowledgements/libjpeg-turbo.txt))
32
+ * based on libjpeg, see above
33
+ * includes [x86 SIMD extension for IJG JPEG library](https://cetus.sakura.ne.jp/softlab/jpeg-x86simd/jpegsimd.html) by Miyasaka Masaru ([license](acknowledgements/libjpeg-x86-simd.txt))
34
+ * [liblcms2](https://littlecms.com) by Marti Maria ([license](acknowledgements/liblcms2.txt))
35
+ * [libpng](http://libpng.org/pub/png/) by Guy Eric Schalnat, Andreas Dilger, Glenn Randers-Pehrson and others ([license](acknowledgements/libpng.txt))
36
+ * [mozjpeg](https://github.com/mozilla/mozjpeg) by Mozilla Research ([license](acknowledgements/mozjpeg.txt))
37
+ * base on libjpeg and libjpeg-turbo, see above
38
+ * [optipng](http://optipng.sourceforge.net/) by Cosmin Truta ([license](acknowledgements/optipng.txt), [authors](acknowledgements/optipng-authors.txt))
39
+ * contains code based in part on the work of Miyasaka Masaru for BMP support ([license](acknowledgements/bmp2png.txt))
40
+ * and David Koblas for GIF support ([license](acknowledgements/gifread.txt))
41
+ * [oxipng](https://github.com/oxipng/oxipng) by Joshua Holmer ([license](acknowledgements/oxipng.txt))
42
+ * [pngcrush](https://pmt.sourceforge.io/pngcrush/) by Glenn Randers-Pehrson, portions by Greg Roelofs ([license](acknowledgements/pngcrush.txt))
43
+ * contains [cexcept](http://www.nicemice.net/cexcept/) interface by Adam M. Costello and Cosmin Truta ([license](acknowledgements/cexcept.txt))
44
+ * [pngout](http://advsys.net/ken/utils.htm) by Ken Silverman ([license](acknowledgements/pngout.txt))
45
+ * Linux and BSD ports by Jonathon Fowler (http://www.jonof.id.au/pngout)
46
+ * Mac OS X port by Ken Silverman, with assistance by Jonathon Fowler
47
+ * [pngquant](https://pngquant.org/) by Kornel Lesiński based on code by Greg Roelofs and Jef Poskanzer after an idea by Stefan Schneider ([license](acknowledgements/pngquant.txt))
48
+ * [zlib](https://zlib.net/) by Jean-Loup Gailly and Mark Adler ([license](acknowledgements/zlib.txt))
49
+
50
+ **NOTE: On FreeBSD and OpenBSD `make` is not the GNU Make, so `gmake` should be used instead.**
51
+
52
+ You can download all source code using gnu make download target:
53
+
54
+ ```sh
55
+ make download
56
+ ```
57
+
58
+ ## Installation
59
+
60
+ ```sh
61
+ gem install image_optim image_optim_pack
62
+ ```
63
+
64
+ Or add to your `Gemfile`:
65
+
66
+ ```ruby
67
+ gem 'image_optim'
68
+ gem 'image_optim_pack'
69
+ ```
70
+
71
+ ## Development
72
+
73
+ Mac OS X binaries and libraries are built on host, others using containers.
74
+
75
+ ```sh
76
+ script/run # Build and test all for all oses and architectures
77
+ script/run NO_HALT=1 # Don't halt VMs after building
78
+ script/run NO_UP=1 # Don't start VMs before building (will fail if not already running)
79
+ script/run darwin 64 # Build only platforms matching darwin or 64
80
+
81
+ make # Build all tools and copy them to vendor/OS-ARCH for current OS and ARCH, then test
82
+ make all # same
83
+
84
+ script/livecheck # Check versions
85
+ make update-versions # Update versions in Makefile
86
+
87
+ make download # Download archives
88
+ make download-tidy-up # Remove old archives
89
+ make build # Build all without copying to output directory
90
+
91
+ make test # Test bins for current os/arch
92
+ make test -i # Continue if one of bins fail
93
+
94
+ make clean # Remove build and output directories for current os/arch
95
+ make clean-all # Remove build root and output root directories
96
+ make clobber # `clean-all` and remove download directory
97
+ ```
98
+
99
+ ## Docker
100
+
101
+ This project includes a `Dockerfile` in the root, which builds a minimal image with most binaries included.
102
+
103
+ #### Running
104
+
105
+ ```bash
106
+ docker run --rm ghcr.io/toy/image_optim --version # image_optim version
107
+ docker run --rm ghcr.io/toy/image_optim --info # image_optim info including bin versions
108
+ docker run --rm -v "$PWD":/here -w /here ghcr.io/toy/image_optim image-in-this-folder.jpg
109
+ ```
110
+
111
+ #### Building
112
+
113
+ ```bash
114
+ make docker-build # will be tagged with latest and current date in format %Y%m%d
115
+ make docker-push # will push tags created by docker-build
116
+ ```
117
+
118
+ ## Copyright
119
+
120
+ Copyright (c) 2014-2026 Ivan Kuchin. See [LICENSE.txt](LICENSE.txt) for details.