diff --git a/justfile b/justfile new file mode 100644 index 0000000..c9c549d --- /dev/null +++ b/justfile @@ -0,0 +1,252 @@ +alias b := build +alias ba := buildall +alias ball := buildall +alias t := test +alias d := doc +alias e := expand +alias f := fmt +alias be := benchmark +alias rt := runtest +alias ru := run +alias cl := clean +alias mkapp := make-app +alias i := install +alias p := package +alias pkg := package + +APP_NAME := file_name(justfile_directory()) +APP_PACKAGE := "DirOdtToPdf" +APP_PACKAGES_PATH := justfile_directory() + "/packages/" +APP_RESOURCES_PATH := justfile_directory() + "/resources/" +RUN_APP_PATH:= "RunDirOdtToPdf" + +MACOS_ROOT_PATH := justfile_directory() + "/macos/" +MACOS_APP_PATH := "DirOdtToPdf.app" +MACOS_APP_ICNS_PATH := justfile_directory() + "/resources/icon/app/macos/AppIcon.icns" +SRC_MACOS := file_name(justfile_directory()) + ".scpt" + +RUN_SRC := "run.sh" +BIN_APP_PATH := "/usr/local/bin" + +default: + @just -l + +build: + cargo build + +[linux] +buildall: + @echo "Build {{BOLD + MAGENTA}}{{APP_NAME}}{{NORMAL}} ... " + cargo build --release + +[macos] +buildall: + @echo "\nBuild {{BOLD + MAGENTA}}{{APP_NAME}}{{NORMAL}} universal for {{BOLD + GREEN}}{{os()}}{{NORMAL}} architectures ... " + @echo "\n{{BOLD + MAGENTA + INVERT}}Apple Silicon (arm64){{NORMAL}}" + cargo build --target aarch64-apple-darwin --release + @echo "\n{{BOLD + MAGENTA + INVERT}}Intel (x86_64){{NORMAL}} " + cargo build --target x86_64-apple-darwin --release + @if ! test -r target/apple-darwin/release ; then \ + mkdir -p target/apple-darwin/release; \ + fi + @if type -p lipo > /dev/null; then \ + lipo -create \ + -output target/apple-darwin/release/{{APP_NAME}} \ + target/aarch64-apple-darwin/release/{{APP_NAME}} \ + target/x86_64-apple-darwin/release/{{APP_NAME}} ; \ + fi + @if test -r target/apple-darwin/release/{{APP_NAME}} ; then \ + echo "\n{{BOLD + GREEN + INVERT}}target/apple-darwin/release/{{APP_NAME}}{{NORMAL}} created";\ + fi + +[macos] +make-app: buildall + @if test -r {{MACOS_ROOT_PATH + SRC_MACOS}} ; then \ + echo "\n{{BOLD + GREEN + INVERT}}{{MACOS_APP_PATH}}{{NORMAL}}";\ + echo "creating from {{BOLD + MAGENTA}}{{MACOS_ROOT_PATH + SRC_MACOS}}{{NORMAL}}";\ + osacompile -o '{{MACOS_ROOT_PATH + MACOS_APP_PATH}}' '{{MACOS_ROOT_PATH + SRC_MACOS}}'; \ + fi + @if test -r {{MACOS_ROOT_PATH + MACOS_APP_PATH}} ; then \ + echo "\nCreated {{BOLD + GREEN}}{{MACOS_ROOT_PATH + MACOS_APP_PATH}}{{NORMAL}}";\ + fi + @if test -r '{{MACOS_APP_ICNS_PATH}}' && test -r '{{MACOS_ROOT_PATH + MACOS_APP_PATH}}' ; then \ + cp {{MACOS_APP_ICNS_PATH}} {{MACOS_ROOT_PATH + MACOS_APP_PATH + "/Contents/Resources/applet.icns"}}; \ + echo "\nCopy {{BOLD + MAGENTA}}{{MACOS_APP_ICNS_PATH}}{{NORMAL}} to {{BOLD + GREEN}}{{MACOS_APP_PATH + "/Contents/Resources/applet.icns"}}{{NORMAL}}";\ + fi + @if test -r '{{MACOS_APP_ICNS_PATH}}' && test -r '{{MACOS_ROOT_PATH + MACOS_APP_PATH}}' ; then \ + cp {{MACOS_APP_ICNS_PATH}} {{MACOS_ROOT_PATH + MACOS_APP_PATH + "/Contents/Resources/applet.icns"}}; \ + echo "\nCopy {{BOLD + MAGENTA}}{{MACOS_APP_ICNS_PATH}}{{NORMAL}} to {{BOLD + GREEN}}{{MACOS_APP_PATH + "/Contents/Resources/applet.icns"}}{{NORMAL}}";\ + fi + @cd {{justfile_directory()}} && if test -r target/apple-darwin/release/{{APP_NAME}} ; then \ + cp {{'target/apple-darwin/release/' + APP_NAME}} {{MACOS_ROOT_PATH + MACOS_APP_PATH + "/Contents/MacOS/" + APP_NAME}}; \ + echo "\n{{BOLD + GREEN + INVERT}}target/apple-darwin/release/{{APP_NAME}}{{NORMAL}} to Contets/MacOS/{{APP_NAME}}";\ + fi + @cd {{justfile_directory()}} && if test -r {{RUN_SRC}} ; then \ + cat {{RUN_SRC}} | sed 's,:-\.,:-{{justfile_directory()}},g' |\ + sed 's,/usr/local/bin,{{BIN_APP_PATH}},g' > {{MACOS_ROOT_PATH + MACOS_APP_PATH + '/Contents/MacOS/run-' + APP_NAME + '.sh'}}; \ + chmod +x {{MACOS_ROOT_PATH + MACOS_APP_PATH + '/Contents/MacOS/run-' + APP_NAME + '.sh'}}; \ + echo "\nCopy and fix paths {{BOLD + GREEN + INVERT}}{{RUN_SRC}}{{NORMAL}} to {{BOLD + MAGENTA}}{{'/run-' + APP_NAME + '.sh'}}{{NORMAL}}";\ + fi + +[linux] +make-app: buildall + +[macos] +package: make-app + @if test -r {{'/Volumes/' + APP_PACKAGE}} ; then \ + hdiutil detach {{'/Volumes/' + APP_PACKAGE}}; \ + fi + @if test -r {{APP_PACKAGES_PATH + APP_PACKAGE}} ; then \ + rm -rf {{APP_PACKAGES_PATH + APP_PACKAGE}}; \ + fi + @if ! test -r '{{MACOS_APP_ICNS_PATH}}' || ! test -r '{{MACOS_ROOT_PATH + MACOS_APP_PATH}}' ; then \ + echo "\nUnable to Create DMG {{BOLD + GREEN}}{{APP_PACKAGE + '.dmg'}}{{NORMAL}} {{BOLD + RED}}{{MACOS_APP_PATH}} or icns not found{{NORMAL}}";\ + exit 1 ; \ + fi + @mkdir {{APP_PACKAGES_PATH + APP_PACKAGE}}; + @if test -r '{{MACOS_APP_ICNS_PATH}}' ; then \ + cp {{MACOS_APP_ICNS_PATH}} {{MACOS_ROOT_PATH + MACOS_APP_PATH + "/Contents/Resources/applet.icns"}}; \ + fi + @# cp "{{APP_RESOURCES_PATH + 'icon/app/macos/AppIcon.icns'}}" {{APP_PACKAGES_PATH + APP_PACKAGE + "/" + APP_PACKAGE + "-volume.icns"}}; + @if test -r "{{MACOS_ROOT_PATH + 'install.command'}}" ; then \ + cp {{MACOS_ROOT_PATH + 'install.command'}} {{APP_PACKAGES_PATH + APP_PACKAGE}};\ + fi + @if test -r "{{MACOS_ROOT_PATH + 'README'}}" ; then \ + cp {{MACOS_ROOT_PATH + 'README'}} {{APP_PACKAGES_PATH + APP_PACKAGE}};\ + fi + @if test -r {{MACOS_ROOT_PATH + MACOS_APP_PATH}} ; then \ + cp -pr {{MACOS_ROOT_PATH + MACOS_APP_PATH}} {{APP_PACKAGES_PATH + APP_PACKAGE}};\ + echo "\nCopy {{BOLD + GREEN}}{{MACOS_APP_PATH}}{{NORMAL}} to {{BOLD + MAGENTA}}{{APP_PACKAGE}}{{NORMAL}}";\ + fi + @if test -r {{'/Volumes/' + APP_PACKAGE + '.dmg'}} ; then \ + hdiutil detach {{'/Volumes/' + APP_PACKAGE + '.dmg'}}; \ + fi + @if test -r {{APP_PACKAGES_PATH + APP_PACKAGE + ".dmg"}} ; then \ + rm -f {{APP_PACKAGES_PATH + APP_PACKAGE + ".dmg"}}; \ + fi + @#--volicon ".{{APP_RESOURCES_PATH + 'icon/app/macos/AppIcon.icns'}}" + @#--volicon "{{APP_PACKAGE + '-volume.icns'}}" + @if type -p create-dmg > /dev/null; then \ + create-dmg \ + --volname "{{APP_PACKAGE}}" \ + --background "{{APP_RESOURCES_PATH + 'ins_background.png'}}" \ + --window-pos 200 120 \ + --window-size 500 400 \ + --icon-size 100 \ + --app-drop-link 300 200 \ + --icon "{{MACOS_APP_PATH}}" 100 200 \ + --icon "README" 100 50 \ + --icon "install.command" 300 50 \ + --hide-extension "{{MACOS_APP_PATH}}" \ + --no-internet-enable \ + --hdiutil-quiet \ + "{{APP_PACKAGES_PATH + APP_PACKAGE + '.dmg'}}" \ + "{{APP_PACKAGES_PATH + APP_PACKAGE}}"; \ + echo "\nCreate DMG image {{BOLD + GREEN}}{{APP_PACKAGE + '.dmg'}}{{NORMAL}} in {{BOLD + MAGENTA}}{{APP_PACKAGES_PATH}}{{NORMAL}}";\ + else \ + hdiutil create -volname "{{APP_PACKAGE}}" -srcfolder {{APP_PACKAGES_PATH + APP_PACKAGE}} -ov -format UDZO {{APP_PACKAGES_PATH + APP_PACKAGE + ".dmg"}}; \ + echo "\nCreate DMG hd {{BOLD + GREEN}}{{APP_PACKAGE + '.dmg'}}{{NORMAL}} in {{BOLD + MAGENTA}}{{APP_PACKAGES_PATH}}{{NORMAL}}";\ + fi + @if test -r {{'/Volumes/' + APP_PACKAGE}} ; then \ + hdiutil detach {{'/Voulumes/' + APP_PACKAGE}}; \ + fi + @if test -r {{APP_PACKAGES_PATH + APP_PACKAGE}} ; then \ + rm -rf {{APP_PACKAGES_PATH + APP_PACKAGE}}; \ + fi + +[linux] +package: + @if test -r {{APP_PACKAGES_PATH + APP_PACKAGE}} ; then \ + rm -rf {{APP_PACKAGES_PATH + APP_PACKAGE}}; \ + fi + @mkdir {{APP_PACKAGES_PATH + APP_PACKAGE}}; + @if test -r {{APP_PACKAGES_PATH + APP_PACKAGE}} ; then \ + echo "\nPackage {{BOLD + GREEN}}{{APP_PACKAGE}}{{NORMAL}} in {{BOLD + MAGENTA}}{{APP_PACKAGES_PATH}}{{NORMAL}}";\ + fi + +delete-run: + @bash -c 'echo -en "Are you sure you want to delete current script ({{BOLD + GREEN + BIN_APP_PATH}}/run-{{APP_NAME}}.sh{{NORMAL}})? (s/n): " ;\ + read -r answer;\ + case $answer in \ + yes|y|s|si) \ + rm -rf "{{BIN_APP_PATH}}/run-{{APP_NAME}}.sh"; \ + echo -e "\nDeleted {{BOLD + GREEN + INVERT}}{{BIN_APP_PATH + '/run-' + APP_NAME + '.sh'}}{{NORMAL}}"; \ + ;; \ + *) \ + echo -e "\n{{BOLD + RED + INVERT}}No deleted{{NORMAL}}"; \ + ;; \ + esac; \ + ' + +[linux] +make-run: + @if test -r {{BIN_APP_PATH + '/run-' + APP_NAME + '.sh'}} ; then \ + echo "\n{{BOLD + MAGENTA}}{{BIN_APP_PATH + '/run-' + APP_NAME + '.sh'}}{{NORMAL}} already exists";\ + just delete-run; \ + fi + +[macos] +make-run: + @if test -r {{BIN_APP_PATH + '/run-' + APP_NAME + '.sh'}} ; then \ + echo "\n{{BOLD + MAGENTA}}{{BIN_APP_PATH + '/run-' + APP_NAME + '.sh'}}{{NORMAL}} already exists";\ + just delete-run; \ + fi + @if ! test -r {{BIN_APP_PATH + '/run-' + APP_NAME + '.sh'}} ; then \ + cp {{MACOS_ROOT_PATH + MACOS_APP_PATH + '/Contents/MacOS/run-' + APP_NAME + '.sh'}} {{BIN_APP_PATH}}; \ + chmod +x {{BIN_APP_PATH + '/run-' + APP_NAME + '.sh'}}; \ + echo "\nCopy and fix paths {{BOLD + GREEN + INVERT}}{{RUN_SRC}}{{NORMAL}} to {{BOLD + MAGENTA}}{{BIN_APP_PATH + '/run-' + APP_NAME + '.sh'}}{{NORMAL}}";\ + fi + +[linux] +install: make-app + @echo "\nInstall {{BOLD + GREEN + INVERT}}{{BIN_APP_PATH}}{{NORMAL}}"; + @cd {{justfile_directory()}} && if test -r target/{{APP_NAME}} ; then \ + cp -p target/{{APP_NAME}} {{BIN_APP_PATH}};\ + echo "\nCopy {{BOLD + GREEN + INVERT}}target/{{APP_NAME}}{{NORMAL}} to {{BOLD + MAGENTA}}{{BIN_APP_PATH}}{{NORMAL}}";\ + fi + +[macos] +install: make-app + @echo "\nInstall {{BOLD + GREEN + INVERT}}{{MACOS_APP_PATH}}{{NORMAL}}" >/tmp/i; + @cd {{justfile_directory()}} && if test -r target/{{APP_NAME}} ; then \ + cp -p target/{{APP_NAME}} {{BIN_APP_PATH}};\ + echo "\nCopy {{BOLD + GREEN + INVERT}}target/{{APP_NAME}}{{NORMAL}} to {{BOLD + MAGENTA}}{{BIN_APP_PATH}}{{NORMAL}}";\ + fi + @if test -r {{"/Applications/" + MACOS_APP_PATH}} ; then \ + rm -rf {{"/Applications/" + MACOS_APP_PATH}};\ + echo "\nRemove /Applications/{{MACOS_APP_PATH}}";\ + fi + @if test -r {{MACOS_ROOT_PATH + MACOS_APP_PATH}} ; then \ + cp -pr {{MACOS_ROOT_PATH + MACOS_APP_PATH}} /Applications;\ + echo "\nCopy {{BOLD + GREEN}}{{MACOS_ROOT_PATH + MACOS_APP_PATH}}{{NORMAL}} to /Applications";\ + fi + @just make-run + +test: + cargo t + +expand: + cargo expand + +benchmark: + cargo bench + +runtest: + @cd {{justfile_directory()}} && if test -d "test/documents" ; then \ + rm -rf "test/documents"; \ + fi + @cd {{justfile_directory()}} && if test -r {{RUN_SRC}} ; then \ + ./{{RUN_SRC}}; \ + fi + +run: + cargo b -r + +fmt: + cargo +nightly fmt + +clean: + cargo clean + +doc: + cargo doc --open --no-deps