diff --git a/codecs/mozjpeg/Makefile b/codecs/mozjpeg/Makefile index 012b646c..0a3c4f76 100644 --- a/codecs/mozjpeg/Makefile +++ b/codecs/mozjpeg/Makefile @@ -1,10 +1,6 @@ -CODEC_URL := https://github.com/mozilla/mozjpeg/archive/v3.3.1.tar.gz -CODEC_DIR := node_modules/mozjpeg -CODEC_OUT_RELATIVE := .libs/libjpeg.a rdswitch.o -CODEC_OUT := $(addprefix $(CODEC_DIR)/, $(CODEC_OUT_RELATIVE)) ENVIRONMENT = worker -OUT_JS := enc/mozjpeg_enc.js enc/mozjpeg_node_enc.js dec/mozjpeg_node_dec.js +OUT_JS := enc/mozjpeg_enc.js OUT_WASM := $(OUT_JS:.js=.wasm) .PHONY: all clean @@ -15,47 +11,15 @@ all: $(OUT_JS) $(filter enc/%,$(OUT_JS)): enc/mozjpeg_enc.cpp $(filter dec/%,$(OUT_JS)): dec/mozjpeg_dec.cpp -enc/mozjpeg_node_enc.js dec/mozjpeg_node_dec.js: ENVIRONMENT = node - -%.js: $(CODEC_OUT) +%.js: $(CXX) \ - -I $(CODEC_DIR) \ + -I ${MOZJPEG}/include \ ${CXXFLAGS} \ ${LDFLAGS} \ --bind \ -s ENVIRONMENT=$(ENVIRONMENT) \ -s EXPORT_ES6=1 \ -o $@ \ - $+ - -# This one is a bit special: there is no rule for .libs/libjpeg.a -# so we use libjpeg.la which implicitly builds that one instead. -$(CODEC_DIR)/.libs/libjpeg.a: $(CODEC_DIR)/Makefile - $(MAKE) -C $(CODEC_DIR) libjpeg.la - -$(CODEC_DIR)/rdswitch.o: $(CODEC_DIR)/Makefile - $(MAKE) -C $(CODEC_DIR) rdswitch.o - -$(CODEC_DIR)/Makefile: $(CODEC_DIR)/configure - cd $(CODEC_DIR) && ./configure \ - --disable-shared \ - --without-turbojpeg \ - --without-simd \ - --without-arith-enc \ - --without-arith-dec \ - --with-build-date=squoosh - # ^ If not provided with a dummy value, MozJPEG includes a build date in the - # binary as part of the version string, making binaries different each time. - -$(CODEC_DIR)/configure: $(CODEC_DIR)/configure.ac - cd $(CODEC_DIR) && autoreconf -iv - -$(CODEC_DIR)/configure.ac: $(CODEC_DIR) - -$(CODEC_DIR): - mkdir -p $@ - curl -sL $(CODEC_URL) | tar xz --strip 1 -C $@ - -clean: - $(RM) $(OUT_JS) $(OUT_WASM) - $(MAKE) -C $(CODEC_DIR) clean + ${MOZJPEG}/lib/rdswitch.o \ + ${MOZJPEG}/lib/libjpeg.a \ + $+ \ diff --git a/codecs/mozjpeg/flake.lock b/codecs/mozjpeg/flake.lock new file mode 100644 index 00000000..32d6a0c4 --- /dev/null +++ b/codecs/mozjpeg/flake.lock @@ -0,0 +1,43 @@ +{ + "nodes": { + "mozjpeg": { + "flake": false, + "locked": { + "lastModified": 1499684294, + "narHash": "sha256-frpQdkk7bJE5qbV70fdL1FsC4eI0Fm8FWshqBQxCRtk=", + "owner": "mozilla", + "repo": "mozjpeg", + "rev": "f154ccc091cbc22141cdfd531e5ad1fdc5bc53c7", + "type": "github" + }, + "original": { + "owner": "mozilla", + "ref": "v3.3.1", + "repo": "mozjpeg", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1722640603, + "narHash": "sha256-TcXjLVNd3VeH1qKPH335Tc4RbFDbZQX+d7rqnDUoRaY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "81610abc161d4021b29199aa464d6a1a521e0cc9", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "root": { + "inputs": { + "mozjpeg": "mozjpeg", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/codecs/mozjpeg/flake.nix b/codecs/mozjpeg/flake.nix new file mode 100644 index 00000000..3c8d913b --- /dev/null +++ b/codecs/mozjpeg/flake.nix @@ -0,0 +1,98 @@ +{ + inputs = { + mozjpeg = { + url = "github:mozilla/mozjpeg/v3.3.1"; + flake = false; + + # type = "github"; + # owner = "mozilla"; + # repo = "mozjpeg"; + # rev = "v3.3.1"; + # hash = "sha256-frpQdkk7bJE5qbV70fdL1FsC4eI0Fm8FWshqBQxCRtk="; + }; + }; + outputs = + { + self, + nixpkgs, + mozjpeg, + }: + let + system = "aarch64-darwin"; + pkgs = import nixpkgs { inherit system; }; + in + with pkgs; + rec { + packages.${system} = { + default = stdenv.mkDerivation { + name = "mozjpeg-squoosh"; + src = ./.; + nativeBuildInputs = [ emscripten packages.${system}.mozjpeg ]; + MOZJPEG = packages.${system}.mozjpeg; + dontConfigure = true; + buildPhase = '' + export HOME=$TMPDIR + emmake make -j$(nproc) + ''; + installPhase = '' + mkdir -p $out + cp + ''; + }; + mozjpeg = stdenv.mkDerivation { + name = "mozjpeg"; + src = mozjpeg; + nativeBuildInputs = [ + autoconf + automake + libtool + emscripten + pkg-config + ]; + preConfigure = '' + # $HOME is required for Emscripten to work. + # See: https://nixos.org/manual/nixpkgs/stable/#emscripten + export HOME=$TMPDIR + autoreconf -if + ''; + # configurePhase = '' + + # runHook preConfigure + # emconfigure ./configure $configureFlags + # runHook postConfigure + # ''; + configureScript = "emconfigure ./configure"; + configureFlags = [ + "--disable-shared" + "--without-turbojpeg" + "--without-simd" + "--without-arith-enc" + "--without-arith-dec" + "--with-build-date=squoosh" + ]; + buildFlags = [ + "libjpeg.la" + "rdswitch.o" + ]; + buildPhase = '' + emmake make -j$(nproc) $buildFlags + ''; + installPhase = '' + mkdir -p $out/lib + mkdir -p $out/include + cp .libs/libjpeg.a $out/lib + cp rdswitch.o $out/lib + cp *.h $out/include + ''; + checkPhase = '' + true + ''; + }; + }; + devShells.${system}.default = pkgs.mkShell { + shellHook = '' + echo "Path to MozJPEG: ${mozjpeg}" + ''; + }; + }; +}