Change:
Project description Epson Scan 2 is a scanning utility for epson printers and scanners. Metadata homepage URL: source URL: license: platforms: linux
I spent some time on this, but probably packaging epsonscan2 isn't worth the effort. My findings: build is quite tricky, as the sources contain some amount of tweaks (overrides) to standard cmake variables for build/install paths, and some install commands don't use , non-free software plugin is required for network scanning: sources of epsonscan2 are hard-coded to search the plugin in same path as is the installation path of epsonscan2, which doesn't play nice the immutability, the scanner might be supported already by My all-in-one printer is EcoTank L3160, which isn't listed in , but is similar to EcoTank L3150. And, all that was need is the following config: Terminal output:
I've managed to get this working on PR . As you said, building is a complete pain and required a fair bit of patching. It would be great if other Epson scanner owners could test this!
Works for me with Epson L3150 with wifi connection and non free plugins.

Discussion:
github = "jali-clarke"; githubId = 17733984; }; <ins> james-atkins = { name = "James Atkins"; github = "james-atkins"; githubId = 9221409; }; </ins> jamiemagee = { email = "jamie.magee@gmail.com"; github = "JamieMagee";

<ins> diff --git a/CMakeLists.txt b/CMakeLists.txt index a9daee7..7c6da08 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,7 +17,6 @@ #  CMakeLists.txt -- template and derived ESC/I ESC/I-2 protocol commands project (epsonscan2) -set (CMAKE_INSTALL_PREFIX "/usr") cmake_minimum_required (VERSION 2.8.12.2) include(GNUInstallDirs) @@ -86,7 +85,6 @@ set(COMMON_ETC_PATH ${CMAKE_INSTALL_FULL_SYSCONFDIR}) set(EPSON_WORK_PATH /tmp/epsonWork/) set(EPSON_SETTINGS_PATH $ENV{HOME}/.epsonscan2/) -SET (CMAKE_INSTALL_PREFIX /usr) set(EPSON_INSTALL_PATH ${CMAKE_INSTALL_FULL_LIBDIR}/epsonscan2/) set(COMMON_SHARE_PATH ${CMAKE_INSTALL_FULL_DATAROOTDIR}) @@ -113,8 +111,8 @@ add_subdirectory(src) install(DIRECTORY Resources DESTINATION ${EPSON_INSTALL_ROOT}${EPSON_INSTALL_PATH}) -install(FILES epsonscan2.rules DESTINATION ${EPSON_INSTALL_ROOT}/lib/udev/rules.d/ RENAME 60-epsonscan2.rules) -install(FILES epsonscan2 DESTINATION ${EPSON_INSTALL_ROOT}/etc/sane.d/dll.d) +install(FILES epsonscan2.rules DESTINATION ${EPSON_INSTALL_ROOT}${CMAKE_INSTALL_PREFIX}/lib/udev/rules.d/ RENAME 60-epsonscan2.rules) +install(FILES epsonscan2 DESTINATION ${EPSON_INSTALL_ROOT}${CMAKE_INSTALL_PREFIX}/etc/sane.d/dll.d) install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${EPSON_INSTALL_ROOT}${CMAKE_INSTALL_FULL_LIBDIR}/sane/)") install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ../epsonscan2/libsane-epsonscan2.so ${EPSON_INSTALL_ROOT}${CMAKE_INSTALL_FULL_LIBDIR}/sane/libsane-epsonscan2.so.1)") install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ../epsonscan2/libsane-epsonscan2.so ${EPSON_INSTALL_ROOT}${CMAKE_INSTALL_FULL_LIBDIR}/sane/libsane-epsonscan2.so.1.0.0)") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c884d83..5ddff0c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -26,7 +26,9 @@ add_subdirectory(ES2Command/Linux) add_subdirectory(ES2FileFormat/Linux) add_subdirectory(Controller) add_subdirectory(SaneWrapper/Linux) +if (NOT DEFINED NO_GUI) add_subdirectory(Standalone) add_subdirectory(DetectAlert) +endif () add_subdirectory(ScanSDK) diff --git a/src/Controller/Src/Filter/GetOrientation.cpp b/src/Controller/Src/Filter/GetOrientation.cpp index 387561e..15448ad 100644 --- a/src/Controller/Src/Filter/GetOrientation.cpp +++ b/src/Controller/Src/Filter/GetOrientation.cpp @@ -12,14 +12,7 @@ namespace epsonscan static std::string GetExecPath() { -#ifdef AKBMODE -    std::string strDst = "/usr/libexec/"; -    strDst = strDst + DRIVER_NAME; -    strDst = strDst + "-ocr/ocr-engine-getrotate"; -    return strDst.c_str() ; -#else -    return "/usr/libexec/epsonscan2-ocr/ocr-engine-getrotate" ; -#endif +    return "@OCR_ENGINE_GETROTATE@"; } static const int kMaxBuf = 256; diff --git a/src/Controller/Src/Scanner/Engine.cpp b/src/Controller/Src/Scanner/Engine.cpp index 9489d4b..670bad9 100644 --- a/src/Controller/Src/Scanner/Engine.cpp +++ b/src/Controller/Src/Scanner/Engine.cpp @@ -263,8 +263,8 @@ SDIError Engine::Open() //kill es2netif //kill es2intif -	system("killall -9 -q es2netif > /dev/null"); -	system("killall -9 -q es2intif > /dev/null"); +	system("@KILLALL@ -9 -q es2netif > /dev/null"); +	system("@KILLALL@ -9 -q es2intif > /dev/null"); if (engine_) { return ExchangeError(engine_->Open()); diff --git a/src/Standalone/CMakeLists.txt b/src/Standalone/CMakeLists.txt index eff3dd3..c2b3803 100644 --- a/src/Standalone/CMakeLists.txt +++ b/src/Standalone/CMakeLists.txt @@ -167,5 +167,5 @@ target_link_libraries(es2standalone ${QT_LIBRARIES} ) QT5_USE_MODULES(es2standalone Widgets) -install(TARGETS es2standalone DESTINATION "${EPSON_INSTALL_ROOT}/usr/bin") +install(TARGETS es2standalone DESTINATION "${EPSON_INSTALL_ROOT}${CMAKE_INSTALL_FULL_BINDIR}") </ins>

<ins> { lib , stdenv , autoPatchelfHook , boost , cmake , copyDesktopItems , imagemagick , fetchpatch , fetchzip , killall , libjpeg , libpng , libtiff , libtool , libusb1 , makeDesktopItem , qtbase , wrapQtAppsHook , withGui ? true , withNonFreePlugins ? false }: let pname = "epsonscan2"; description = "Epson Scan 2 scanner driver for many modern Epson scanners and multifunction printers"; version = "6.7.61.0"; system = stdenv.hostPlatform.system; src = fetchzip { url = "https://download3.ebz.epson.net/dsc/f/03/00/14/53/67/1a6447b4acc5568dfd970feba0518fabea35bca2/epsonscan2-${version}-1.src.tar.gz"; hash = "sha256-xwvdgmV6Mrs1RC18U2mA+HlTYybeYb0V5lz5hCvC7+8="; }; bundle = { "i686-linux" = fetchzip { name = "${pname}-bundle"; url = "https://download3.ebz.epson.net/dsc/f/03/00/14/53/69/3151031c0fb4deea3f48781fd051411b983ccee4/epsonscan2-bundle-${version}.i686.deb.tar.gz"; hash = "sha256-nq3Nqunt8aMcCf7U7JBYrVscvrhhcwcn8RlhYXLmC2c="; }; "x86_64-linux" = fetchzip { name = "${pname}-bundle"; url = "https://download3.ebz.epson.net/dsc/f/03/00/14/53/68/a5e06101ba3f328dd747888e3dddebbb677bb8c8/epsonscan2-bundle-${version}.x86_64.deb.tar.gz"; hash = "sha256-cFx54CKkZtvhZ5ABuBwB8+IzhT2lu8D3+GZFaMuWf3Y="; }; }."${system}" or (throw "Unsupported system: ${system}"); in stdenv.mkDerivation { inherit pname src version; patches = [ ./build.patch (fetchpatch { url = "https://github.com/flathub/net.epson.epsonscan2/raw/master/patches/epsonscan2-crash.patch"; hash = "sha256-srMxlFfnZuJ3ed5veFcJIiZuW27F/3xOS0yr4ywn4FI="; }) (fetchpatch { url = "https://raw.githubusercontent.com/flathub/net.epson.epsonscan2/master/patches/epsonscan2-oob-container.patch"; hash = "sha256-FhXZT0bIBYwdFow2USRJl8Q7j2eqpq98Hh0lHFQlUQY="; }) (fetchpatch { url = "https://raw.githubusercontent.com/flathub/net.epson.epsonscan2/master/patches/epsonscan2-xdg-open.patch"; hash = "sha256-4ih3vZjPwWiiAxKfpLIwbbsk1K2oXSuxGbT5PVwfUsc="; }) ]; postPatch = '' substituteInPlace src/Controller/Src/Scanner/Engine.cpp  --replace '@KILLALL@' ${killall}/bin/killall substituteInPlace src/Controller/Src/Filter/GetOrientation.cpp  --replace '@OCR_ENGINE_GETROTATE@' $out/libexec/epsonscan2-ocr/ocr-engine-getrotate ''; nativeBuildInputs = [ cmake ] ++ lib.optionals withGui [ imagemagick # to make icons wrapQtAppsHook ] ++ lib.optionals withNonFreePlugins [ autoPatchelfHook ]; buildInputs = [ boost libjpeg libpng libtiff libusb1 ] ++ lib.optionals withGui [ copyDesktopItems qtbase ] ++ lib.optionals withNonFreePlugins [ libtool.lib ]; cmakeFlags = [ "-DCMAKE_BUILD_TYPE=Release" # The non-free (Debian) packages uses this directory structure so do the same when compiling # from source so we can easily merge them. "-DCMAKE_INSTALL_LIBDIR=lib/${system}-gnu" ] ++ lib.optionals (!withGui) [ "-DNO_GUI=ON" ]; postInstall = '' # But when we put all the libraries in lib/${system}-gnu, then SANE can't find the # required libraries so create a symlink to where it expects them to be. mkdir -p $out/lib/sane for file in $out/lib/${system}-gnu/sane/*.so.*; do ln -s $file $out/lib/sane/ done '' + lib.optionalString withGui '' # The icon file extension is .ico but it's actually a png! mkdir -p $out/share/icons/hicolor/{48x48,128x128}/apps convert $src/Resources/Icons/escan2_app.ico -resize 48x48 $out/share/icons/hicolor/48x48/apps/epsonscan2.png convert $src/Resources/Icons/escan2_app.ico -resize 128x128 $out/share/icons/hicolor/128x128/apps/epsonscan2.png '' + lib.optionalString withNonFreePlugins '' ar xf ${bundle}/plugins/epsonscan2-non-free-plugin_*.deb tar Jxf data.tar.xz cp -r usr/* $out ''; desktopItems = lib.optionals withGui [ (makeDesktopItem { name = pname; exec = "epsonscan2"; icon = "epsonscan2"; desktopName = "Epson Scan 2"; genericName = "Epson Scan 2"; comment = description; categories = [ "Graphics" "Scanning" ]; }) ]; meta = { inherit description; longDescription = '' Epson Scan 2 scanner driver including optional non-free plugins such as OCR and network scanning. To use the SANE backend: <literal> hardware.sane.extraBackends = [ pkgs.epsonscan2 ]; </literal> Overrides can be used to customise this package. For example, to enable non-free plugins and disable the Epson GUI: <literal> pkgs.epsonscan2.override { withNonFreePlugins = true; withGui = false; } </literal> ''; homepage = "https://support.epson.net/linux/en/epsonscan2.php"; platforms = [ "i686-linux" "x86_64-linux" ]; sourceProvenance = with lib.sourceTypes; [ fromSource ] ++ lib.optionals withNonFreePlugins [ binaryNativeCode ]; license = with lib.licenses; if withNonFreePlugins then unfree else lgpl21Plus; maintainers = with lib.maintainers; [ james-atkins ]; }; } </ins>

terminal-parrot = callPackage ../applications/misc/terminal-parrot { }; <ins> epsonscan2 = pkgs.libsForQt5.callPackage ../misc/drivers/epsonscan2 { }; </ins> epson-alc1100 = callPackage ../misc/drivers/epson-alc1100 { }; epson-escpr = callPackage ../misc/drivers/epson-escpr { };