image_optim_pack 0.13.0-aarch64-linux-gnu

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 (77) hide show
  1. checksums.yaml +7 -0
  2. data/.dockerignore +10 -0
  3. data/.github/dependabot.yml +6 -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 +623 -0
  12. data/Dockerfile +184 -0
  13. data/Dockerfile.debian +184 -0
  14. data/Gemfile +14 -0
  15. data/LICENSE.txt +27 -0
  16. data/Makefile +573 -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-x86_64-gnu.gemspec +3 -0
  50. data/image_optim_pack-linux-x86_64-musl.gemspec +3 -0
  51. data/image_optim_pack.gemspec +62 -0
  52. data/lib/image_optim/pack.rb +136 -0
  53. data/lib/image_optim_pack.rb +3 -0
  54. data/patches/pngcrush.patch +15 -0
  55. data/script/extract +19 -0
  56. data/script/livecheck +263 -0
  57. data/script/platform_downloads +59 -0
  58. data/script/run +167 -0
  59. data/spec/image_optim/pack_spec.rb +122 -0
  60. data/spec/image_optim_spec.rb +42 -0
  61. data/spec/spec_helper.rb +10 -0
  62. data/vendor/linux-aarch64-gnu/advpng +0 -0
  63. data/vendor/linux-aarch64-gnu/gifsicle +0 -0
  64. data/vendor/linux-aarch64-gnu/jhead +0 -0
  65. data/vendor/linux-aarch64-gnu/jpeg-recompress +0 -0
  66. data/vendor/linux-aarch64-gnu/jpegoptim +0 -0
  67. data/vendor/linux-aarch64-gnu/jpegtran +0 -0
  68. data/vendor/linux-aarch64-gnu/libjpeg.so +0 -0
  69. data/vendor/linux-aarch64-gnu/liblcms2.so +0 -0
  70. data/vendor/linux-aarch64-gnu/libpng.so +0 -0
  71. data/vendor/linux-aarch64-gnu/libz.so +0 -0
  72. data/vendor/linux-aarch64-gnu/optipng +0 -0
  73. data/vendor/linux-aarch64-gnu/oxipng +0 -0
  74. data/vendor/linux-aarch64-gnu/pngcrush +0 -0
  75. data/vendor/linux-aarch64-gnu/pngout +0 -0
  76. data/vendor/linux-aarch64-gnu/pngquant +0 -0
  77. metadata +202 -0
data/Makefile ADDED
@@ -0,0 +1,573 @@
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.56
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
+ # $4 - extra arguments to wget
105
+ define archive-dl
106
+ $(call archive,$1,$3)
107
+ # download archive from url
108
+ $$($1_ARC) :
109
+ mkdir -p $(DL_DIR)
110
+ test -w $(DL_DIR)
111
+ tmpfile=`mktemp "$$@.XXXXXXXXXX"` && \
112
+ wget -O "$$$$tmpfile" --no-use-server-timestamps $4 "$(subst [VER],$($1_VER),$(strip $2))" && \
113
+ chmod 644 "$$$$tmpfile" && \
114
+ mv "$$$$tmpfile" "$$@"
115
+ endef
116
+
117
+ $(eval $(call archive-dl,ADVANCECOMP, https://github.com/amadvance/advancecomp/releases/download/v[VER]/advancecomp-[VER].tar.gz))
118
+ $(eval $(call archive-dl,GIFSICLE, https://www.lcdf.org/gifsicle/gifsicle-[VER].tar.gz))
119
+ $(eval $(call archive-dl,JHEAD, https://github.com/Matthias-Wandel/jhead/archive/[VER].tar.gz))
120
+ $(eval $(call archive-dl,JPEGARCHIVE, https://github.com/danielgtaylor/jpeg-archive/archive/v[VER].tar.gz))
121
+ $(eval $(call archive-dl,JPEGOPTIM, https://github.com/tjko/jpegoptim/archive/v[VER].tar.gz))
122
+ $(eval $(call archive-dl,LIBJPEG, https://www.ijg.org/files/jpegsrc.v[VER].tar.gz))
123
+ $(eval $(call archive-dl,LIBLCMS2, https://prdownloads.sourceforge.net/lcms/lcms2-[VER].tar.gz?download))
124
+ $(eval $(call archive-dl,LIBMOZJPEG, https://github.com/mozilla/mozjpeg/archive/v[VER].tar.gz))
125
+ $(eval $(call archive-dl,LIBPNG, https://prdownloads.sourceforge.net/libpng/libpng-[VER].tar.gz?download))
126
+ $(eval $(call archive-dl,LIBZ, https://github.com/madler/zlib/archive/v[VER].tar.gz))
127
+ $(eval $(call archive-dl,OPTIPNG, https://prdownloads.sourceforge.net/optipng/optipng-[VER].tar.gz?download))
128
+ $(eval $(call archive-dl,OXIPNG, https://github.com/oxipng/oxipng/archive/v[VER].tar.gz))
129
+ $(eval $(call archive-dl,PNGCRUSH, https://prdownloads.sourceforge.net/pmt/pngcrush-[VER]-nolib.tar.gz?download))
130
+ $(eval $(call archive-dl,PNGOUT_LINUX,https://www.jonof.id.au/files/kenutils/pngout-[VER]-linux.tar.gz,,--retry-on-http-error=415))
131
+ $(eval $(call archive-dl,PNGOUT_LINUX_STATIC,https://www.jonof.id.au/files/kenutils/pngout-[VER]-linux-static.tar.gz,,--retry-on-http-error=415))
132
+ $(eval $(call archive-dl,PNGOUT_DARWIN,https://www.jonof.id.au/files/kenutils/pngout-[VER]-mac.zip,zip,--retry-on-http-error=415))
133
+ $(eval $(call archive-dl,PNGQUANT, https://crates.io/api/v1/crates/pngquant/[VER]/download))
134
+
135
+ download : $(foreach archive,$(ARCHIVES),$($(archive)_ARC))
136
+ .PHONY : download
137
+
138
+ download-dependencies : $(OXIPNG_EXTRACTED) $(PNGQUANT_EXTRACTED)
139
+ cd $(OXIPNG_DIR) && cargo fetch --locked
140
+ cd $(PNGQUANT_DIR) && cargo fetch --locked
141
+ .PHONY : download-dependencies
142
+
143
+ download-tidy-up :
144
+ rm -f $(filter-out $(foreach archive,$(ARCHIVES),$($(archive)_ARC)),$(wildcard $(DL_DIR)/*.*))
145
+ .PHONY : download-tidy-up
146
+
147
+ checksum : download
148
+ @$(sha256sum) $(foreach archive,$(ARCHIVES),$($(archive)_ARC))
149
+ .PHONY : checksum
150
+
151
+ checksum-verify : download
152
+ @printf '%s %s\n' $(foreach archive,$(ARCHIVES),$($(archive)_SHA256) $($(archive)_ARC)) | $(sha256sum) -c
153
+ .PHONY : checksum-verify
154
+
155
+ checksum-update : download
156
+ @printf '%s := %s\n' $(foreach archive,$(ARCHIVES),$(archive)_SHA256 $(shell $(sha256sum) $($(archive)_ARC) | cut -d ' ' -f 1)) > checksums.mk
157
+ .PHONY : checksum-update
158
+
159
+ # ====== PRODUCTS ======
160
+
161
+ PRODUCTS :=
162
+
163
+ # $1 - product name
164
+ # $2 - archive name ($1 if empty)
165
+ # $3 - path ($1 if empty)
166
+ define target-build
167
+ $1_PATH := $(or $3,$(call downcase,$1))
168
+ $1_BASENAME := $$(notdir $$($1_PATH))
169
+ $1_DIR := $($(or $2,$1)_DIR)
170
+ $1_ARC := $($(or $2,$1)_ARC)
171
+ $1_EXTRACTED := $($(or $2,$1)_EXTRACTED)
172
+ $1_TARGET := $$($1_DIR)/$$($1_PATH)
173
+ $$($1_TARGET) : DIR := $$($1_DIR)
174
+ $$($1_TARGET) : $$($1_EXTRACTED)
175
+ endef
176
+
177
+ # $1 - product name
178
+ # $2 - archive name ($1 if empty)
179
+ # $3 - basename ($1 if empty)
180
+ # $4 - don't strip the target
181
+ define target
182
+ $(call target-build,$1,$2,$3)
183
+ PRODUCTS += $1
184
+ $1_DESTINATION := $$(OUTPUT_DIR)/$$($1_BASENAME)
185
+ # copy product to output dir
186
+ $$($1_DESTINATION) : $$($1_TARGET)
187
+ mkdir -p $(OUTPUT_DIR)
188
+ temppath=`mktemp "$(BUILD_DIR)"/tmp.XXXXXXXXXX` && \
189
+ $(if $4,cp $$< "$$$$temppath",strip $$< -Sx -o "$$$$temppath") && \
190
+ chmod 755 "$$$$temppath" && \
191
+ mv "$$$$temppath" $$@
192
+ # short name target
193
+ $(call downcase,$1) : | $$($1_DESTINATION)
194
+ endef
195
+
196
+ $(eval $(call target,ADVPNG,ADVANCECOMP))
197
+ $(eval $(call target,GIFSICLE,,src/gifsicle))
198
+ $(eval $(call target,JHEAD))
199
+ $(eval $(call target,JPEG-RECOMPRESS,JPEGARCHIVE))
200
+ $(eval $(call target,JPEGOPTIM))
201
+ $(eval $(call target,JPEGTRAN,LIBJPEG,.libs/jpegtran))
202
+ $(eval $(call target,LIBJPEG,,libjpeg$(DLEXT)))
203
+ $(eval $(call target,LIBLCMS2,,liblcms2$(DLEXT)))
204
+ $(eval $(call target-build,LIBMOZJPEG,,libjpeg.a))
205
+ $(eval $(call target,LIBPNG,,libpng$(DLEXT)))
206
+ $(eval $(call target,LIBZ,,libz$(DLEXT)))
207
+ $(eval $(call target,OPTIPNG,,src/optipng/optipng))
208
+ $(eval $(call target,OXIPNG,,target/$(RUST_HOST)/release/oxipng))
209
+ $(eval $(call target,PNGCRUSH))
210
+ ifdef IS_DARWIN
211
+ $(eval $(call target,PNGOUT,PNGOUT_DARWIN,,NOSTRIP))
212
+ else ifdef IS_LINUX_MUSL
213
+ $(eval $(call target,PNGOUT,PNGOUT_LINUX_STATIC,,NOSTRIP))
214
+ else
215
+ $(eval $(call target,PNGOUT,PNGOUT_LINUX,,NOSTRIP))
216
+ endif
217
+ $(eval $(call target,PNGQUANT,,target/$(RUST_HOST)/release/pngquant))
218
+
219
+ # ====== TARGETS ======
220
+
221
+ all : build
222
+ @$(MAKE) test
223
+ .PHONY : all
224
+
225
+ build : $(call downcase,$(PRODUCTS))
226
+ .PHONY : build
227
+
228
+ ifdef IS_DARWIN
229
+ ldd := otool -L
230
+ else
231
+ ldd := ldd
232
+ endif
233
+
234
+ ldd-version :; $(ldd) --version
235
+ .PHONY : ldd-version
236
+
237
+ define check_file_presence
238
+ @test -e $(OUTPUT_DIR)/$1 || \
239
+ { printf "%s: $(ANSI_RED)not found$(ANSI_RESET)\n" "$1"; exit 1; }
240
+ @test -f $(OUTPUT_DIR)/$1 || \
241
+ { printf "%s: $(ANSI_RED)not a regular file$(ANSI_RESET)\n" "$1"; exit 1; }
242
+ @test -s $(OUTPUT_DIR)/$1 || \
243
+ { printf "%s: $(ANSI_RED)has size zero$(ANSI_RESET)\n" "$1"; exit 1; }
244
+ endef
245
+
246
+ CHECK_VERSION := $(if $(findstring $(HOST_ARCH)/$(ARCH),x86_64/arm64),,check)
247
+
248
+ define check_version
249
+ @$(OUTPUT_DIR)/$1 $2 | fgrep -q "$3" || \
250
+ { printf "%s: $(ANSI_RED)Expected %s, got %s$(ANSI_RESET)\n" "$1" "$3" "$$($(OUTPUT_DIR)/$1 $2)"; exit 1; }
251
+ endef
252
+
253
+ define check_arch
254
+ @file -b $(OUTPUT_DIR)/$1 | fgrep -q '$(ARCH_STRING)' || \
255
+ { printf "%s: $(ANSI_RED)Expected %s, got %s$(ANSI_RESET)\n" "$1" "$(ARCH_STRING)" "$$(file -b $(OUTPUT_DIR)/$1)"; exit 1; }
256
+ endef
257
+
258
+ define check_output
259
+ @printf "%s: $(ANSI_GREEN)%s$(ANSI_RESET) / $(ANSI_MAGENTA)%s$(ANSI_RESET)\n" "$1" "$2" "$(ARCH_STRING)"
260
+ endef
261
+
262
+ define check_shlib
263
+ @if file $(OUTPUT_DIR)/$1 | fgrep -q 'statically linked'; then \
264
+ printf '\tstatically Linked\n'; \
265
+ else \
266
+ $(ldd) $(OUTPUT_DIR)/$1 | egrep "\s+.*/.*" && \
267
+ ! $(ldd) $(OUTPUT_DIR)/$1 | egrep -o $$'[^: \t]+/[^: \t]+' | egrep -v "^(@loader_path|/lib|/lib64|/usr|$(OUTPUT_DIR))/"; \
268
+ fi
269
+ endef
270
+
271
+ define check_lib
272
+ $(call check_file_presence,$1)
273
+ $(call check_arch,$1)
274
+ $(call check_output,$1,-)
275
+ $(call check_shlib,$1)
276
+ endef
277
+
278
+ define check_bin
279
+ $(call check_file_presence,$1)
280
+ $(if $(CHECK_VERSION),$(call check_version,$1,$2,$3))
281
+ $(call check_arch,$1)
282
+ $(call check_output,$1,$(if $(CHECK_VERSION),$3,[can't run $(ARCH) on $(HOST_ARCH)]))
283
+ $(call check_shlib,$1)
284
+ endef
285
+
286
+ ifdef IS_DARWIN
287
+ test : ARCH_STRING := $(ARCH)
288
+ else ifeq (amd64,$(ARCH:x86_64=amd64))
289
+ test : ARCH_STRING := x86-64
290
+ else
291
+ test : ARCH_STRING := $(ARCH)
292
+ endif
293
+ test :
294
+ $(call check_bin,advpng,--version 2>&1,$(ADVANCECOMP_VER))
295
+ $(call check_bin,gifsicle,--version,$(GIFSICLE_VER))
296
+ $(call check_bin,jhead,-V,$(JHEAD_VER))
297
+ $(call check_bin,jpeg-recompress,--version,$(JPEGARCHIVE_VER))
298
+ $(call check_bin,jpegoptim,--version,$(JPEGOPTIM_VER))
299
+ $(call check_bin,jpegtran,-v - 2>&1,$(LIBJPEG_VER))
300
+ $(call check_lib,libjpeg$(DLEXT))
301
+ $(call check_lib,liblcms2$(DLEXT))
302
+ $(call check_lib,libpng$(DLEXT))
303
+ $(call check_lib,libz$(DLEXT))
304
+ $(call check_bin,optipng,--version,$(OPTIPNG_VER))
305
+ $(call check_bin,oxipng,--version,$(OXIPNG_VER))
306
+ $(call check_bin,pngcrush,-version 2>&1,$(PNGCRUSH_VER))
307
+ $(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")'))
308
+ $(call check_bin,pngquant,--help,$(PNGQUANT_VER))
309
+ .PHONY : test
310
+
311
+ update-versions :
312
+ script/livecheck --update
313
+ make checksum-update
314
+ make download-dependencies
315
+ .PHONY : update-versions
316
+
317
+ # ====== DOCKER ======
318
+
319
+ DOCKER_IMAGE := ghcr.io/toy/image_optim
320
+ DOCKER_TAG := $(shell date +%Y%m%d)
321
+ DOCKER_FILE := Dockerfile
322
+
323
+ docker-build : download
324
+ @docker build \
325
+ --pull \
326
+ $(foreach archive,$(ARCHIVES),--build-arg $(archive)_VER=$($(archive)_VER) --build-arg $(archive)_SHA256=$($(archive)_SHA256)) \
327
+ -t $(DOCKER_IMAGE):latest$(DOCKER_TAG_SUFFIX) \
328
+ -f $(DOCKER_FILE) \
329
+ .
330
+ @docker tag \
331
+ $(DOCKER_IMAGE):latest$(DOCKER_TAG_SUFFIX) \
332
+ $(DOCKER_IMAGE):$(DOCKER_TAG)$(DOCKER_TAG_SUFFIX)
333
+ .PHONY : docker-build
334
+
335
+ docker-test : docker-build
336
+ @docker run \
337
+ --rm \
338
+ $(DOCKER_IMAGE):latest$(DOCKER_TAG_SUFFIX) \
339
+ --info
340
+ .PHONY : docker-test
341
+
342
+ docker-push : docker-test
343
+ @docker push $(DOCKER_IMAGE):latest$(DOCKER_TAG_SUFFIX)
344
+ @docker push $(DOCKER_IMAGE):$(DOCKER_TAG)$(DOCKER_TAG_SUFFIX)
345
+ .PHONY : docker-push
346
+
347
+ # ====== CLEAN ======
348
+
349
+ clean :
350
+ rm -rf $(BUILD_DIR)
351
+ rm -rf $(OUTPUT_DIR)
352
+ .PHONY : clean
353
+
354
+ clean-all :
355
+ rm -rf $(BUILD_ROOT_DIR)
356
+ rm -rf $(OUTPUT_ROOT_DIR)
357
+ .PHONY : clean-all
358
+
359
+ clobber : clean-all
360
+ rm -rf $(DL_DIR)
361
+ .PHONY : clobber
362
+
363
+ # ====== BUILD HELPERS ======
364
+
365
+ # $1 - name of product
366
+ # $2 - list of dependency products
367
+ define depend-build
368
+ # depend this product on every specified product
369
+ $($1_EXTRACTED) : $$(filter-out $($1_EXTRACTED),$(foreach dep,$2,$$($(dep)_EXTRACTED)))
370
+ $($1_TARGET) : $(foreach dep,$2,$$($(dep)_TARGET))
371
+ # add dependent product dir to CPATH, LIBRARY_PATH and PKG_CONFIG_PATH
372
+ $($1_TARGET) : export CPATH := $(subst $(eval) ,:,$(foreach dep,$2,$$($(dep)_DIR)))
373
+ $($1_TARGET) : export LIBRARY_PATH := $$(CPATH)
374
+ $($1_TARGET) : export PKG_CONFIG_PATH := $$(CPATH)
375
+ endef
376
+
377
+ # $1 - name of product
378
+ # $2 - list of dependency products
379
+ define depend
380
+ $(call depend-build,$1,$2)
381
+ # depend output of this product on output of every specified product
382
+ $$($1_DESTINATION) : $(foreach dep,$2,$$($(dep)_DESTINATION))
383
+ endef
384
+
385
+ pkgconfig_pwd = perl -pi -e 's/(?<=dir=).*/$$ENV{PWD}/'
386
+
387
+ libtool_target_soname = perl -pi -e 's/(?<=soname_spec=)".*"/"$(@F)"/ ; s/(?<=library_names_spec=)".*"/"\\\$$libname\\\$$shared_ext"/' -- libtool
388
+
389
+ ifdef IS_DARWIN
390
+ chrpath_origin =
391
+ else ifdef IS_OPENBSD
392
+ chrpath_origin = perl -pi -e 's/XORIGIN/\$$ORIGIN/' -- $1
393
+ else
394
+ chrpath_origin = chrpath -r '$$ORIGIN' $1
395
+ endif
396
+
397
+ ifdef IS_LINUX
398
+ XORIGIN := -Wl,-rpath,XORIGIN
399
+ else ifdef IS_BSD
400
+ XORIGIN := -Wl,-rpath,XORIGIN -Wl,-z,origin
401
+ else
402
+ XORIGIN :=
403
+ endif
404
+
405
+ # ====== ENV ======
406
+
407
+ ifdef IS_DARWIN
408
+ export CC := clang
409
+ export CXX := clang++
410
+ else
411
+ export CC := gcc
412
+ export CXX := g++
413
+ endif
414
+
415
+ GCC_FLAGS := -O3
416
+
417
+ export CFLAGS = $(GCC_FLAGS)
418
+ export CXXFLAGS = $(GCC_FLAGS)
419
+ export CPPFLAGS = $(GCC_FLAGS)
420
+ export LDFLAGS = $(GCC_FLAGS)
421
+
422
+ ifdef IS_DARWIN
423
+ export MACOSX_DEPLOYMENT_TARGET := 10.12
424
+ GCC_FLAGS += -arch $(ARCH)
425
+ CXXFLAGS += -stdlib=libc++
426
+ export CMAKE_OSX_ARCHITECTURES := $(ARCH)
427
+ endif
428
+
429
+ ifdef IS_BSD
430
+ autotool_version = $(shell printf '%s\n' /usr/local/bin/$1-* | egrep -o '[0-9][^-]+$$' | tail -n 1)
431
+ export AUTOCONF_VERSION := $(call autotool_version,autoconf)
432
+ export AUTOMAKE_VERSION := $(call autotool_version,automake)
433
+ endif
434
+
435
+ # ====== BUILD TARGETS ======
436
+
437
+ ## advpng
438
+ $(eval $(call depend,ADVPNG,LIBZ))
439
+ $(ADVPNG_TARGET) :
440
+ cd $(DIR) && ./configure --host "$(HOST)" LDFLAGS="$(XORIGIN)"
441
+ cd $(DIR) && $(MAKE) advpng
442
+ $(call chrpath_origin,$@)
443
+
444
+ ## gifsicle
445
+ $(GIFSICLE_TARGET) :
446
+ cd $(DIR) && ./configure --host "$(HOST)"
447
+ cd $(DIR) && $(MAKE) gifsicle
448
+
449
+ ## jhead
450
+ $(JHEAD_TARGET) :
451
+ cd $(DIR) && $(MAKE) jhead CC="$(CC) $(CFLAGS)"
452
+
453
+ ## jpeg-recompress
454
+ $(eval $(call depend-build,JPEG-RECOMPRESS,LIBMOZJPEG))
455
+ $(JPEG-RECOMPRESS_TARGET) :
456
+ cd $(DIR) && $(MAKE) jpeg-recompress CC="$(CC) $(CFLAGS) -fcommon" LIBJPEG=$(LIBMOZJPEG_TARGET) \
457
+ MAKE=$(MAKE) # fix for bsd in jpeg-archive-2.1.1
458
+
459
+ ## jpegoptim
460
+ $(eval $(call depend,JPEGOPTIM,LIBJPEG))
461
+ $(JPEGOPTIM_TARGET) :
462
+ cd $(DIR) && ./configure --host "$(HOST)" LDFLAGS="$(XORIGIN)"
463
+ cd $(DIR) && $(MAKE) jpegoptim
464
+ $(call chrpath_origin,$@)
465
+
466
+ ## jpegtran
467
+ $(eval $(call depend,JPEGTRAN,LIBJPEG))
468
+ $(JPEGTRAN_TARGET) :
469
+ cd $(DIR) && $(MAKE) jpegtran LDFLAGS="$(XORIGIN)"
470
+ $(call chrpath_origin,$(JPEGTRAN_TARGET))
471
+
472
+ ## libjpeg
473
+ $(LIBJPEG_TARGET) :
474
+ cd $(DIR) && ./configure --host "$(HOST)" CC="$(CC) $(CFLAGS)"
475
+ cd $(DIR) && $(libtool_target_soname)
476
+ ifdef IS_DARWIN
477
+ cd $(DIR) && $(MAKE) libjpeg.la LDFLAGS="-Wl,-install_name,@loader_path/$(@F)"
478
+ else
479
+ cd $(DIR) && $(MAKE) libjpeg.la
480
+ endif
481
+ cd $(DIR) && ln -sf .libs/libjpeg$(DLEXT) .
482
+
483
+ ## liblcms2
484
+ $(LIBLCMS2_TARGET) :
485
+ cd $(DIR) && ./configure --host "$(HOST)"
486
+ cd $(DIR) && $(libtool_target_soname)
487
+ ifdef IS_DARWIN
488
+ cd $(DIR)/src && make liblcms2.la LDFLAGS="-Wl,-install_name,@loader_path/$(@F)"
489
+ else
490
+ cd $(DIR)/src && make liblcms2.la LDFLAGS="$(XORIGIN)"
491
+ endif
492
+ cd $(DIR) && ln -sf include/lcms2.h .
493
+ cd $(DIR) && ln -sf src/.libs/liblcms2$(DLEXT) .
494
+
495
+ ## libmozjpeg
496
+ $(LIBMOZJPEG_TARGET) :
497
+ cd $(DIR) && cmake -DPNG_SUPPORTED=0 -DCMAKE_POLICY_VERSION_MINIMUM=3.5 .
498
+ cd $(DIR) && $(MAKE) jpeg-static
499
+
500
+ ## libpng
501
+ $(eval $(call depend,LIBPNG,LIBZ))
502
+ $(LIBPNG_TARGET) :
503
+ cd $(DIR) && ./configure --host "$(HOST)" CC="$(CC) $(CFLAGS)"
504
+ cd $(DIR) && $(pkgconfig_pwd) -- *.pc
505
+ cd $(DIR) && perl -pi -e 's/(?<=lpng)\d+//g' -- *.pc # %MAJOR%%MINOR% suffix
506
+ cd $(DIR) && $(libtool_target_soname)
507
+ ifdef IS_DARWIN
508
+ cd $(DIR) && $(MAKE) libpng16.la LDFLAGS="-Wl,-install_name,@loader_path/$(@F)"
509
+ else
510
+ cd $(DIR) && $(MAKE) libpng16.la LDFLAGS="$(XORIGIN)"
511
+ endif
512
+ cd $(DIR) && ln -sf .libs/libpng16$(DLEXT) libpng$(DLEXT)
513
+ $(call chrpath_origin,$@)
514
+
515
+ ## libz
516
+ ifdef IS_DARWIN
517
+ $(LIBZ_TARGET) : export LDSHARED = $(CC) -dynamiclib -install_name @loader_path/$(@F) -compatibility_version 1 -current_version $(LIBZ_VER)
518
+ else
519
+ $(LIBZ_TARGET) : export LDSHARED = $(CC) -shared -Wl,-soname,$(@F),--version-script,zlib.map
520
+ endif
521
+ $(LIBZ_TARGET) :
522
+ cd $(DIR) && ./configure
523
+ cd $(DIR) && $(pkgconfig_pwd) -- *.pc
524
+ cd $(DIR) && $(MAKE) placebo
525
+
526
+ ## optipng
527
+ $(eval $(call depend,OPTIPNG,LIBPNG LIBZ))
528
+ $(OPTIPNG_TARGET) :
529
+ cd $(DIR) && ./configure -with-system-libs
530
+ cd $(DIR) && $(MAKE) all LDFLAGS="$(XORIGIN) $(LDFLAGS)"
531
+ $(call chrpath_origin,$@)
532
+
533
+ ## oxipng
534
+ ifdef IS_LINUX_MUSL
535
+ $(PNGQUANT_TARGET) : export RUSTFLAGS = -C target-feature=-crt-static
536
+ endif
537
+ $(OXIPNG_TARGET) :
538
+ cd $(DIR) && cargo build --release --frozen --offline --target=$(RUST_HOST)
539
+
540
+ ## pngcrush
541
+ $(eval $(call depend,PNGCRUSH,LIBPNG LIBZ))
542
+ $(PNGCRUSH_TARGET) :
543
+ cd $(DIR) && rm -f png.h pngconf.h
544
+ cd $(DIR) && patch < $(PATCHES_DIR)/pngcrush.patch
545
+ cd $(DIR) && $(MAKE) pngcrush \
546
+ CC="$(CC)" \
547
+ LD="$(CC)" \
548
+ LIBS="-lpng -lz -lm" \
549
+ CFLAGS="$(CFLAGS)" \
550
+ CPPFLAGS="$(CPPFLAGS)" \
551
+ LDFLAGS="$(XORIGIN) $(LDFLAGS)"
552
+ $(call chrpath_origin,$@)
553
+
554
+ ## pngout
555
+ $(PNGOUT_TARGET) :
556
+ ifdef IS_LINUX
557
+ cd $(DIR) && ln -sf $(ARCH:x86_64=amd64)/pngout$(if $(IS_LINUX_MUSL),-static) pngout
558
+ endif
559
+ cd $(DIR) && touch pngout
560
+
561
+ ## pngquant
562
+ $(eval $(call depend,PNGQUANT,LIBLCMS2 LIBPNG LIBZ))
563
+ $(PNGQUANT_TARGET) : export RUSTFLAGS = -C link-arg=$(XORIGIN) $(if $(IS_LINUX_MUSL),-C target-feature=-crt-static)
564
+ $(PNGQUANT_TARGET) :
565
+ printf "%s\n" \
566
+ $(foreach LIB,PNG Z LCMS2, \
567
+ "[target.$(RUST_HOST).$(call downcase,$(LIB))]" \
568
+ "rustc-link-lib = ['$(call downcase,$(LIB))']" \
569
+ "rustc-link-search = ['native=$(LIB$(LIB)_DIR)']" \
570
+ "include = '$(LIB$(LIB)_DIR)'" \
571
+ ) > $(DIR)/override.toml
572
+ cd $(DIR) && cargo build --release --frozen --offline --target=$(RUST_HOST) --config override.toml
573
+ $(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.