From ff7f1adcc085c16f108bb8e84ba431f769fd1469 Mon Sep 17 00:00:00 2001 From: "F.D.Castel" Date: Tue, 24 Feb 2026 11:33:12 +0000 Subject: [PATCH 1/2] Use Firebird embedded mode for CI on all platforms Replace Firebird server installation and service management with embedded mode using cached Firebird distributions on all platforms. Linux: - Download Firebird tarball, extract buildroot.tar.gz to /tmp/firebird - Set LD_LIBRARY_PATH and FIREBIRD env vars at test time - Cache /tmp/firebird with actions/cache Windows: - Download Firebird zip, extract to C:\Firebird - Configure Providers=Engine13 in firebird.conf (force embedded mode) - Remove vcpkg client-only fbclient.dll from build tree so PATH resolves to full Firebird distribution DLL - Cache C:\Firebird with actions/cache macOS: - Extract .pkg payload with pkgutil + tar (no sudo installer needed) - Replace vcpkg client-only libfbclient.dylib with full distribution version and configure RPATH for dependencies - Set FIREBIRD and DYLD_LIBRARY_PATH at test time - Cache /tmp/firebird with actions/cache New CMakeUserPresets templates for embedded mode omit FBCPP_TEST_SERVER so tests use local filesystem paths instead of TCP connections. Closes #33. --- .github/workflows/main.yml | 125 +++++++++++------ .github/workflows/pull-request.yml | 127 ++++++++++++------ CMakeUserPresets.json.embedded-posix.template | 31 +++++ ...UserPresets.json.embedded-windows.template | 31 +++++ 4 files changed, 230 insertions(+), 84 deletions(-) create mode 100644 CMakeUserPresets.json.embedded-posix.template create mode 100644 CMakeUserPresets.json.embedded-windows.template diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 24b05c7..8682d55 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -74,19 +74,23 @@ jobs: libtomcrypt1 \ mono-complete - - name: Install Firebird - run: | - wget -nv -O Firebird-5.0.3.1683-0-linux-x64.tar.gz \ - "https://github.com/FirebirdSQL/firebird/releases/download/v5.0.3/Firebird-5.0.3.1683-0-linux-x64.tar.gz" - tar xzf Firebird-5.0.3.1683-0-linux-x64.tar.gz - (cd Firebird-5.0.3.1683-0-linux-x64 && sudo ./install.sh -silent) + - name: Cache Firebird environment + id: cache-firebird + uses: actions/cache@v4 + with: + path: /tmp/firebird + key: firebird-embedded-linux-x64-5.0.3 - - name: Configure Firebird + - name: Download Firebird (embedded) + if: steps.cache-firebird.outputs.cache-hit != 'true' run: | - sudo systemctl stop firebird - echo "alter user SYSDBA password 'masterkey';" | \ - sudo /opt/firebird/bin/isql employee -user SYSDBA -q - sudo systemctl start firebird + wget -nv -O /tmp/Firebird.tar.gz \ + "https://github.com/FirebirdSQL/firebird/releases/download/v5.0.3/Firebird-5.0.3.1683-0-linux-x64.tar.gz" + mkdir -p /tmp/firebird-extract + tar xzf /tmp/Firebird.tar.gz -C /tmp/firebird-extract + tar xzf /tmp/firebird-extract/Firebird-5.0.3.1683-0-linux-x64/buildroot.tar.gz -C /tmp/firebird-extract + mv /tmp/firebird-extract/opt/firebird /tmp/firebird + rm -rf /tmp/firebird-extract /tmp/Firebird.tar.gz - name: Bootstrap vcpkg run: | @@ -108,7 +112,7 @@ jobs: - name: Configure CMake run: | - cp CMakeUserPresets.json.posix.template CMakeUserPresets.json + cp CMakeUserPresets.json.embedded-posix.template CMakeUserPresets.json cmake --preset default - name: Upload vcpkg failure logs @@ -124,6 +128,9 @@ jobs: cmake --build --preset default - name: Run tests + env: + FIREBIRD: /tmp/firebird + LD_LIBRARY_PATH: /tmp/firebird/lib run: | ctest --preset default --verbose @@ -162,25 +169,21 @@ jobs: restore-keys: | ${{ runner.os }}-vcpkg- - - name: Install Firebird - shell: cmd - run: | - set FB_ZIP=Firebird-5.0.3.1683-0-windows-x64.zip - powershell Invoke-WebRequest ^ - "https://github.com/FirebirdSQL/firebird/releases/download/v5.0.3/$env:FB_ZIP" -OutFile "$env:FB_ZIP" - 7z x -oC:\Firebird %FB_ZIP% - - - name: Configure Firebird - shell: cmd - run: | - echo create user SYSDBA password 'masterkey'; ^ - | "C:\Firebird\isql.exe" employee -user SYSDBA -q + - name: Cache Firebird environment + id: cache-firebird + uses: actions/cache@v4 + with: + path: C:\Firebird + key: firebird-windows-x64-5.0.3 - - name: Start Firebird Server - shell: cmd - working-directory: C:\Firebird + - name: Download Firebird (embedded) + if: steps.cache-firebird.outputs.cache-hit != 'true' + shell: pwsh run: | - call install_service.bat + $url = 'https://github.com/FirebirdSQL/firebird/releases/download/v5.0.3/Firebird-5.0.3.1683-0-windows-x64.zip' + Invoke-WebRequest $url -OutFile Firebird.zip + Expand-Archive Firebird.zip -DestinationPath 'C:\Firebird' + Remove-Item Firebird.zip - name: Bootstrap vcpkg shell: cmd @@ -205,7 +208,7 @@ jobs: - name: Configure CMake shell: cmd run: | - copy CMakeUserPresets.json.windows.template CMakeUserPresets.json + copy CMakeUserPresets.json.embedded-windows.template CMakeUserPresets.json cmake --preset default - name: Upload vcpkg failure logs @@ -221,9 +224,26 @@ jobs: run: | cmake --build --preset default + - name: Prepare Firebird embedded for tests + shell: pwsh + run: | + # Configure Firebird for embedded-only operation + $confPath = 'C:\Firebird\firebird.conf' + Add-Content -Path $confPath -Value "`nProviders = Engine13" + Add-Content -Path $confPath -Value "DatabaseAccess = Full" + + # Remove ALL vcpkg fbclient.dll copies from the build tree so the + # DLL search falls through to PATH -> C:\Firebird\fbclient.dll + Get-ChildItem -Path build -Recurse -Filter 'fbclient.dll' | ForEach-Object { + Write-Host "Removing: $($_.FullName)" + Remove-Item $_.FullName -Force + } + - name: Run tests shell: cmd run: | + set FIREBIRD=C:\Firebird + set PATH=C:\Firebird;%PATH% ctest --preset default --verbose build-macos: @@ -261,18 +281,24 @@ jobs: libtool \ mono - - name: Install Firebird - run: | - wget -nv -O Firebird-5.0.3.1683-0-macos-arm64.pkg \ - "https://github.com/FirebirdSQL/firebird/releases/download/v5.0.3/Firebird-5.0.3.1683-0-macos-arm64.pkg" - sudo installer -verbose -pkg Firebird-5.0.3.1683-0-macos-arm64.pkg -target / + - name: Cache Firebird environment + id: cache-firebird + uses: actions/cache@v4 + with: + path: /tmp/firebird + key: firebird-embedded-macos-arm64-5.0.3 - - name: Configure Firebird + - name: Download Firebird (embedded) + if: steps.cache-firebird.outputs.cache-hit != 'true' run: | - sudo launchctl unload /Library/LaunchDaemons/org.firebird.gds.plist - echo "alter user SYSDBA password 'masterkey';" | \ - sudo /Library/Frameworks/Firebird.framework/Versions/A/Resources/bin/isql employee -user SYSDBA -q - sudo launchctl load /Library/LaunchDaemons/org.firebird.gds.plist + wget -nv -O /tmp/Firebird.pkg \ + "https://github.com/FirebirdSQL/firebird/releases/download/v5.0.3/Firebird-5.0.3.1683-0-macos-arm64.pkg" + pkgutil --expand /tmp/Firebird.pkg /tmp/firebird-pkg + mkdir -p /tmp/firebird-extract + PAYLOAD=$(find /tmp/firebird-pkg -name 'Payload' -type f | head -1) + tar xzf "$PAYLOAD" -C /tmp/firebird-extract + mv /tmp/firebird-extract/Versions/A /tmp/firebird + rm -rf /tmp/firebird-pkg /tmp/firebird-extract /tmp/Firebird.pkg - name: Bootstrap vcpkg run: | @@ -294,7 +320,7 @@ jobs: - name: Configure CMake run: | - cp CMakeUserPresets.json.posix.template CMakeUserPresets.json + cp CMakeUserPresets.json.embedded-posix.template CMakeUserPresets.json cmake --preset default - name: Upload vcpkg failure logs @@ -309,7 +335,24 @@ jobs: run: | cmake --build --preset default + - name: Prepare Firebird embedded for tests + run: | + # Replace vcpkg's client-only libfbclient with the full distribution + # version that includes the embedded engine provider. + VCPKG_LIB=$(find build/vcpkg_installed -path '*/debug/lib' -type d | head -1) + # Remove vcpkg's client-only copies + find "$VCPKG_LIB" -name 'libfbclient.dylib*' -exec rm -f {} \; + # Copy full distribution library and create versioned symlinks + cp /tmp/firebird/Libraries/libfbclient.dylib "$VCPKG_LIB/libfbclient.dylib.5.0.3" + ln -sf libfbclient.dylib.5.0.3 "$VCPKG_LIB/libfbclient.dylib.2" + ln -sf libfbclient.dylib.5.0.3 "$VCPKG_LIB/libfbclient.dylib" + # Add RPATH so the library can find its dependencies (libtommath, etc.) + install_name_tool -add_rpath /tmp/firebird/Resources "$VCPKG_LIB/libfbclient.dylib.5.0.3" + - name: Run tests + env: + FIREBIRD: /tmp/firebird/Resources + DYLD_LIBRARY_PATH: /tmp/firebird/Libraries:/tmp/firebird/Resources/lib run: | ctest --preset default --verbose diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index e13c802..f84705b 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -58,19 +58,23 @@ jobs: libtomcrypt1 \ mono-complete - - name: Install Firebird - run: | - wget -nv -O Firebird-5.0.3.1683-0-linux-x64.tar.gz \ - "https://github.com/FirebirdSQL/firebird/releases/download/v5.0.3/Firebird-5.0.3.1683-0-linux-x64.tar.gz" - tar xzf Firebird-5.0.3.1683-0-linux-x64.tar.gz - (cd Firebird-5.0.3.1683-0-linux-x64 && sudo ./install.sh -silent) + - name: Cache Firebird environment + id: cache-firebird + uses: actions/cache@v4 + with: + path: /tmp/firebird + key: firebird-embedded-linux-x64-5.0.3 - - name: Configure Firebird + - name: Download Firebird (embedded) + if: steps.cache-firebird.outputs.cache-hit != 'true' run: | - sudo systemctl stop firebird - echo "alter user SYSDBA password 'masterkey';" | \ - sudo /opt/firebird/bin/isql employee -user SYSDBA -q - sudo systemctl start firebird + wget -nv -O /tmp/Firebird.tar.gz \ + "https://github.com/FirebirdSQL/firebird/releases/download/v5.0.3/Firebird-5.0.3.1683-0-linux-x64.tar.gz" + mkdir -p /tmp/firebird-extract + tar xzf /tmp/Firebird.tar.gz -C /tmp/firebird-extract + tar xzf /tmp/firebird-extract/Firebird-5.0.3.1683-0-linux-x64/buildroot.tar.gz -C /tmp/firebird-extract + mv /tmp/firebird-extract/opt/firebird /tmp/firebird + rm -rf /tmp/firebird-extract /tmp/Firebird.tar.gz - name: Bootstrap vcpkg run: | @@ -92,7 +96,7 @@ jobs: - name: Configure CMake run: | - cp CMakeUserPresets.json.posix.template CMakeUserPresets.json + cp CMakeUserPresets.json.embedded-posix.template CMakeUserPresets.json cmake --preset default - name: Upload vcpkg failure logs @@ -108,6 +112,9 @@ jobs: cmake --build --preset default - name: Run tests + env: + FIREBIRD: /tmp/firebird + LD_LIBRARY_PATH: /tmp/firebird/lib run: | ctest --preset default --verbose @@ -129,25 +136,21 @@ jobs: submodules: recursive fetch-depth: 0 - - name: Install Firebird - shell: cmd - run: | - set FB_ZIP=Firebird-5.0.3.1683-0-windows-x64.zip - powershell Invoke-WebRequest ^ - "https://github.com/FirebirdSQL/firebird/releases/download/v5.0.3/$env:FB_ZIP" -OutFile "$env:FB_ZIP" - 7z x -oC:\Firebird %FB_ZIP% - - - name: Configure Firebird - shell: cmd - run: | - echo create user SYSDBA password 'masterkey'; ^ - | "C:\Firebird\isql.exe" employee -user SYSDBA -q + - name: Cache Firebird environment + id: cache-firebird + uses: actions/cache@v4 + with: + path: C:\Firebird + key: firebird-windows-x64-5.0.3 - - name: Start Firebird Server - shell: cmd - working-directory: C:\Firebird + - name: Download Firebird (embedded) + if: steps.cache-firebird.outputs.cache-hit != 'true' + shell: pwsh run: | - call install_service.bat + $url = 'https://github.com/FirebirdSQL/firebird/releases/download/v5.0.3/Firebird-5.0.3.1683-0-windows-x64.zip' + Invoke-WebRequest $url -OutFile Firebird.zip + Expand-Archive Firebird.zip -DestinationPath 'C:\Firebird' + Remove-Item Firebird.zip - name: Bootstrap vcpkg shell: cmd @@ -172,7 +175,7 @@ jobs: - name: Configure CMake shell: cmd run: | - copy CMakeUserPresets.json.windows.template CMakeUserPresets.json + copy CMakeUserPresets.json.embedded-windows.template CMakeUserPresets.json cmake --preset default - name: Upload vcpkg failure logs @@ -188,11 +191,26 @@ jobs: run: | cmake --build --preset default + - name: Prepare Firebird embedded for tests + shell: pwsh + run: | + # Configure Firebird for embedded-only operation + $confPath = 'C:\Firebird\firebird.conf' + Add-Content -Path $confPath -Value "`nProviders = Engine13" + Add-Content -Path $confPath -Value "DatabaseAccess = Full" + + # Remove ALL vcpkg fbclient.dll copies from the build tree so the + # DLL search falls through to PATH -> C:\Firebird\fbclient.dll + Get-ChildItem -Path build -Recurse -Filter 'fbclient.dll' | ForEach-Object { + Write-Host "Removing: $($_.FullName)" + Remove-Item $_.FullName -Force + } + - name: Run tests shell: cmd run: | - set ISC_USER=sysdba - set ISC_PASSWORD=masterkey + set FIREBIRD=C:\Firebird + set PATH=C:\Firebird;%PATH% ctest --preset default --verbose build-macos: @@ -218,18 +236,24 @@ jobs: libtool \ mono - - name: Install Firebird - run: | - wget -nv -O Firebird-5.0.3.1683-0-macos-arm64.pkg \ - "https://github.com/FirebirdSQL/firebird/releases/download/v5.0.3/Firebird-5.0.3.1683-0-macos-arm64.pkg" - sudo installer -verbose -pkg Firebird-5.0.3.1683-0-macos-arm64.pkg -target / + - name: Cache Firebird environment + id: cache-firebird + uses: actions/cache@v4 + with: + path: /tmp/firebird + key: firebird-embedded-macos-arm64-5.0.3 - - name: Configure Firebird + - name: Download Firebird (embedded) + if: steps.cache-firebird.outputs.cache-hit != 'true' run: | - sudo launchctl unload /Library/LaunchDaemons/org.firebird.gds.plist - echo "alter user SYSDBA password 'masterkey';" | \ - sudo /Library/Frameworks/Firebird.framework/Versions/A/Resources/bin/isql employee -user SYSDBA -q - sudo launchctl load /Library/LaunchDaemons/org.firebird.gds.plist + wget -nv -O /tmp/Firebird.pkg \ + "https://github.com/FirebirdSQL/firebird/releases/download/v5.0.3/Firebird-5.0.3.1683-0-macos-arm64.pkg" + pkgutil --expand /tmp/Firebird.pkg /tmp/firebird-pkg + mkdir -p /tmp/firebird-extract + PAYLOAD=$(find /tmp/firebird-pkg -name 'Payload' -type f | head -1) + tar xzf "$PAYLOAD" -C /tmp/firebird-extract + mv /tmp/firebird-extract/Versions/A /tmp/firebird + rm -rf /tmp/firebird-pkg /tmp/firebird-extract /tmp/Firebird.pkg - name: Bootstrap vcpkg run: | @@ -251,7 +275,7 @@ jobs: - name: Configure CMake run: | - cp CMakeUserPresets.json.posix.template CMakeUserPresets.json + cp CMakeUserPresets.json.embedded-posix.template CMakeUserPresets.json cmake --preset default - name: Upload vcpkg failure logs @@ -266,6 +290,23 @@ jobs: run: | cmake --build --preset default + - name: Prepare Firebird embedded for tests + run: | + # Replace vcpkg's client-only libfbclient with the full distribution + # version that includes the embedded engine provider. + VCPKG_LIB=$(find build/vcpkg_installed -path '*/debug/lib' -type d | head -1) + # Remove vcpkg's client-only copies + find "$VCPKG_LIB" -name 'libfbclient.dylib*' -exec rm -f {} \; + # Copy full distribution library and create versioned symlinks + cp /tmp/firebird/Libraries/libfbclient.dylib "$VCPKG_LIB/libfbclient.dylib.5.0.3" + ln -sf libfbclient.dylib.5.0.3 "$VCPKG_LIB/libfbclient.dylib.2" + ln -sf libfbclient.dylib.5.0.3 "$VCPKG_LIB/libfbclient.dylib" + # Add RPATH so the library can find its dependencies (libtommath, etc.) + install_name_tool -add_rpath /tmp/firebird/Resources "$VCPKG_LIB/libfbclient.dylib.5.0.3" + - name: Run tests + env: + FIREBIRD: /tmp/firebird/Resources + DYLD_LIBRARY_PATH: /tmp/firebird/Libraries:/tmp/firebird/Resources/lib run: | ctest --preset default --verbose diff --git a/CMakeUserPresets.json.embedded-posix.template b/CMakeUserPresets.json.embedded-posix.template new file mode 100644 index 0000000..ff466b0 --- /dev/null +++ b/CMakeUserPresets.json.embedded-posix.template @@ -0,0 +1,31 @@ +{ + "version": 3, + "configurePresets": [ + { + "name": "default", + "inherits": [ + "posix-ninja-debug" + ] + } + ], + "buildPresets": [ + { + "name": "default", + "inherits": [ + "posix-ninja-debug" + ] + } + ], + "testPresets": [ + { + "name": "default", + "inherits": [ + "posix-ninja-debug" + ], + "environment": { + "ISC_USER": "sysdba", + "ISC_PASSWORD": "masterkey" + } + } + ] +} diff --git a/CMakeUserPresets.json.embedded-windows.template b/CMakeUserPresets.json.embedded-windows.template new file mode 100644 index 0000000..442d3c2 --- /dev/null +++ b/CMakeUserPresets.json.embedded-windows.template @@ -0,0 +1,31 @@ +{ + "version": 3, + "configurePresets": [ + { + "name": "default", + "inherits": [ + "windows-vs2022" + ] + } + ], + "buildPresets": [ + { + "name": "default", + "inherits": [ + "windows-vs2022-debug" + ] + } + ], + "testPresets": [ + { + "name": "default", + "inherits": [ + "windows-vs2022-debug" + ], + "environment": { + "ISC_USER": "sysdba", + "ISC_PASSWORD": "masterkey" + } + } + ] +} From e8d5e045ce937ab02937f7d6c5f68bc218c9f7aa Mon Sep 17 00:00:00 2001 From: "F.D.Castel" Date: Wed, 25 Feb 2026 04:26:46 +0000 Subject: [PATCH 2/2] Fix vcpkg cache paths for Linux and macOS The vcpkg cache was configured with build/Release/vcpkg_installed but CMakePresets.json sets VCPKG_INSTALLED_DIR to build/vcpkg_installed (shared across all presets). This caused a cache miss on every run, rebuilding all vcpkg packages from source (~9 min). Fixed: - main.yml: use build/vcpkg_installed for Linux and macOS (matching VCPKG_INSTALLED_DIR in CMakePresets.json) - pull-request.yml: add missing vcpkg cache steps for all platforms - Bump cache key version to invalidate stale entries --- .github/workflows/main.yml | 16 ++++++------- .github/workflows/pull-request.yml | 36 ++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8682d55..4065f9e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -53,10 +53,10 @@ jobs: vcpkg/downloads vcpkg/buildtrees vcpkg/packages - build/Release/vcpkg_installed - key: ${{ runner.os }}-vcpkg-${{ hashFiles('vcpkg.json', 'vcpkg-configuration.json') }} + build/vcpkg_installed + key: ${{ runner.os }}-vcpkg-v3-${{ hashFiles('vcpkg.json', 'vcpkg-configuration.json') }} restore-keys: | - ${{ runner.os }}-vcpkg- + ${{ runner.os }}-vcpkg-v3- - name: Install system dependencies run: | @@ -165,9 +165,9 @@ jobs: vcpkg/buildtrees vcpkg/packages build/vcpkg_installed - key: ${{ runner.os }}-vcpkg-${{ hashFiles('vcpkg.json', 'vcpkg-configuration.json') }} + key: ${{ runner.os }}-vcpkg-v3-${{ hashFiles('vcpkg.json', 'vcpkg-configuration.json') }} restore-keys: | - ${{ runner.os }}-vcpkg- + ${{ runner.os }}-vcpkg-v3- - name: Cache Firebird environment id: cache-firebird @@ -267,10 +267,10 @@ jobs: vcpkg/downloads vcpkg/buildtrees vcpkg/packages - build/Release/vcpkg_installed - key: ${{ runner.os }}-vcpkg-${{ hashFiles('vcpkg.json', 'vcpkg-configuration.json') }} + build/vcpkg_installed + key: ${{ runner.os }}-vcpkg-v3-${{ hashFiles('vcpkg.json', 'vcpkg-configuration.json') }} restore-keys: | - ${{ runner.os }}-vcpkg- + ${{ runner.os }}-vcpkg-v3- - name: Install system dependencies run: | diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index f84705b..2e55da3 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -42,6 +42,18 @@ jobs: submodules: recursive fetch-depth: 0 + - name: Cache vcpkg artifacts + uses: actions/cache@v4 + with: + path: | + vcpkg/downloads + vcpkg/buildtrees + vcpkg/packages + build/vcpkg_installed + key: ${{ runner.os }}-vcpkg-v3-${{ hashFiles('vcpkg.json', 'vcpkg-configuration.json') }} + restore-keys: | + ${{ runner.os }}-vcpkg-v3- + - name: Install system dependencies run: | sudo apt-get update @@ -136,6 +148,18 @@ jobs: submodules: recursive fetch-depth: 0 + - name: Cache vcpkg artifacts + uses: actions/cache@v4 + with: + path: | + vcpkg/downloads + vcpkg/buildtrees + vcpkg/packages + build/vcpkg_installed + key: ${{ runner.os }}-vcpkg-v3-${{ hashFiles('vcpkg.json', 'vcpkg-configuration.json') }} + restore-keys: | + ${{ runner.os }}-vcpkg-v3- + - name: Cache Firebird environment id: cache-firebird uses: actions/cache@v4 @@ -227,6 +251,18 @@ jobs: submodules: recursive fetch-depth: 0 + - name: Cache vcpkg artifacts + uses: actions/cache@v4 + with: + path: | + vcpkg/downloads + vcpkg/buildtrees + vcpkg/packages + build/vcpkg_installed + key: ${{ runner.os }}-vcpkg-v3-${{ hashFiles('vcpkg.json', 'vcpkg-configuration.json') }} + restore-keys: | + ${{ runner.os }}-vcpkg-v3- + - name: Install system dependencies run: | brew install \