├── .github ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── PULL_REQUEST_TEMPLATE.md ├── codeql │ └── codeql-configuration.yml └── workflows │ ├── codeql.yml │ ├── git-release.yml │ ├── node-release.yml │ └── node-test.yml ├── .gitignore ├── .prettierrc.json ├── LICENSE ├── README.md ├── __tests__ ├── cache.test.ts └── utils.test.ts ├── action.yml ├── dist └── index.js ├── eslint.config.mjs ├── jest.config.js ├── package-lock.json ├── package.json ├── src ├── cache.ts ├── lists │ ├── darwin-deps │ ├── darwin-extensions │ ├── focal-libs │ ├── jammy-libs │ ├── linux-deps │ └── noble-libs ├── scripts │ ├── cache.sh │ ├── darwin.sh │ └── linux.sh └── utils.ts └── tsconfig.json /.github/CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at contact@shivammathur.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq -------------------------------------------------------------------------------- /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to cache-extensions 2 | 3 | ## Contributor Code of Conduct 4 | 5 | Please note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms. 6 | 7 | ## Workflow 8 | 9 | * Fork the project. 10 | * Make your bug fix or feature addition. 11 | * Add tests for it. This is important so we don't break it in a future version unintentionally. 12 | * Send a pull request to the develop branch. 13 | 14 | Please make sure that you have [set up your user name and email address](https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup) for use with Git. Strings such as `silly nick name ` look really stupid in the commit history of a project. 15 | 16 | Due to time constraints, you may not always get a quick response. Please do not take delays personal and feel free to remind. 17 | 18 | ## Coding Guidelines 19 | 20 | This project comes with `.prettierrc.json` and `eslintrc.json` configuration files. Please run the following commands to format the code before committing it. 21 | 22 | ```bash 23 | $ npm run format 24 | $ npm run lint 25 | ``` 26 | 27 | ## Using cache-extensions from a Git checkout 28 | 29 | The following commands can be used to perform the initial checkout of cache-extensions: 30 | 31 | ```bash 32 | $ git clone https://github.com/shivammathur/cache-extensions.git 33 | 34 | $ cd cache-extensions 35 | ``` 36 | 37 | Install cache-extensions dependencies using [npm](https://www.npmjs.com/): 38 | 39 | ```bash 40 | $ npm install 41 | ``` 42 | 43 | ## Running the test suite 44 | 45 | After following the steps shown above, The `cache-extensions` tests in the `__tests__` directory can be run using this command: 46 | 47 | ```bash 48 | $ npm test 49 | ``` 50 | 51 | ## Creating a release 52 | 53 | Create a release before you push your changes. 54 | 55 | ```bash 56 | $ npm run build 57 | $ npm run release 58 | ``` 59 | 60 | ## Reporting issues 61 | 62 | Please submit the issue using the appropriate template provided for a bug report or a feature request: 63 | 64 | * [Issues](https://github.com/shivammathur/cache-extensions/issues) 65 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Nice, you found a bug! 4 | title: '' 5 | labels: 'bug' 6 | assignees: 'shivammathur' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | 12 | 13 | **Version** 14 | - [ ] I have checked releases and the bug exists in the latest patch version of `v1`. 15 | - [ ] `v2` 16 | - [ ] `v1` 17 | 18 | **Runners** 19 | 20 | - [ ] GitHub Hosted 21 | - [ ] Self Hosted 22 | 23 | **Operating systems** 24 | 25 | 26 | **PHP versions** 27 | 28 | 29 | **To Reproduce** 30 | 31 | 32 | **Expected behavior** 33 | 34 | 35 | **Screenshots/Logs** 36 | 37 | 38 | **Additional context** 39 | 40 | 41 | **Are you willing to submit a PR?** 42 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest a new feature 4 | title: '' 5 | labels: 'enhancement' 6 | assignees: 'shivammathur' 7 | 8 | --- 9 | 10 | **Describe the feature** 11 | 12 | 13 | **Version** 14 | - [ ] I have checked releases and the feature is missing in the latest patch version of `v1`. 15 | 16 | **Underlying issue** 17 | 18 | 19 | **Describe alternatives** 20 | 21 | 22 | **Additional context** 23 | 24 | 25 | **Are you willing to submit a PR?** 26 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 🐞 Bug Fix, ⚙ Improvement or 🎉 New Feature 3 | about: You found a bug, want to improve something or add a new feature 4 | labels: bug or enhancement 5 | 6 | --- 7 | 8 | ## A Pull Request should be associated with an Issue. 9 | 10 | > If you're fixing a bug, adding a new feature or improving something please provide the details in Issues, 11 | > so that the development can be pointed in the intended direction. 12 | 13 | Related issue: 14 | 15 | > Further notes in [Contribution Guidelines](.github/CONTRIBUTING.md) 16 | > Thank you for your contribution. 17 | 18 | ### Description 19 | 20 | This PR [briefly explain what it does] 21 | 22 | > In case this PR introduced TypeScript/JavaScript code changes: 23 | 24 | - [ ] I have written test cases for the changes in this pull request 25 | - [ ] I have run `npm run format` before the commit. 26 | - [ ] I have run `npm run lint` before the commit. 27 | - [ ] I have run `npm run release` before the commit. 28 | - [ ] `npm test` returns with no unit test errors and all code covered. 29 | 30 | > In case this PR edits any scripts: 31 | 32 | - [ ] I have checked the edited scripts for syntax. 33 | - [ ] I have tested the changes in an integration test (If yes, provide workflow link). 34 | 35 | -------------------------------------------------------------------------------- /.github/codeql/codeql-configuration.yml: -------------------------------------------------------------------------------- 1 | name : CodeQL Configuration 2 | 3 | paths: 4 | - './src' 5 | -------------------------------------------------------------------------------- /.github/workflows/codeql.yml: -------------------------------------------------------------------------------- 1 | name: CodeQL Workflow 2 | on: 3 | workflow_dispatch: 4 | schedule: 5 | - cron: '0 15 * * 6' 6 | jobs: 7 | codeql: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: Checkout 11 | uses: actions/checkout@v3 12 | with: 13 | fetch-depth: 2 14 | 15 | - name: Initialize CodeQL 16 | uses: github/codeql-action/init@v3 17 | with: 18 | config-file: ./.github/codeql/codeql-configuration.yml 19 | languages: javascript 20 | 21 | - name: Autobuild 22 | uses: github/codeql-action/autobuild@v3 23 | 24 | - name: Perform CodeQL Analysis 25 | uses: github/codeql-action/analyze@v3 26 | -------------------------------------------------------------------------------- /.github/workflows/git-release.yml: -------------------------------------------------------------------------------- 1 | name: Git release workflow 2 | on: 3 | workflow_dispatch: 4 | schedule: 5 | - cron: '0 15 * * *' 6 | jobs: 7 | update: 8 | name: update 9 | runs-on: ${{ matrix.os }} 10 | strategy: 11 | fail-fast: false 12 | matrix: 13 | os: [ubuntu-24.04, ubuntu-22.04] 14 | steps: 15 | - name: Update lists 16 | run: | 17 | . /etc/os-release 18 | dpkg -l | awk '($1 == "ii") && ($2 ~ /^lib|lib$/) { print $2 }' | sed 's/:amd64//' > /tmp/"$VERSION_CODENAME"-libs 19 | - name: Upload Artifact 20 | uses: actions/upload-artifact@v4 21 | with: 22 | name: lists-${{ matrix.os }} 23 | path: | 24 | /tmp/*-libs 25 | 26 | sync: 27 | name: sync 28 | needs: update 29 | runs-on: ubuntu-latest 30 | steps: 31 | - name: Checkout 32 | uses: actions/checkout@v4 33 | with: 34 | ref: develop 35 | fetch-depth: 0 36 | - name: Download lists 37 | uses: actions/download-artifact@v4 38 | with: 39 | pattern: lists-* 40 | merge-multiple: true 41 | path: src/lists 42 | - name: Add brew to PATH 43 | run: echo "/home/linuxbrew/.linuxbrew/bin" >> $GITHUB_PATH 44 | - name: Update darwin extensions list 45 | run: | 46 | brew tap shivammathur/extensions 47 | find "$(brew --repository shivammathur/extensions)"/.github/deps -maxdepth 1 -type d -name "*" -exec basename {} \; | sort > src/lists/darwin-extensions 48 | - name: Update tags and branches 49 | run: | 50 | push_ref() { 51 | ref=$1 52 | git push -f https://${{ github.repository_owner }}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git "$ref" || true 53 | } 54 | git config --local user.email "$bot_user_id+github-actions[bot]@users.noreply.github.com" 55 | git config --local user.name "github-actions[bot]" 56 | if [ "$(git status --porcelain=v1 2>/dev/null | wc -l)" != "0" ]; then 57 | git add . 58 | git commit -m "Updating lists" 59 | fi 60 | push_ref develop 61 | semver=$(git for-each-ref --sort=version:refname --format '%(refname:short)' refs/tags | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | tail -n 1) 62 | rolling=$(git tag --sort=-refname | awk 'match($0, /^v[0-9]/)' | head -n 1) 63 | for branch in master releases/$rolling; do 64 | git checkout $branch 65 | if [ "$(git rev-parse "$branch")" != "$(git rev-parse develop)" ]; then 66 | git merge --allow-unrelated-histories develop || true 67 | fi 68 | push_ref "$branch" 69 | done 70 | for tag in $semver $rolling; do 71 | git tag -fa "$tag" -m "Update %1 tag" 72 | push_ref "$tag" 73 | done 74 | -------------------------------------------------------------------------------- /.github/workflows/node-release.yml: -------------------------------------------------------------------------------- 1 | name: Node release workflow 2 | on: 3 | release: 4 | types: [created] 5 | workflow_dispatch: 6 | inputs: 7 | skip: 8 | description: Skip release to repository 9 | required: false 10 | tag: 11 | description: Tag name 12 | required: true 13 | jobs: 14 | build: 15 | runs-on: ubuntu-latest 16 | permissions: 17 | contents: read 18 | packages: write 19 | steps: 20 | - name: Checkout release 21 | if: github.event_name != 'workflow_dispatch' 22 | uses: actions/checkout@v4 23 | 24 | - name: Checkout tag 25 | uses: actions/checkout@v4 26 | if: github.event_name == 'workflow_dispatch' 27 | with: 28 | ref: ${{ github.event.inputs.tag }} 29 | 30 | - name: Setup Node.js 31 | uses: actions/setup-node@v4 32 | with: 33 | node-version: '20.x' 34 | registry-url: https://registry.npmjs.org 35 | 36 | - name: Install dependencies and add lib 37 | run: | 38 | npm install 39 | npm run build 40 | sed -i -e '/lib\//d' .gitignore 41 | 42 | - name: Publish to NPM 43 | if: "!contains(github.event.inputs.skip, 'skip-npm')" 44 | run: npm publish --access public 45 | env: 46 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 47 | 48 | - name: Change to GitHub Packages registry 49 | uses: actions/setup-node@v4 50 | with: 51 | registry-url: https://npm.pkg.github.com 52 | scope: '@shivammathur' 53 | 54 | - name: Patch package.json 55 | run: | 56 | sed -i 's#"name": "#"name": "@shivammathur/#' package.json 57 | - name: Publish to GitHub Packages 58 | if: "!contains(github.event.inputs.skip, 'skip-github-packages')" 59 | run: npm publish 60 | env: 61 | NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} 62 | -------------------------------------------------------------------------------- /.github/workflows/node-test.yml: -------------------------------------------------------------------------------- 1 | name: Node test workflow 2 | on: [push, pull_request] 3 | jobs: 4 | run: 5 | name: Run 6 | runs-on: ${{ matrix.operating-system }} 7 | strategy: 8 | fail-fast: false 9 | matrix: 10 | operating-system: [ubuntu-latest, windows-latest, macos-latest] 11 | steps: 12 | - name: Checkout 13 | uses: actions/checkout@v4 14 | with: 15 | fetch-depth: 2 16 | 17 | - name: Setup Node.js 20.x 18 | uses: actions/setup-node@v4 19 | with: 20 | node-version: 20.x 21 | 22 | - name: Install dependencies 23 | run: npm install 24 | 25 | - name: Prettier Format Check 26 | run: npm run format-check 27 | 28 | - name: ESLint Check 29 | run: npm run lint 30 | 31 | - name: Run npm audit 32 | run: npm audit 33 | 34 | - name: Run npm test 35 | run: npm test 36 | 37 | - name: Send Coverage 38 | uses: codecov/codecov-action@v4 39 | with: 40 | token: ${{ secrets.CODECOV_TOKEN }} 41 | files: coverage/lcov.info 42 | name: github-actions-codecov-${{ matrix.operating-system }} 43 | fail_ci_if_error: false 44 | verbose: true 45 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Explicitly not ignoring node_modules so that they are included in package downloaded by runner 2 | node_modules/ 3 | __tests__/runner/* 4 | lib/ 5 | 6 | # Rest of the file pulled from https://github.com/github/gitignore/blob/master/Node.gitignore 7 | # Logs 8 | logs 9 | *.log 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | lerna-debug.log* 14 | 15 | # Diagnostic reports (https://nodejs.org/api/report.html) 16 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 17 | 18 | # Runtime data 19 | pids 20 | *.pid 21 | *.seed 22 | *.pid.lock 23 | 24 | # Directory for instrumented libs generated by jscoverage/JSCover 25 | lib-cov 26 | 27 | # Coverage directory used by tools like istanbul 28 | coverage 29 | *.lcov 30 | 31 | # nyc test coverage 32 | .nyc_output 33 | 34 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 35 | .grunt 36 | 37 | # Bower dependency directory (https://bower.io/) 38 | bower_components 39 | 40 | # node-waf configuration 41 | .lock-wscript 42 | 43 | # Compiled binary addons (https://nodejs.org/api/addons.html) 44 | build/Release 45 | 46 | # Dependency directories 47 | jspm_packages/ 48 | 49 | # TypeScript v1 declaration files 50 | typings/ 51 | 52 | # TypeScript cache 53 | *.tsbuildinfo 54 | 55 | # Optional npm cache directory 56 | .npm 57 | 58 | # Optional eslint cache 59 | .eslintcache 60 | 61 | # Optional REPL history 62 | .node_repl_history 63 | 64 | # Output of 'npm pack' 65 | *.tgz 66 | 67 | # Yarn Integrity file 68 | .yarn-integrity 69 | 70 | # dotenv environment variables file 71 | .env 72 | .env.test 73 | 74 | # parcel-bundler cache (https://parceljs.org/) 75 | .cache 76 | 77 | # next.js build output 78 | .next 79 | 80 | # nuxt.js build output 81 | .nuxt 82 | 83 | # vuepress build output 84 | .vuepress/dist 85 | 86 | # Serverless directories 87 | .serverless/ 88 | 89 | # FuseBox cache 90 | .fusebox/ 91 | 92 | # DynamoDB Local files 93 | .dynamodb/ -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "arrowParens": "avoid", 3 | "bracketSpacing": false, 4 | "endOfLine": "auto", 5 | "parser": "typescript", 6 | "printWidth": 80, 7 | "semi": true, 8 | "singleQuote": true, 9 | "tabWidth": 2, 10 | "trailingComma": "none", 11 | "useTabs": false 12 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | The MIT License (MIT) 3 | 4 | Copyright (c) 2020-2023 shivammathur and contributors 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in 14 | all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Cache PHP extensions in GitHub Actions

2 | 3 |

4 | GitHub Actions status 5 | Codecov Code Coverage 6 | LICENSE 7 | PHP Versions Supported 8 |

9 | 10 | Cache PHP extensions in [GitHub Actions](https://github.com/features/actions "GitHub Actions"). This action has to be used along with [shivammathur/setup-php](https://github.com/shivammathur/setup-php "Setup PHP") and [actions/cache](https://github.com/actions/cache "Cache in GitHub Actions") GitHub Actions. It configures the environment required to cache PHP extensions. Refer to [Usage](#memo-usage "How to use this") section for details and example workflow. 11 | 12 | ## Contents 13 | 14 | - [PHP Support](#tada-php-support) 15 | - [OS/Platform Support](#cloud-osplatform-support) 16 | - [Usage](#memo-usage) 17 | - [Inputs](#inputs) 18 | - [Workflow](#workflow) 19 | - [Thread Safe Setup](#thread-safe-setup) 20 | - [License](#scroll-license) 21 | - [Contributions](#1-contributions) 22 | - [Support This Project](#sparkling_heart-support-this-project) 23 | - [Dependencies](#package-dependencies) 24 | 25 | ## :tada: PHP Support 26 | 27 | |PHP Version|Stability|Release Support| 28 | |--- |--- |--- | 29 | |5.3|`Stable`|`End of life`| 30 | |5.4|`Stable`|`End of life`| 31 | |5.5|`Stable`|`End of life`| 32 | |5.6|`Stable`|`End of life`| 33 | |7.0|`Stable`|`End of life`| 34 | |7.1|`Stable`|`End of life`| 35 | |7.2|`Stable`|`End of life`| 36 | |7.3|`Stable`|`End of life`| 37 | |7.4|`Stable`|`End of life`| 38 | |8.0|`Stable`|`End of life`| 39 | |8.1|`Stable`|`Security fixes only`| 40 | |8.2|`Stable`|`Security fixes only`| 41 | |8.3|`Stable`|`Active`| 42 | |8.4|`Stable`|`Active`| 43 | |8.5|`Nightly`|`In development`| 44 | 45 | ## :cloud: OS/Platform Support 46 | 47 | | Virtual environment | Arch | YAML workflow label | 48 | |---------------------|---------|------------------------------------| 49 | | Ubuntu 24.04 | x86_64 | `ubuntu-latest` or `ubuntu-24.04` | 50 | | Ubuntu 22.04 | x86_64 | `ubuntu-22.04` | 51 | | Ubuntu 24.04 | aarch64 | `ubuntu-24.04-arm` | 52 | | Ubuntu 22.04 | aarch64 | `ubuntu-22.04-arm` | 53 | | Windows Server 2025 | x64 | `windows-2025` | 54 | | Windows Server 2022 | x64 | `windows-latest` or `windows-2022` | 55 | | Windows Server 2019 | x64 | `windows-2019` | 56 | | macOS Sequoia 15.x | arm64 | `macos-15` | 57 | | macOS Sonoma 14.x | arm64 | `macos-latest` or `macos-14` | 58 | | macOS Ventura 13.x | x86_64 | `macos-13` | 59 | 60 | **Note**: Support for self-hosted runners for the above operating systems is in beta. If you use this action on a self-hosted runner, please report any issues you find. 61 | 62 | ## :memo: Usage 63 | 64 | Use this GitHub Action when the extensions you are adding in [setup-php](https://github.com/shivammathur/setup-php "setup-php GitHub Action") are installed and take a long time to set up. If you are using extensions which have the result `Installed and enabled` in the logs like `pecl` extensions on `Ubuntu` or extensions which have custom support, it is recommended to use this action to cache your extensions. 65 | 66 | ### Inputs 67 | 68 | #### `php-version` (optional) 69 | 70 | - Specify the PHP version you want to set up. 71 | - Accepts a `string`. For example `'8.0'`. 72 | - Accepts `latest` to set up the latest stable PHP version. 73 | - Accepts `nightly` to set up a nightly build from the master branch of PHP. 74 | - Accepts the format `d.x`, where `d` is the major version. For example `5.x`, `7.x` and `8.x`. 75 | - See [PHP support](#tada-php-support) for the supported PHP versions. 76 | - If not specified, it looks for `php-version-file` input. 77 | 78 | #### `php-version-file` (optional) 79 | 80 | - Specify a file with the PHP version you want to set up. 81 | - Accepts a `string`. For example `'.phpenv-version'`. 82 | - See [PHP support](#tada-php-support) for the supported PHP versions. 83 | - By default, `.php-version` file is used. 84 | - If not specified and the default `.php-version` file is not found, the latest stable PHP version is set up. 85 | 86 | #### `extensions` (required) 87 | 88 | - Specify the extensions you want to set up. 89 | - Accepts a `string` in csv-format. For example `mbstring, xdebug, :opcache`. 90 | - Extensions prefixed with `:` are ignored in output cache key. 91 | 92 | #### `key` (required) 93 | 94 | - Specify the key to identify the cache version. 95 | - Accepts any `string`. For example `cache-v1`. 96 | - Changing this would reset the cache. 97 | 98 | See [action.yml](action.yml "Metadata for this GitHub Action") and usage below for more info. 99 | 100 | ### Workflow 101 | 102 | > Cache extensions in a PHP workflow 103 | 104 | ```yaml 105 | jobs: 106 | run: 107 | runs-on: ${{ matrix.operating-system }} 108 | strategy: 109 | matrix: 110 | operating-system: [ubuntu-latest, windows-latest, macos-latest] 111 | php-versions: ['8.1', '8.2', '8.3'] 112 | name: PHP ${{ matrix.php-versions }} Test on ${{ matrix.operating-system }} 113 | env: 114 | extensions: intl, pcov 115 | key: cache-v1 # can be any string, change to clear the extension cache. 116 | steps: 117 | - name: Checkout 118 | uses: actions/checkout@v4 119 | 120 | - name: Setup cache environment 121 | id: extcache 122 | uses: shivammathur/cache-extensions@v1 123 | with: 124 | php-version: ${{ matrix.php-versions }} 125 | extensions: ${{ env.extensions }} 126 | key: ${{ env.key }} 127 | 128 | - name: Cache extensions 129 | uses: actions/cache@v4 130 | with: 131 | path: ${{ steps.extcache.outputs.dir }} 132 | key: ${{ steps.extcache.outputs.key }} 133 | restore-keys: ${{ steps.extcache.outputs.key }} 134 | 135 | - name: Setup PHP 136 | uses: shivammathur/setup-php@v2 137 | with: 138 | php-version: ${{ matrix.php-versions }} 139 | extensions: ${{ env.extensions }} 140 | ``` 141 | 142 | ### Thread Safe Setup 143 | 144 | If you set up both `TS` and `NTS` PHP versions in your workflow, please add `${{ env.phpts }}` to `key` and `restore-keys` inputs in `actions/cache` step in the above workflow to avoid a conflicting cache. 145 | 146 | ```yaml 147 | - name: Cache extensions 148 | uses: actions/cache@v4 149 | with: 150 | path: ${{ steps.extcache.outputs.dir }} 151 | key: ${{ steps.extcache.outputs.key }}-${{ env.phpts }} 152 | restore-keys: ${{ steps.extcache.outputs.key }}-${{ env.phpts }} 153 | ``` 154 | 155 | ## :scroll: License 156 | 157 | The code and documentation in this project are under the [MIT License](LICENSE "License for shivammathur/cache-extensions"). This project has multiple [dependencies](https://github.com/shivammathur/cache-extensions/network/dependencies "Dependencies for this PHP Action"). Their licenses can be found in their respective repositories. 158 | 159 | ## :+1: Contributions 160 | 161 | Contributions are welcome! See [Contributor's Guide](.github/CONTRIBUTING.md "shivammathur/cache-extensions contribution guide"). If you face any issues while using this or want to suggest a feature/improvement, create an issue [here](https://github.com/shivammathur/cache-extensions/issues "Issues reported"). 162 | 163 | ## :sparkling_heart: Support This Project 164 | 165 | This project is generously supported by many users and organisations via [GitHub Sponsors](https://github.com/sponsors/shivammathur). 166 | 167 | Sponsor shivammathur 168 | 169 | ## :package: Dependencies 170 | 171 | - [Node.js dependencies](https://github.com/shivammathur/cache-extensions/network/dependencies "Node.js dependencies") 172 | -------------------------------------------------------------------------------- /__tests__/cache.test.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import * as spu from 'setup-php/lib/utils'; 3 | import * as cache from '../src/cache'; 4 | import * as utils from '../src/utils'; 5 | 6 | /** 7 | * Mock cache.ts 8 | */ 9 | jest.mock('../src/cache', () => ({ 10 | run: jest.fn().mockImplementation(async (): Promise => { 11 | const version: string = await spu.parseVersion( 12 | process.env['php-version'] || '' 13 | ); 14 | const extensions = await utils.filterExtensions( 15 | process.env['extensions'] || '' 16 | ); 17 | const key: string = process.env['key'] || ''; 18 | return await utils.scriptCall('test', extensions, key, version); 19 | }) 20 | })); 21 | 22 | /** 23 | * Function to set the process.env 24 | * 25 | * @param version 26 | * @param extensions 27 | * @param key 28 | */ 29 | function setEnv( 30 | version: string | number, 31 | extensions: string, 32 | key: string 33 | ): void { 34 | process.env['php-version'] = version.toString(); 35 | process.env['extensions'] = extensions; 36 | process.env['key'] = key; 37 | } 38 | 39 | describe('Install', () => { 40 | const spath: string = path.join(__dirname, '../src/scripts/cache.sh'); 41 | it('Test Run', async () => { 42 | setEnv('7.0', 'xdebug, pcov', 'cache-v1'); 43 | const script: string = '' + (await cache.run()); 44 | expect(script).toContain(`bash ${spath} test "xdebug, pcov" cache-v1 7.0`); 45 | }); 46 | 47 | it('Test Run', async () => { 48 | setEnv('7.4', 'xdebug, zip', 'cache-v2'); 49 | const script: string = '' + (await cache.run()); 50 | expect(script).toContain(`bash ${spath} test "xdebug, zip" cache-v2 7.4`); 51 | }); 52 | 53 | it('Test Run', async () => { 54 | setEnv('7.4', 'xdebug, :zip', 'cache-v2'); 55 | const script: string = '' + (await cache.run()); 56 | expect(script).toContain(`bash ${spath} test "xdebug" cache-v2 7.4`); 57 | }); 58 | }); 59 | -------------------------------------------------------------------------------- /__tests__/utils.test.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs'; 2 | import * as path from 'path'; 3 | import * as utils from '../src/utils'; 4 | 5 | async function cleanup(path: string): Promise { 6 | fs.unlink(path, error => { 7 | if (error) { 8 | console.log(error); 9 | } 10 | }); 11 | } 12 | 13 | describe('Utils tests', () => { 14 | it('checking getOutput', async () => { 15 | const temp_dir: string = process.env['RUNNER_TEMP'] || ''; 16 | const file_path: string = path.join(temp_dir, 'test'); 17 | fs.writeFileSync(file_path, 'test', {mode: 0o755}); 18 | expect(await utils.getOutput('test')).toBe('test'); 19 | await cleanup(file_path); 20 | }); 21 | 22 | it('checking filterExtensions', async () => { 23 | expect(await utils.filterExtensions('a,:b,c')).toBe('"a,c"'); 24 | expect(await utils.filterExtensions('a, :b, c')).toBe('"a, c"'); 25 | }); 26 | 27 | it('checking scriptCall', async () => { 28 | const script: string = path.join(__dirname, '../src/scripts/cache.sh'); 29 | expect(await utils.scriptCall('test a b')).toBe( 30 | ['bash', script, 'test', 'a', 'b'].join(' ') 31 | ); 32 | }); 33 | }); 34 | -------------------------------------------------------------------------------- /action.yml: -------------------------------------------------------------------------------- 1 | name: 'Cache PHP Extensions' 2 | author: shivammathur 3 | description: 'Cache PHP Extensions in GitHub Actions' 4 | branding: 5 | color: 'purple' 6 | icon: 'box' 7 | inputs: 8 | php-version: 9 | description: 'Setup PHP version.' 10 | required: false 11 | php-version-file: 12 | description: 'Setup PHP version from a file.' 13 | required: false 14 | extensions: 15 | description: 'Extensions you want to cache.' 16 | required: true 17 | key: 18 | description: 'Key to version the cache hash.' 19 | required: true 20 | runs: 21 | using: 'node20' 22 | main: 'dist/index.js' 23 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import {fixupConfigRules, fixupPluginRules} from '@eslint/compat'; 2 | // eslint-disable-next-line import/no-unresolved 3 | import typescriptEslint from '@typescript-eslint/eslint-plugin'; 4 | import jest from 'eslint-plugin-jest'; 5 | import globals from 'globals'; 6 | // eslint-disable-next-line import/no-unresolved 7 | import tsParser from '@typescript-eslint/parser'; 8 | import path from 'node:path'; 9 | import {fileURLToPath} from 'node:url'; 10 | import js from '@eslint/js'; 11 | import {FlatCompat} from '@eslint/eslintrc'; 12 | 13 | const __filename = fileURLToPath(import.meta.url); 14 | const __dirname = path.dirname(__filename); 15 | const compat = new FlatCompat({ 16 | baseDirectory: __dirname, 17 | recommendedConfig: js.configs.recommended, 18 | allConfig: js.configs.all 19 | }); 20 | 21 | export default [ 22 | ...fixupConfigRules( 23 | compat.extends( 24 | 'eslint:recommended', 25 | 'plugin:@typescript-eslint/eslint-recommended', 26 | 'plugin:@typescript-eslint/recommended', 27 | 'plugin:import/errors', 28 | 'plugin:import/warnings', 29 | 'plugin:import/typescript', 30 | 'plugin:prettier/recommended', 31 | 'prettier' 32 | ) 33 | ), 34 | { 35 | plugins: { 36 | '@typescript-eslint': fixupPluginRules(typescriptEslint), 37 | jest 38 | }, 39 | 40 | languageOptions: { 41 | globals: { 42 | ...globals.node, 43 | ...globals.jest 44 | }, 45 | 46 | parser: tsParser, 47 | ecmaVersion: 2021, 48 | sourceType: 'module' 49 | } 50 | } 51 | ]; -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | clearMocks: true, 3 | moduleFileExtensions: ['js', 'ts'], 4 | testEnvironment: 'node', 5 | testMatch: ['**/*.test.ts'], 6 | testRunner: 'jest-circus/runner', 7 | transform: { 8 | '^.+\\.ts$': 'ts-jest' 9 | }, 10 | verbose: true, 11 | collectCoverage: true 12 | }; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cache-extensions", 3 | "version": "1.12.0", 4 | "private": false, 5 | "description": "Cache PHP extensions in GitHub Actions", 6 | "main": "lib/cache.js", 7 | "types": "lib/cache.d.ts", 8 | "directories": { 9 | "lib": "lib", 10 | "test": "__tests__", 11 | "src": "src" 12 | }, 13 | "files": [ 14 | "lib", 15 | "src" 16 | ], 17 | "scripts": { 18 | "build": "tsc", 19 | "lint": "eslint **/src/*.ts --cache --fix", 20 | "format": "prettier --write **/src/*.ts && git add .", 21 | "format-check": "prettier --check **/src/*.ts", 22 | "release": "ncc build -m -o dist && git add -f dist/", 23 | "test": "jest" 24 | }, 25 | "repository": { 26 | "type": "git", 27 | "url": "git+https://github.com/shivammathur/cache-extensions.git" 28 | }, 29 | "keywords": [ 30 | "actions", 31 | "php", 32 | "extension", 33 | "cache" 34 | ], 35 | "author": "shivammathur", 36 | "license": "MIT", 37 | "dependencies": { 38 | "@actions/cache": "^4.0.3", 39 | "@actions/core": "^1.11.1", 40 | "@actions/exec": "^1.1.1", 41 | "setup-php": "2.33.0" 42 | }, 43 | "devDependencies": { 44 | "@eslint/compat": "^1.2.8", 45 | "@types/jest": "^29.5.14", 46 | "@types/node": "^22.14.1", 47 | "@typescript-eslint/eslint-plugin": "^8.30.1", 48 | "@typescript-eslint/parser": "^8.30.1", 49 | "@vercel/ncc": "^0.38.3", 50 | "eslint": "^9.24.0", 51 | "eslint-config-prettier": "^10.1.2", 52 | "eslint-plugin-import": "^2.31.0", 53 | "eslint-plugin-jest": "^28.11.0", 54 | "eslint-plugin-prettier": "^5.2.6", 55 | "jest": "^29.7.0", 56 | "jest-circus": "^29.7.0", 57 | "prettier": "^3.5.3", 58 | "ts-jest": "^29.3.2", 59 | "typescript": "^5.8.3" 60 | }, 61 | "bugs": { 62 | "url": "https://github.com/shivammathur/cache-extensions/issues" 63 | }, 64 | "simple-git-hooks": { 65 | "pre-commit": "npm run format && npm run lint && npm run test && npm run build && npm run release" 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/cache.ts: -------------------------------------------------------------------------------- 1 | import {exec} from '@actions/exec'; 2 | import * as cache from '@actions/cache'; 3 | import * as core from '@actions/core'; 4 | import * as spu from 'setup-php/lib/utils'; 5 | import * as fs from 'fs'; 6 | import * as path from 'path'; 7 | import * as utils from './utils'; 8 | 9 | /** 10 | * Handle dependencies 11 | * 12 | * @param extensions 13 | * @param version 14 | */ 15 | export async function handleDependencies( 16 | extensions: string, 17 | version: string 18 | ): Promise { 19 | if (!/^5.[3-5]$/.test(version) && /linux|darwin/.test(process.platform)) { 20 | const cache_key: string = (await utils.getOutput('key')) + '-deps'; 21 | const cache_dir: string = path.join( 22 | await spu.readEnv('RUNNER_TOOL_CACHE'), 23 | 'deps' 24 | ); 25 | const cache_hit: string | undefined = await cache.restoreCache( 26 | [cache_dir], 27 | cache_key, 28 | [cache_key] 29 | ); 30 | await exec(await utils.scriptCall('dependencies', extensions, version)); 31 | if (!cache_hit && fs.existsSync(cache_dir)) { 32 | try { 33 | await cache.saveCache([cache_dir], cache_key); 34 | } catch { 35 | await cache.saveCache([cache_dir], cache_key + '-take-2'); 36 | } 37 | } 38 | } 39 | } 40 | 41 | /** 42 | * Run the script 43 | */ 44 | export async function run(): Promise { 45 | try { 46 | const version: string = await spu.parseVersion(await spu.readPHPVersion()); 47 | const extensions: string = await utils.filterExtensions( 48 | await spu.getInput('extensions', true) 49 | ); 50 | const key: string = await spu.getInput('key', true); 51 | await exec(await utils.scriptCall('data', extensions, version, key)); 52 | await handleDependencies(extensions, version); 53 | } catch (error) { 54 | core.setFailed((error as Error).message); 55 | } 56 | } 57 | 58 | // call the run function 59 | (async () => { 60 | await run(); 61 | })().catch(error => { 62 | if (error.name === cache.ValidationError.name) { 63 | core.setFailed(error.message); 64 | } else if (error.name === cache.ReserveCacheError.name) { 65 | core.info(error.message); 66 | } else { 67 | core.warning(error.message); 68 | } 69 | }); 70 | -------------------------------------------------------------------------------- /src/lists/darwin-deps: -------------------------------------------------------------------------------- 1 | geos=geos -------------------------------------------------------------------------------- /src/lists/darwin-extensions: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shivammathur/cache-extensions/d814e887327271b6e290b018d51bba9f62590488/src/lists/darwin-extensions -------------------------------------------------------------------------------- /src/lists/focal-libs: -------------------------------------------------------------------------------- 1 | lib32gcc-s1 2 | lib32stdc++6 3 | lib32z1 4 | libaccountsservice0 5 | libacl1 6 | libaio1 7 | libapparmor1 8 | libappstream4 9 | libapr1 10 | libaprutil1 11 | libaprutil1-dbd-sqlite3 12 | libaprutil1-ldap 13 | libapt-pkg6.0 14 | libarchive13 15 | libargon2-1 16 | libaria2-0 17 | libasan5 18 | libasan6 19 | libasn1-8-heimdal 20 | libasound2 21 | libasound2-data 22 | libaspell15 23 | libassuan0 24 | libatasmart4 25 | libatk-bridge2.0-0 26 | libatk1.0-0 27 | libatk1.0-data 28 | libatm1 29 | libatomic1 30 | libatspi2.0-0 31 | libattr1 32 | libaudit-common 33 | libaudit1 34 | libavahi-client3 35 | libavahi-common-data 36 | libavahi-common3 37 | libbinutils 38 | libblas-dev 39 | libblas3 40 | libblkid-dev 41 | libblkid1 42 | libblockdev-crypto2 43 | libblockdev-fs2 44 | libblockdev-loop2 45 | libblockdev-part-err2 46 | libblockdev-part2 47 | libblockdev-swap2 48 | libblockdev-utils2 49 | libblockdev2 50 | libboost-context1.71.0 51 | libboost-filesystem1.71.0 52 | libboost-program-options1.71.0 53 | libboost-thread1.71.0 54 | libbrotli1 55 | libbsd0 56 | libburn4 57 | libbz2-1.0 58 | libbz2-dev 59 | libc++-10-dev 60 | libc++-dev 61 | libc++1-10 62 | libc++abi-10-dev 63 | libc++abi-dev 64 | libc++abi1-10 65 | libc-ares2 66 | libc-bin 67 | libc-client2007e 68 | libc-dev-bin 69 | libc6 70 | libc6-dev 71 | libc6-i386 72 | libcairo-gobject2 73 | libcairo-script-interpreter2 74 | libcairo2 75 | libcairo2-dev 76 | libcanberra0 77 | libcap-ng0 78 | libcap2 79 | libcap2-bin 80 | libcbor0.6 81 | libcc1-0 82 | libcgi-fast-perl 83 | libcgi-pm-perl 84 | libcgroup1 85 | libclang-common-10-dev 86 | libclang-common-11-dev 87 | libclang-common-12-dev 88 | libclang-cpp10 89 | libclang-cpp11 90 | libclang-cpp12 91 | libclang1-10 92 | libclang1-11 93 | libclang1-12 94 | libcolord2 95 | libcom-err2 96 | libcommon-sense-perl 97 | libcrypt-dev 98 | libcrypt1 99 | libcryptsetup12 100 | libctf-nobfd0 101 | libctf0 102 | libcups2 103 | libcurl3-gnutls 104 | libcurl4 105 | libdatrie1 106 | libdb5.3 107 | libdbus-1-3 108 | libdbus-glib-1-2 109 | libdbusmenu-glib4 110 | libdbusmenu-gtk3-4 111 | libdconf1 112 | libdebconfclient0 113 | libdeflate-dev 114 | libdeflate0 115 | libdevmapper-event1.02.1 116 | libdevmapper1.02.1 117 | libdjvulibre-dev 118 | libdjvulibre-text 119 | libdjvulibre21 120 | libdns-export1109 121 | libdpkg-perl 122 | libdrm-amdgpu1 123 | libdrm-common 124 | libdrm-intel1 125 | libdrm-nouveau2 126 | libdrm-radeon1 127 | libdrm2 128 | libdw1 129 | libdwarf1 130 | libeatmydata1 131 | libedit2 132 | libefiboot1 133 | libefivar1 134 | libelf1 135 | libenchant-2-2 136 | libencode-locale-perl 137 | libepoxy0 138 | liberror-perl 139 | libestr0 140 | libevent-2.1-7 141 | libevent-core-2.1-7 142 | libevent-pthreads-2.1-7 143 | libexif-dev 144 | libexif12 145 | libexpat1 146 | libexpat1-dev 147 | libext2fs2 148 | libfakeroot 149 | libfastjson4 150 | libfbclient2 151 | libfcgi-perl 152 | libfdisk1 153 | libffi-dev 154 | libffi7 155 | libfftw3-double3 156 | libfido2-1 157 | libfl2 158 | libfontconfig1 159 | libfontconfig1-dev 160 | libfontenc1 161 | libfreetype-dev 162 | libfreetype6 163 | libfreetype6-dev 164 | libfribidi0 165 | libfuse2 166 | libfuse3-3 167 | libfwupd2 168 | libfwupdplugin1 169 | libfwupdplugin5 170 | libgbm-dev 171 | libgbm1 172 | libgc1c2 173 | libgcab-1.0-0 174 | libgcc-10-dev 175 | libgcc-9-dev 176 | libgcc-s1 177 | libgconf-2-4 178 | libgcrypt20 179 | libgd3 180 | libgdbm-compat4 181 | libgdbm6 182 | libgdiplus 183 | libgdk-pixbuf2.0-0 184 | libgdk-pixbuf2.0-bin 185 | libgdk-pixbuf2.0-common 186 | libgdk-pixbuf2.0-dev 187 | libgflags2.2 188 | libgfortran-10-dev 189 | libgfortran-9-dev 190 | libgfortran5 191 | libgif7 192 | libgirepository-1.0-1 193 | libgl1 194 | libgl1-mesa-dri 195 | libglapi-mesa 196 | libglib2.0-0 197 | libglib2.0-bin 198 | libglib2.0-data 199 | libglib2.0-dev 200 | libglib2.0-dev-bin 201 | libglvnd0 202 | libglx-mesa0 203 | libglx0 204 | libgmp-dev 205 | libgmp10 206 | libgmpxx4ldbl 207 | libgnutls30 208 | libgomp1 209 | libgoogle-glog0v5 210 | libgpg-error0 211 | libgpgme11 212 | libgpm2 213 | libgraphite2-3 214 | libgsl-dev 215 | libgsl23 216 | libgslcblas0 217 | libgssapi-krb5-2 218 | libgssapi3-heimdal 219 | libgstreamer1.0-0 220 | libgtk-3-0 221 | libgtk-3-common 222 | libgudev-1.0-0 223 | libgusb2 224 | libharfbuzz0b 225 | libhashkit2 226 | libhavege1 227 | libhcrypto4-heimdal 228 | libheimbase1-heimdal 229 | libheimntlm0-heimdal 230 | libhogweed5 231 | libhtml-parser-perl 232 | libhtml-tagset-perl 233 | libhtml-template-perl 234 | libhttp-date-perl 235 | libhttp-message-perl 236 | libhunspell-1.7-0 237 | libhx509-5-heimdal 238 | libice-dev 239 | libice6 240 | libicu-dev 241 | libicu66 242 | libidn11 243 | libidn2-0 244 | libilmbase-dev 245 | libilmbase24 246 | libimagequant0 247 | libio-html-perl 248 | libio-pty-perl 249 | libip4tc2 250 | libip6tc2 251 | libipc-run-perl 252 | libisc-export1105 253 | libisl22 254 | libisns0 255 | libisoburn1 256 | libisofs6 257 | libitm1 258 | libjansson4 259 | libjbig-dev 260 | libjbig0 261 | libjcat1 262 | libjemalloc2 263 | libjpeg-dev 264 | libjpeg-turbo8 265 | libjpeg-turbo8-dev 266 | libjpeg8 267 | libjpeg8-dev 268 | libjq1 269 | libjs-jquery 270 | libjs-xmlextras 271 | libjson-c4 272 | libjson-glib-1.0-0 273 | libjson-glib-1.0-common 274 | libjson-perl 275 | libjson-xs-perl 276 | libjte2 277 | libk5crypto3 278 | libkeyutils1 279 | libklibc 280 | libkmod2 281 | libkrb5-26-heimdal 282 | libkrb5-3 283 | libkrb5support0 284 | libksba8 285 | liblapack-dev 286 | liblapack3 287 | liblcms2-2 288 | liblcms2-dev 289 | libldap-2.4-2 290 | libldap-common 291 | liblldb-10 292 | liblldb-11 293 | liblldb-12 294 | libllvm10 295 | libllvm11 296 | libllvm12 297 | liblmdb0 298 | liblocale-gettext-perl 299 | liblqr-1-0 300 | liblqr-1-0-dev 301 | liblsan0 302 | libltdl-dev 303 | libltdl7 304 | liblua5.2-0 305 | liblvm2cmd2.03 306 | liblwp-mediatypes-perl 307 | liblz4-1 308 | liblz4-dev 309 | liblzma-dev 310 | liblzma5 311 | liblzo2-2 312 | libmagic-dev 313 | libmagic-mgc 314 | libmagic1 315 | libmagickcore-6-arch-config 316 | libmagickcore-6-headers 317 | libmagickcore-6.q16-6 318 | libmagickcore-6.q16-6-extra 319 | libmagickcore-6.q16-dev 320 | libmagickcore-dev 321 | libmagickwand-6-headers 322 | libmagickwand-6.q16-6 323 | libmagickwand-6.q16-dev 324 | libmagickwand-dev 325 | libmaxminddb0 326 | libmbim-glib4 327 | libmbim-proxy 328 | libmcrypt4 329 | libmecab2 330 | libmediainfo0v5 331 | libmemcached11 332 | libmm-glib0 333 | libmms0 334 | libmnl0 335 | libmono-2.0-1 336 | libmono-2.0-dev 337 | libmono-accessibility4.0-cil 338 | libmono-cairo4.0-cil 339 | libmono-cecil-private-cil 340 | libmono-cil-dev 341 | libmono-codecontracts4.0-cil 342 | libmono-compilerservices-symbolwriter4.0-cil 343 | libmono-corlib4.5-cil 344 | libmono-cscompmgd0.0-cil 345 | libmono-csharp4.0c-cil 346 | libmono-custommarshalers4.0-cil 347 | libmono-data-tds4.0-cil 348 | libmono-db2-1.0-cil 349 | libmono-debugger-soft4.0a-cil 350 | libmono-http4.0-cil 351 | libmono-i18n-cjk4.0-cil 352 | libmono-i18n-mideast4.0-cil 353 | libmono-i18n-other4.0-cil 354 | libmono-i18n-rare4.0-cil 355 | libmono-i18n-west4.0-cil 356 | libmono-i18n4.0-all 357 | libmono-i18n4.0-cil 358 | libmono-ldap4.0-cil 359 | libmono-management4.0-cil 360 | libmono-messaging-rabbitmq4.0-cil 361 | libmono-messaging4.0-cil 362 | libmono-microsoft-build-engine4.0-cil 363 | libmono-microsoft-build-framework4.0-cil 364 | libmono-microsoft-build-tasks-v4.0-4.0-cil 365 | libmono-microsoft-build-utilities-v4.0-4.0-cil 366 | libmono-microsoft-build4.0-cil 367 | libmono-microsoft-csharp4.0-cil 368 | libmono-microsoft-visualc10.0-cil 369 | libmono-microsoft-web-infrastructure1.0-cil 370 | libmono-oracle4.0-cil 371 | libmono-parallel4.0-cil 372 | libmono-peapi4.0a-cil 373 | libmono-posix4.0-cil 374 | libmono-profiler 375 | libmono-rabbitmq4.0-cil 376 | libmono-relaxng4.0-cil 377 | libmono-security4.0-cil 378 | libmono-sharpzip4.84-cil 379 | libmono-simd4.0-cil 380 | libmono-smdiagnostics0.0-cil 381 | libmono-sqlite4.0-cil 382 | libmono-system-componentmodel-composition4.0-cil 383 | libmono-system-componentmodel-dataannotations4.0-cil 384 | libmono-system-configuration-install4.0-cil 385 | libmono-system-configuration4.0-cil 386 | libmono-system-core4.0-cil 387 | libmono-system-data-datasetextensions4.0-cil 388 | libmono-system-data-entity4.0-cil 389 | libmono-system-data-linq4.0-cil 390 | libmono-system-data-services-client4.0-cil 391 | libmono-system-data-services4.0-cil 392 | libmono-system-data4.0-cil 393 | libmono-system-deployment4.0-cil 394 | libmono-system-design4.0-cil 395 | libmono-system-drawing-design4.0-cil 396 | libmono-system-drawing4.0-cil 397 | libmono-system-dynamic4.0-cil 398 | libmono-system-enterpriseservices4.0-cil 399 | libmono-system-identitymodel-selectors4.0-cil 400 | libmono-system-identitymodel4.0-cil 401 | libmono-system-io-compression-filesystem4.0-cil 402 | libmono-system-io-compression4.0-cil 403 | libmono-system-json-microsoft4.0-cil 404 | libmono-system-json4.0-cil 405 | libmono-system-ldap-protocols4.0-cil 406 | libmono-system-ldap4.0-cil 407 | libmono-system-management4.0-cil 408 | libmono-system-messaging4.0-cil 409 | libmono-system-net-http-formatting4.0-cil 410 | libmono-system-net-http-webrequest4.0-cil 411 | libmono-system-net-http4.0-cil 412 | libmono-system-net4.0-cil 413 | libmono-system-numerics-vectors4.0-cil 414 | libmono-system-numerics4.0-cil 415 | libmono-system-reactive-core2.2-cil 416 | libmono-system-reactive-debugger2.2-cil 417 | libmono-system-reactive-experimental2.2-cil 418 | libmono-system-reactive-interfaces2.2-cil 419 | libmono-system-reactive-linq2.2-cil 420 | libmono-system-reactive-observable-aliases0.0-cil 421 | libmono-system-reactive-platformservices2.2-cil 422 | libmono-system-reactive-providers2.2-cil 423 | libmono-system-reactive-runtime-remoting2.2-cil 424 | libmono-system-reactive-windows-forms2.2-cil 425 | libmono-system-reactive-windows-threading2.2-cil 426 | libmono-system-reflection-context4.0-cil 427 | libmono-system-runtime-caching4.0-cil 428 | libmono-system-runtime-durableinstancing4.0-cil 429 | libmono-system-runtime-serialization-formatters-soap4.0-cil 430 | libmono-system-runtime-serialization4.0-cil 431 | libmono-system-runtime4.0-cil 432 | libmono-system-security4.0-cil 433 | libmono-system-servicemodel-activation4.0-cil 434 | libmono-system-servicemodel-discovery4.0-cil 435 | libmono-system-servicemodel-internals0.0-cil 436 | libmono-system-servicemodel-routing4.0-cil 437 | libmono-system-servicemodel-web4.0-cil 438 | libmono-system-servicemodel4.0a-cil 439 | libmono-system-serviceprocess4.0-cil 440 | libmono-system-threading-tasks-dataflow4.0-cil 441 | libmono-system-transactions4.0-cil 442 | libmono-system-web-abstractions4.0-cil 443 | libmono-system-web-applicationservices4.0-cil 444 | libmono-system-web-dynamicdata4.0-cil 445 | libmono-system-web-extensions-design4.0-cil 446 | libmono-system-web-extensions4.0-cil 447 | libmono-system-web-http-selfhost4.0-cil 448 | libmono-system-web-http-webhost4.0-cil 449 | libmono-system-web-http4.0-cil 450 | libmono-system-web-mobile4.0-cil 451 | libmono-system-web-mvc3.0-cil 452 | libmono-system-web-razor2.0-cil 453 | libmono-system-web-regularexpressions4.0-cil 454 | libmono-system-web-routing4.0-cil 455 | libmono-system-web-services4.0-cil 456 | libmono-system-web-webpages-deployment2.0-cil 457 | libmono-system-web-webpages-razor2.0-cil 458 | libmono-system-web-webpages2.0-cil 459 | libmono-system-web4.0-cil 460 | libmono-system-windows-forms-datavisualization4.0a-cil 461 | libmono-system-windows-forms4.0-cil 462 | libmono-system-windows4.0-cil 463 | libmono-system-workflow-activities4.0-cil 464 | libmono-system-workflow-componentmodel4.0-cil 465 | libmono-system-workflow-runtime4.0-cil 466 | libmono-system-xaml4.0-cil 467 | libmono-system-xml-linq4.0-cil 468 | libmono-system-xml-serialization4.0-cil 469 | libmono-system-xml4.0-cil 470 | libmono-system4.0-cil 471 | libmono-tasklets4.0-cil 472 | libmono-webbrowser4.0-cil 473 | libmono-webmatrix-data4.0-cil 474 | libmono-windowsbase4.0-cil 475 | libmono-xbuild-tasks4.0-cil 476 | libmonoboehm-2.0-1 477 | libmonosgen-2.0-1 478 | libmonosgen-2.0-dev 479 | libmount-dev 480 | libmount1 481 | libmpc3 482 | libmpdec2 483 | libmpfr6 484 | libmspack0 485 | libmysqlclient-dev 486 | libmysqlclient21 487 | libncurses-dev 488 | libncurses5 489 | libncurses6 490 | libncursesw6 491 | libnet1 492 | libnetfilter-conntrack3 493 | libnetplan0 494 | libnettle7 495 | libnewt0.52 496 | libnfnetlink0 497 | libnftables1 498 | libnftnl11 499 | libnghttp2-14 500 | libnginx-mod-http-image-filter 501 | libnginx-mod-http-xslt-filter 502 | libnginx-mod-mail 503 | libnginx-mod-stream 504 | libnl-3-200 505 | libnorm1 506 | libnpth0 507 | libnspr4 508 | libnss-systemd 509 | libnss3 510 | libntfs-3g883 511 | libnuma1 512 | libobjc-9-dev 513 | libobjc4 514 | libodbc1 515 | libogg0 516 | libomp-11-dev 517 | libomp5-11 518 | libonig5 519 | libopenexr-dev 520 | libopenexr24 521 | libp11-kit0 522 | libpackagekit-glib2-18 523 | libpam-cap 524 | libpam-modules 525 | libpam-modules-bin 526 | libpam-runtime 527 | libpam-systemd 528 | libpam0g 529 | libpango-1.0-0 530 | libpangocairo-1.0-0 531 | libpangoft2-1.0-0 532 | libpaper-utils 533 | libpaper1 534 | libparted-fs-resize0 535 | libparted2 536 | libpcap0.8 537 | libpci3 538 | libpciaccess0 539 | libpcre16-3 540 | libpcre2-16-0 541 | libpcre2-32-0 542 | libpcre2-8-0 543 | libpcre2-dev 544 | libpcre2-posix2 545 | libpcre2-posix3 546 | libpcre3 547 | libpcre3-dev 548 | libpcre32-3 549 | libpcrecpp0v5 550 | libperl5.30 551 | libpfm4 552 | libpgm-5.2-0 553 | libpipeline1 554 | libpixman-1-0 555 | libpixman-1-dev 556 | libpkgconf3 557 | libplymouth5 558 | libpng-dev 559 | libpng16-16 560 | libpolkit-agent-1-0 561 | libpolkit-gobject-1-0 562 | libpopt0 563 | libpq-dev 564 | libpq5 565 | libprocps8 566 | libprotobuf-c1 567 | libprotobuf17 568 | libproxy1v5 569 | libpsl5 570 | libpthread-stubs0-dev 571 | libpython2-stdlib 572 | libpython2.7-minimal 573 | libpython2.7-stdlib 574 | libpython3-dev 575 | libpython3-stdlib 576 | libpython3.8 577 | libpython3.8-dev 578 | libpython3.8-minimal 579 | libpython3.8-stdlib 580 | libqdbm14 581 | libqmi-glib5 582 | libqmi-proxy 583 | libquadmath0 584 | librabbitmq4 585 | libraqm0 586 | libre2-5 587 | libreadline-dev 588 | libreadline5 589 | libreadline8 590 | librest-0.7-0 591 | libroken18-heimdal 592 | librpm8 593 | librpmbuild8 594 | librpmio8 595 | librpmsign8 596 | librsvg2-2 597 | librsvg2-common 598 | librsvg2-dev 599 | librtmp1 600 | libruby2.7 601 | libsasl2-2 602 | libsasl2-modules 603 | libsasl2-modules-db 604 | libsctp1 605 | libseccomp2 606 | libsecret-1-0 607 | libsecret-1-dev 608 | libsecret-common 609 | libselinux1 610 | libselinux1-dev 611 | libsemanage-common 612 | libsemanage1 613 | libsensors-config 614 | libsensors5 615 | libsepol1 616 | libsepol1-dev 617 | libserf-1-1 618 | libsgutils2-2 619 | libsigsegv2 620 | libslang2 621 | libsm-dev 622 | libsm6 623 | libsmartcols1 624 | libsmbios-c2 625 | libsnappy1v5 626 | libsnmp-base 627 | libsnmp35 628 | libsodium23 629 | libsoup-gnome2.4-1 630 | libsoup2.4-1 631 | libsqlite3-0 632 | libsqlite3-dev 633 | libss2 634 | libssh-4 635 | libssh2-1 636 | libssl-dev 637 | libssl1.1 638 | libstdc++-10-dev 639 | libstdc++-9-dev 640 | libstdc++6 641 | libstemmer0d 642 | libsvn1 643 | libsybdb5 644 | libsystemd0 645 | libtalloc2 646 | libtasn1-6 647 | libtbb2 648 | libtcl8.6 649 | libtdb1 650 | libtevent0 651 | libtext-charwidth-perl 652 | libtext-iconv-perl 653 | libtext-unidecode-perl 654 | libtext-wrapi18n-perl 655 | libthai-data 656 | libthai0 657 | libtidy5deb1 658 | libtiff-dev 659 | libtiff5 660 | libtiffxx5 661 | libtimedate-perl 662 | libtinfo-dev 663 | libtinfo5 664 | libtinfo6 665 | libtinyxml2-6a 666 | libtirpc-common 667 | libtirpc-dev 668 | libtirpc3 669 | libtk8.6 670 | libtommath1 671 | libtool 672 | libtsan0 673 | libtss2-esys0 674 | libtypes-serialiser-perl 675 | libubsan1 676 | libuchardet0 677 | libucl1 678 | libudev1 679 | libudisks2-0 680 | libunistring2 681 | libunwind8 682 | liburcu6 683 | liburi-perl 684 | libusb-1.0-0 685 | libutempter0 686 | libutf8proc2 687 | libuuid1 688 | libuv1 689 | libvolume-key1 690 | libvorbis0a 691 | libvorbisfile3 692 | libvpx6 693 | libvulkan1 694 | libwayland-client0 695 | libwayland-cursor0 696 | libwayland-egl1 697 | libwayland-server0 698 | libwbclient0 699 | libwebp6 700 | libwebpmux3 701 | libwind0-heimdal 702 | libwmf-dev 703 | libwmf0.2-7 704 | libwrap0 705 | libx11-6 706 | libx11-data 707 | libx11-dev 708 | libx11-xcb1 709 | libxau-dev 710 | libxau6 711 | libxaw7 712 | libxcb-dri2-0 713 | libxcb-dri3-0 714 | libxcb-glx0 715 | libxcb-present0 716 | libxcb-render0 717 | libxcb-render0-dev 718 | libxcb-shm0 719 | libxcb-shm0-dev 720 | libxcb-sync1 721 | libxcb-xfixes0 722 | libxcb1 723 | libxcb1-dev 724 | libxcomposite1 725 | libxcursor1 726 | libxdamage1 727 | libxdmcp-dev 728 | libxdmcp6 729 | libxext-dev 730 | libxext6 731 | libxfixes3 732 | libxfont2 733 | libxft-dev 734 | libxft2 735 | libxi6 736 | libxinerama1 737 | libxkbcommon0 738 | libxkbfile-dev 739 | libxkbfile1 740 | libxml-libxml-perl 741 | libxml-namespacesupport-perl 742 | libxml-sax-base-perl 743 | libxml-sax-perl 744 | libxml2 745 | libxml2-dev 746 | libxmlb1 747 | libxmlb2 748 | libxmlrpc-epi0 749 | libxmlsec1 750 | libxmlsec1-openssl 751 | libxmu6 752 | libxmuu1 753 | libxpm4 754 | libxrandr2 755 | libxrender-dev 756 | libxrender1 757 | libxshmfence1 758 | libxslt1.1 759 | libxss1 760 | libxt-dev 761 | libxt6 762 | libxtables12 763 | libxtst6 764 | libxxf86vm1 765 | libyajl2 766 | libyaml-0-2 767 | libyaml-dev 768 | libz3-4 769 | libz3-dev 770 | libzen0v5 771 | libzip4 772 | libzmq5 773 | libzstd1 774 | python3-launchpadlib 775 | python3-oauthlib 776 | python3-wadllib 777 | -------------------------------------------------------------------------------- /src/lists/jammy-libs: -------------------------------------------------------------------------------- 1 | lib32gcc-s1 2 | lib32stdc++6 3 | lib32z1 4 | libacl1 5 | libaio1 6 | libaom3 7 | libapparmor1 8 | libappstream4 9 | libapr1 10 | libaprutil1 11 | libaprutil1-dbd-sqlite3 12 | libaprutil1-ldap 13 | libapt-pkg6.0 14 | libarchive13 15 | libargon2-1 16 | libaria2-0 17 | libasan5 18 | libasan6 19 | libasan8 20 | libasound2 21 | libasound2-data 22 | libaspell15 23 | libassuan0 24 | libatasmart4 25 | libatk-bridge2.0-0 26 | libatk1.0-0 27 | libatk1.0-data 28 | libatm1 29 | libatomic1 30 | libatspi2.0-0 31 | libattr1 32 | libaudit-common 33 | libaudit1 34 | libavahi-client3 35 | libavahi-common-data 36 | libavahi-common3 37 | libavahi-glib1 38 | libbinutils 39 | libblas-dev 40 | libblas3 41 | libblkid-dev 42 | libblkid1 43 | libblockdev-crypto2 44 | libblockdev-fs2 45 | libblockdev-loop2 46 | libblockdev-part-err2 47 | libblockdev-part2 48 | libblockdev-swap2 49 | libblockdev-utils2 50 | libblockdev2 51 | libbpf0 52 | libbrotli-dev 53 | libbrotli1 54 | libbsd0 55 | libburn4 56 | libbz2-1.0 57 | libbz2-dev 58 | libc++-14-dev 59 | libc++-dev 60 | libc++1-14 61 | libc++abi-14-dev 62 | libc++abi-dev 63 | libc++abi1-14 64 | libc-ares2 65 | libc-bin 66 | libc-client2007e 67 | libc-dev-bin 68 | libc6 69 | libc6-dev 70 | libc6-i386 71 | libcairo-gobject2 72 | libcairo-script-interpreter2 73 | libcairo2 74 | libcairo2-dev 75 | libcanberra0 76 | libcap-ng0 77 | libcap2 78 | libcap2-bin 79 | libcbor0.8 80 | libcc1-0 81 | libcgi-fast-perl 82 | libcgi-pm-perl 83 | libclang-common-13-dev 84 | libclang-common-14-dev 85 | libclang-common-15-dev 86 | libclang-cpp13 87 | libclang-cpp14 88 | libclang-cpp15 89 | libclang1-13 90 | libclang1-14 91 | libclang1-15 92 | libclone-perl 93 | libcolord2 94 | libcom-err2 95 | libcommon-sense-perl 96 | libcrypt-dev 97 | libcrypt1 98 | libcryptsetup12 99 | libctf-nobfd0 100 | libctf0 101 | libcups2 102 | libcurl3-gnutls 103 | libcurl4 104 | libdatrie1 105 | libdav1d5 106 | libdb5.3 107 | libdbus-1-3 108 | libdbus-glib-1-2 109 | libdbusmenu-glib4 110 | libdbusmenu-gtk3-4 111 | libdconf1 112 | libde265-0 113 | libdebconfclient0 114 | libdeflate-dev 115 | libdeflate0 116 | libdevmapper-event1.02.1 117 | libdevmapper1.02.1 118 | libdjvulibre-dev 119 | libdjvulibre-text 120 | libdjvulibre21 121 | libdns-export1110 122 | libdpkg-perl 123 | libdrm-amdgpu1 124 | libdrm-common 125 | libdrm-intel1 126 | libdrm-nouveau2 127 | libdrm-radeon1 128 | libdrm2 129 | libdw1 130 | libeatmydata1 131 | libedit2 132 | libefiboot1 133 | libefivar1 134 | libelf1 135 | libenchant-2-2 136 | libencode-locale-perl 137 | libepoxy0 138 | liberror-perl 139 | libestr0 140 | libevent-core-2.1-7 141 | libevent-pthreads-2.1-7 142 | libexif-dev 143 | libexif12 144 | libexpat1 145 | libexpat1-dev 146 | libext2fs2 147 | libfakeroot 148 | libfastjson4 149 | libfbclient2 150 | libfcgi-bin 151 | libfcgi-perl 152 | libfcgi0ldbl 153 | libfdisk1 154 | libffi-dev 155 | libffi8 156 | libfftw3-double3 157 | libfido2-1 158 | libflashrom1 159 | libfontconfig-dev 160 | libfontconfig1 161 | libfontconfig1-dev 162 | libfontenc1 163 | libfreetype-dev 164 | libfreetype6 165 | libfreetype6-dev 166 | libfribidi0 167 | libfsverity0 168 | libftdi1-2 169 | libfuse3-3 170 | libfwupd2 171 | libfwupdplugin5 172 | libgbm-dev 173 | libgbm1 174 | libgc1 175 | libgcab-1.0-0 176 | libgcc-10-dev 177 | libgcc-11-dev 178 | libgcc-12-dev 179 | libgcc-9-dev 180 | libgcc-s1 181 | libgconf-2-4 182 | libgcrypt20 183 | libgcrypt20-dev 184 | libgd3 185 | libgdbm-compat4 186 | libgdbm6 187 | libgdiplus 188 | libgdk-pixbuf-2.0-0 189 | libgdk-pixbuf-2.0-dev 190 | libgdk-pixbuf2.0-bin 191 | libgdk-pixbuf2.0-common 192 | libgfortran-10-dev 193 | libgfortran-11-dev 194 | libgfortran-12-dev 195 | libgfortran-9-dev 196 | libgfortran5 197 | libgif7 198 | libgirepository-1.0-1 199 | libgl1 200 | libgl1-mesa-dri 201 | libglapi-mesa 202 | libglib2.0-0 203 | libglib2.0-bin 204 | libglib2.0-data 205 | libglib2.0-dev 206 | libglib2.0-dev-bin 207 | libglvnd0 208 | libglx-mesa0 209 | libglx0 210 | libgmp-dev 211 | libgmp10 212 | libgmpxx4ldbl 213 | libgnutls30 214 | libgomp1 215 | libgpg-error-dev 216 | libgpg-error0 217 | libgpgme11 218 | libgpm2 219 | libgraphite2-3 220 | libgsl-dev 221 | libgsl27 222 | libgslcblas0 223 | libgssapi-krb5-2 224 | libgstreamer1.0-0 225 | libgtk-3-0 226 | libgtk-3-common 227 | libgudev-1.0-0 228 | libgusb2 229 | libharfbuzz0b 230 | libhavege2 231 | libheif1 232 | libhogweed6 233 | libhtml-parser-perl 234 | libhtml-tagset-perl 235 | libhtml-template-perl 236 | libhttp-date-perl 237 | libhttp-message-perl 238 | libhunspell-1.7-0 239 | libice-dev 240 | libice6 241 | libicu-dev 242 | libicu70 243 | libidn2-0 244 | libilmbase-dev 245 | libilmbase25 246 | libinih1 247 | libintl-perl 248 | libintl-xs-perl 249 | libio-html-perl 250 | libio-pty-perl 251 | libip4tc2 252 | libip6tc2 253 | libipc-run-perl 254 | libisc-export1105 255 | libisl23 256 | libisns0 257 | libisoburn1 258 | libisofs6 259 | libitm1 260 | libjansson4 261 | libjbig-dev 262 | libjbig0 263 | libjcat1 264 | libjpeg-dev 265 | libjpeg-turbo8 266 | libjpeg-turbo8-dev 267 | libjpeg8 268 | libjpeg8-dev 269 | libjq1 270 | libjs-jquery 271 | libjs-sphinxdoc 272 | libjs-underscore 273 | libjs-xmlextras 274 | libjson-c5 275 | libjson-glib-1.0-0 276 | libjson-glib-1.0-common 277 | libjson-perl 278 | libjson-xs-perl 279 | libjte2 280 | libk5crypto3 281 | libkeyutils1 282 | libklibc 283 | libkmod2 284 | libkrb5-3 285 | libkrb5support0 286 | libksba8 287 | liblapack-dev 288 | liblapack3 289 | liblcms2-2 290 | liblcms2-dev 291 | libldap-2.5-0 292 | libldap-common 293 | liblldb-13 294 | liblldb-14 295 | liblldb-15 296 | libllvm13 297 | libllvm14 298 | libllvm15 299 | liblmdb0 300 | liblocale-gettext-perl 301 | liblqr-1-0 302 | liblqr-1-0-dev 303 | liblsan0 304 | libltdl-dev 305 | libltdl7 306 | liblua5.3-0 307 | liblvm2cmd2.03 308 | liblwp-mediatypes-perl 309 | liblz4-1 310 | liblz4-dev 311 | liblzma-dev 312 | liblzma5 313 | liblzo2-2 314 | libmagic-dev 315 | libmagic-mgc 316 | libmagic1 317 | libmagickcore-6-arch-config 318 | libmagickcore-6-headers 319 | libmagickcore-6.q16-6 320 | libmagickcore-6.q16-6-extra 321 | libmagickcore-6.q16-dev 322 | libmagickcore-dev 323 | libmagickwand-6-headers 324 | libmagickwand-6.q16-6 325 | libmagickwand-6.q16-dev 326 | libmagickwand-dev 327 | libmaxminddb0 328 | libmbim-glib4 329 | libmbim-proxy 330 | libmd0 331 | libmecab2 332 | libmediainfo0v5 333 | libmemcached11 334 | libmm-glib0 335 | libmms0 336 | libmnl0 337 | libmodule-find-perl 338 | libmodule-scandeps-perl 339 | libmono-2.0-1 340 | libmono-2.0-dev 341 | libmono-accessibility4.0-cil 342 | libmono-cairo4.0-cil 343 | libmono-cecil-private-cil 344 | libmono-cil-dev 345 | libmono-codecontracts4.0-cil 346 | libmono-compilerservices-symbolwriter4.0-cil 347 | libmono-corlib4.5-cil 348 | libmono-cscompmgd0.0-cil 349 | libmono-csharp4.0c-cil 350 | libmono-custommarshalers4.0-cil 351 | libmono-data-tds4.0-cil 352 | libmono-db2-1.0-cil 353 | libmono-debugger-soft4.0a-cil 354 | libmono-http4.0-cil 355 | libmono-i18n-cjk4.0-cil 356 | libmono-i18n-mideast4.0-cil 357 | libmono-i18n-other4.0-cil 358 | libmono-i18n-rare4.0-cil 359 | libmono-i18n-west4.0-cil 360 | libmono-i18n4.0-all 361 | libmono-i18n4.0-cil 362 | libmono-ldap4.0-cil 363 | libmono-management4.0-cil 364 | libmono-messaging-rabbitmq4.0-cil 365 | libmono-messaging4.0-cil 366 | libmono-microsoft-build-engine4.0-cil 367 | libmono-microsoft-build-framework4.0-cil 368 | libmono-microsoft-build-tasks-v4.0-4.0-cil 369 | libmono-microsoft-build-utilities-v4.0-4.0-cil 370 | libmono-microsoft-build4.0-cil 371 | libmono-microsoft-csharp4.0-cil 372 | libmono-microsoft-visualc10.0-cil 373 | libmono-microsoft-web-infrastructure1.0-cil 374 | libmono-oracle4.0-cil 375 | libmono-parallel4.0-cil 376 | libmono-peapi4.0a-cil 377 | libmono-posix4.0-cil 378 | libmono-profiler 379 | libmono-rabbitmq4.0-cil 380 | libmono-relaxng4.0-cil 381 | libmono-security4.0-cil 382 | libmono-sharpzip4.84-cil 383 | libmono-simd4.0-cil 384 | libmono-smdiagnostics0.0-cil 385 | libmono-sqlite4.0-cil 386 | libmono-system-componentmodel-composition4.0-cil 387 | libmono-system-componentmodel-dataannotations4.0-cil 388 | libmono-system-configuration-install4.0-cil 389 | libmono-system-configuration4.0-cil 390 | libmono-system-core4.0-cil 391 | libmono-system-data-datasetextensions4.0-cil 392 | libmono-system-data-entity4.0-cil 393 | libmono-system-data-linq4.0-cil 394 | libmono-system-data-services-client4.0-cil 395 | libmono-system-data-services4.0-cil 396 | libmono-system-data4.0-cil 397 | libmono-system-deployment4.0-cil 398 | libmono-system-design4.0-cil 399 | libmono-system-drawing-design4.0-cil 400 | libmono-system-drawing4.0-cil 401 | libmono-system-dynamic4.0-cil 402 | libmono-system-enterpriseservices4.0-cil 403 | libmono-system-identitymodel-selectors4.0-cil 404 | libmono-system-identitymodel4.0-cil 405 | libmono-system-io-compression-filesystem4.0-cil 406 | libmono-system-io-compression4.0-cil 407 | libmono-system-json-microsoft4.0-cil 408 | libmono-system-json4.0-cil 409 | libmono-system-ldap-protocols4.0-cil 410 | libmono-system-ldap4.0-cil 411 | libmono-system-management4.0-cil 412 | libmono-system-messaging4.0-cil 413 | libmono-system-net-http-formatting4.0-cil 414 | libmono-system-net-http-webrequest4.0-cil 415 | libmono-system-net-http4.0-cil 416 | libmono-system-net4.0-cil 417 | libmono-system-numerics-vectors4.0-cil 418 | libmono-system-numerics4.0-cil 419 | libmono-system-reactive-core2.2-cil 420 | libmono-system-reactive-debugger2.2-cil 421 | libmono-system-reactive-experimental2.2-cil 422 | libmono-system-reactive-interfaces2.2-cil 423 | libmono-system-reactive-linq2.2-cil 424 | libmono-system-reactive-observable-aliases0.0-cil 425 | libmono-system-reactive-platformservices2.2-cil 426 | libmono-system-reactive-providers2.2-cil 427 | libmono-system-reactive-runtime-remoting2.2-cil 428 | libmono-system-reactive-windows-forms2.2-cil 429 | libmono-system-reactive-windows-threading2.2-cil 430 | libmono-system-reflection-context4.0-cil 431 | libmono-system-runtime-caching4.0-cil 432 | libmono-system-runtime-durableinstancing4.0-cil 433 | libmono-system-runtime-serialization-formatters-soap4.0-cil 434 | libmono-system-runtime-serialization4.0-cil 435 | libmono-system-runtime4.0-cil 436 | libmono-system-security4.0-cil 437 | libmono-system-servicemodel-activation4.0-cil 438 | libmono-system-servicemodel-discovery4.0-cil 439 | libmono-system-servicemodel-internals0.0-cil 440 | libmono-system-servicemodel-routing4.0-cil 441 | libmono-system-servicemodel-web4.0-cil 442 | libmono-system-servicemodel4.0a-cil 443 | libmono-system-serviceprocess4.0-cil 444 | libmono-system-threading-tasks-dataflow4.0-cil 445 | libmono-system-transactions4.0-cil 446 | libmono-system-web-abstractions4.0-cil 447 | libmono-system-web-applicationservices4.0-cil 448 | libmono-system-web-dynamicdata4.0-cil 449 | libmono-system-web-extensions-design4.0-cil 450 | libmono-system-web-extensions4.0-cil 451 | libmono-system-web-http-selfhost4.0-cil 452 | libmono-system-web-http-webhost4.0-cil 453 | libmono-system-web-http4.0-cil 454 | libmono-system-web-mobile4.0-cil 455 | libmono-system-web-mvc3.0-cil 456 | libmono-system-web-razor2.0-cil 457 | libmono-system-web-regularexpressions4.0-cil 458 | libmono-system-web-routing4.0-cil 459 | libmono-system-web-services4.0-cil 460 | libmono-system-web-webpages-deployment2.0-cil 461 | libmono-system-web-webpages-razor2.0-cil 462 | libmono-system-web-webpages2.0-cil 463 | libmono-system-web4.0-cil 464 | libmono-system-windows-forms-datavisualization4.0a-cil 465 | libmono-system-windows-forms4.0-cil 466 | libmono-system-windows4.0-cil 467 | libmono-system-workflow-activities4.0-cil 468 | libmono-system-workflow-componentmodel4.0-cil 469 | libmono-system-workflow-runtime4.0-cil 470 | libmono-system-xaml4.0-cil 471 | libmono-system-xml-linq4.0-cil 472 | libmono-system-xml-serialization4.0-cil 473 | libmono-system-xml4.0-cil 474 | libmono-system4.0-cil 475 | libmono-tasklets4.0-cil 476 | libmono-webbrowser4.0-cil 477 | libmono-webmatrix-data4.0-cil 478 | libmono-windowsbase4.0-cil 479 | libmono-xbuild-tasks4.0-cil 480 | libmonoboehm-2.0-1 481 | libmonosgen-2.0-1 482 | libmonosgen-2.0-dev 483 | libmount-dev 484 | libmount1 485 | libmpc3 486 | libmpdec3 487 | libmpfr6 488 | libmspack0 489 | libmysqlclient-dev 490 | libmysqlclient21 491 | libncurses-dev 492 | libncurses6 493 | libncursesw6 494 | libnetfilter-conntrack3 495 | libnetplan0 496 | libnettle8 497 | libnewt0.52 498 | libnfnetlink0 499 | libnftables1 500 | libnftnl11 501 | libnghttp2-14 502 | libnginx-mod-http-geoip2 503 | libnginx-mod-http-image-filter 504 | libnginx-mod-http-xslt-filter 505 | libnginx-mod-mail 506 | libnginx-mod-stream 507 | libnginx-mod-stream-geoip2 508 | libnl-3-200 509 | libnl-genl-3-200 510 | libnorm1 511 | libnpth0 512 | libnsl-dev 513 | libnsl2 514 | libnspr4 515 | libnss-systemd 516 | libnss3 517 | libntfs-3g89 518 | libnuma1 519 | libobjc-11-dev 520 | libobjc4 521 | libodbc2 522 | libodbccr2 523 | libodbcinst2 524 | libogg0 525 | libonig5 526 | libopenexr-dev 527 | libopenexr25 528 | libopeniscsiusr 529 | libopenjp2-7 530 | libopenjp2-7-dev 531 | libostree-1-1 532 | libp11-kit0 533 | libpackagekit-glib2-18 534 | libpam-cap 535 | libpam-modules 536 | libpam-modules-bin 537 | libpam-runtime 538 | libpam-systemd 539 | libpam0g 540 | libpango-1.0-0 541 | libpangocairo-1.0-0 542 | libpangoft2-1.0-0 543 | libpaper-utils 544 | libpaper1 545 | libparted-fs-resize0 546 | libparted2 547 | libpcap0.8 548 | libpci3 549 | libpciaccess0 550 | libpcre16-3 551 | libpcre2-16-0 552 | libpcre2-32-0 553 | libpcre2-8-0 554 | libpcre2-dev 555 | libpcre2-posix3 556 | libpcre3 557 | libpcre3-dev 558 | libpcre32-3 559 | libpcrecpp0v5 560 | libperl5.34 561 | libpfm4 562 | libpgm-5.3-0 563 | libpipeline1 564 | libpixman-1-0 565 | libpixman-1-dev 566 | libpkgconf3 567 | libplymouth5 568 | libpng-dev 569 | libpng16-16 570 | libpolkit-agent-1-0 571 | libpolkit-gobject-1-0 572 | libpopt0 573 | libpq-dev 574 | libpq5 575 | libproc-processtable-perl 576 | libprocps8 577 | libprotobuf-lite23 578 | libproxy1v5 579 | libpsl5 580 | libpthread-stubs0-dev 581 | libpython3-dev 582 | libpython3-stdlib 583 | libpython3.10 584 | libpython3.10-dev 585 | libpython3.10-minimal 586 | libpython3.10-stdlib 587 | libqdbm14 588 | libqmi-glib5 589 | libqmi-proxy 590 | libquadmath0 591 | librabbitmq4 592 | libre2-9 593 | libreadline-dev 594 | libreadline8 595 | librpm9 596 | librpmbuild9 597 | librpmio9 598 | librpmsign9 599 | librsvg2-2 600 | librsvg2-common 601 | librsvg2-dev 602 | librtmp1 603 | libruby3.0 604 | libsasl2-2 605 | libsasl2-modules 606 | libsasl2-modules-db 607 | libseccomp2 608 | libsecret-1-0 609 | libsecret-1-dev 610 | libsecret-common 611 | libselinux1 612 | libselinux1-dev 613 | libsemanage-common 614 | libsemanage2 615 | libsensors-config 616 | libsensors5 617 | libsepol-dev 618 | libsepol2 619 | libserf-1-1 620 | libsgutils2-2 621 | libsigsegv2 622 | libslang2 623 | libslirp0 624 | libsm-dev 625 | libsm6 626 | libsmartcols1 627 | libsmbios-c2 628 | libsnappy1v5 629 | libsnmp-base 630 | libsnmp40 631 | libsodium23 632 | libsort-naturally-perl 633 | libsoup2.4-1 634 | libsoup2.4-common 635 | libsqlite3-0 636 | libsqlite3-dev 637 | libss2 638 | libssh-4 639 | libssh2-1 640 | libssl-dev 641 | libssl1.1 642 | libssl3 643 | libstdc++-10-dev 644 | libstdc++-11-dev 645 | libstdc++-12-dev 646 | libstdc++-9-dev 647 | libstdc++6 648 | libstemmer0d 649 | libsvn1 650 | libsybdb5 651 | libsystemd0 652 | libtalloc2 653 | libtasn1-6 654 | libtcl8.6 655 | libtdb1 656 | libterm-readkey-perl 657 | libtevent0 658 | libtext-charwidth-perl 659 | libtext-iconv-perl 660 | libtext-unidecode-perl 661 | libtext-wrapi18n-perl 662 | libthai-data 663 | libthai0 664 | libtidy5deb1 665 | libtiff-dev 666 | libtiff5 667 | libtiffxx5 668 | libtimedate-perl 669 | libtinfo-dev 670 | libtinfo6 671 | libtinyxml2-9 672 | libtirpc-common 673 | libtirpc-dev 674 | libtirpc3 675 | libtk8.6 676 | libtommath1 677 | libtool 678 | libtraceevent1 679 | libtsan0 680 | libtsan2 681 | libtss2-esys-3.0.2-0 682 | libtss2-mu0 683 | libtss2-rc0 684 | libtss2-sys1 685 | libtss2-tcti-cmd0 686 | libtss2-tcti-device0 687 | libtss2-tcti-mssim0 688 | libtss2-tcti-swtpm0 689 | libtypes-serialiser-perl 690 | libubsan1 691 | libuchardet0 692 | libucl1 693 | libudev1 694 | libudisks2-0 695 | libunistring2 696 | libunwind-14 697 | libunwind-14-dev 698 | libunwind8 699 | liburcu8 700 | liburi-perl 701 | libusb-1.0-0 702 | libutempter0 703 | libutf8proc2 704 | libuuid1 705 | libuv1 706 | libvolume-key1 707 | libvorbis0a 708 | libvorbisfile3 709 | libvulkan1 710 | libwayland-client0 711 | libwayland-cursor0 712 | libwayland-egl1 713 | libwayland-server0 714 | libwbclient0 715 | libwebp7 716 | libwebpdemux2 717 | libwebpmux3 718 | libwmf-0.2-7 719 | libwmf-dev 720 | libwmflite-0.2-7 721 | libwrap0 722 | libx11-6 723 | libx11-data 724 | libx11-dev 725 | libx11-xcb1 726 | libx265-199 727 | libxau-dev 728 | libxau6 729 | libxaw7 730 | libxcb-dri2-0 731 | libxcb-dri3-0 732 | libxcb-glx0 733 | libxcb-present0 734 | libxcb-randr0 735 | libxcb-render0 736 | libxcb-render0-dev 737 | libxcb-shm0 738 | libxcb-shm0-dev 739 | libxcb-sync1 740 | libxcb-xfixes0 741 | libxcb1 742 | libxcb1-dev 743 | libxcomposite1 744 | libxcursor1 745 | libxdamage1 746 | libxdmcp-dev 747 | libxdmcp6 748 | libxext-dev 749 | libxext6 750 | libxfixes3 751 | libxfont2 752 | libxft2 753 | libxi6 754 | libxinerama1 755 | libxkbcommon0 756 | libxkbfile-dev 757 | libxkbfile1 758 | libxml-libxml-perl 759 | libxml-namespacesupport-perl 760 | libxml-sax-base-perl 761 | libxml-sax-perl 762 | libxml2 763 | libxml2-dev 764 | libxmlb2 765 | libxmlsec1 766 | libxmlsec1-openssl 767 | libxmu6 768 | libxmuu1 769 | libxpm4 770 | libxrandr2 771 | libxrender-dev 772 | libxrender1 773 | libxshmfence1 774 | libxslt1.1 775 | libxss1 776 | libxt-dev 777 | libxt6 778 | libxtables12 779 | libxtst6 780 | libxxf86vm1 781 | libxxhash0 782 | libyajl2 783 | libyaml-0-2 784 | libyaml-dev 785 | libz3-4 786 | libz3-dev 787 | libzen0v5 788 | libzip4 789 | libzmq5 790 | libzstd-dev 791 | libzstd1 792 | python3-launchpadlib 793 | python3-oauthlib 794 | python3-wadllib 795 | -------------------------------------------------------------------------------- /src/lists/linux-deps: -------------------------------------------------------------------------------- 1 | geos=libgeos-dev 2 | pdo_firebird=firebird-dev 3 | oci8=libaio-dev 4 | pdo_oci=libaio-dev -------------------------------------------------------------------------------- /src/lists/noble-libs: -------------------------------------------------------------------------------- 1 | lib32gcc-s1 2 | lib32stdc++6 3 | libacl1 4 | libaio1t64 5 | libaom3 6 | libapparmor1 7 | libappstream5 8 | libapr1t64 9 | libaprutil1-dbd-sqlite3 10 | libaprutil1-ldap 11 | libaprutil1t64 12 | libapt-pkg6.0t64 13 | libarchive13t64 14 | libargon2-1 15 | libaria2-0 16 | libasan8 17 | libasound2-data 18 | libasound2t64 19 | libaspell15 20 | libassuan0 21 | libatasmart4 22 | libatk-bridge2.0-0t64 23 | libatk1.0-0t64 24 | libatm1t64 25 | libatomic1 26 | libatspi2.0-0t64 27 | libattr1 28 | libaudit-common 29 | libaudit1 30 | libavahi-client3 31 | libavahi-common-data 32 | libavahi-common3 33 | libbinutils 34 | libblkid1 35 | libblockdev-crypto3 36 | libblockdev-fs3 37 | libblockdev-loop3 38 | libblockdev-mdraid3 39 | libblockdev-nvme3 40 | libblockdev-part3 41 | libblockdev-swap3 42 | libblockdev-utils3 43 | libblockdev3 44 | libbpf1 45 | libbpfcc 46 | libbrotli1 47 | libbsd0 48 | libbytesize-common 49 | libbytesize1 50 | libbz2-1.0 51 | libc-bin 52 | libc-client2007e 53 | libc-dev-bin 54 | libc6 55 | libc6-dev 56 | libc6-i386 57 | libcairo-gobject2 58 | libcairo2 59 | libcanberra0t64 60 | libcap-ng0 61 | libcap2 62 | libcap2-bin 63 | libcares2 64 | libcbor0.10 65 | libcc1-0 66 | libcgi-fast-perl 67 | libcgi-pm-perl 68 | libclang-common-16-dev 69 | libclang-common-17-dev 70 | libclang-common-18-dev 71 | libclang-cpp16t64 72 | libclang-cpp17t64 73 | libclang-cpp18 74 | libclang-rt-16-dev 75 | libclang-rt-17-dev 76 | libclang-rt-18-dev 77 | libclang1-16t64 78 | libclang1-17t64 79 | libclang1-18 80 | libclone-perl 81 | libcolord2 82 | libcom-err2 83 | libcommon-sense-perl 84 | libcrypt-dev 85 | libcrypt1 86 | libcryptsetup12 87 | libctf-nobfd0 88 | libctf0 89 | libcups2t64 90 | libcurl3t64-gnutls 91 | libcurl4t64 92 | libdatrie1 93 | libdb5.3t64 94 | libdbus-1-3 95 | libdbusmenu-glib4 96 | libdbusmenu-gtk3-4 97 | libdconf1 98 | libde265-0 99 | libdebconfclient0 100 | libdeflate0 101 | libdevmapper-event1.02.1 102 | libdevmapper1.02.1 103 | libdpkg-perl 104 | libdrm-amdgpu1 105 | libdrm-common 106 | libdrm-intel1 107 | libdrm-radeon1 108 | libdrm2 109 | libduktape207 110 | libdw1t64 111 | libeatmydata1 112 | libedit2 113 | libefiboot1t64 114 | libefivar1t64 115 | libelf1t64 116 | libenchant-2-2 117 | libencode-locale-perl 118 | libepoxy0 119 | liberror-perl 120 | libestr0 121 | libevdev2 122 | libevent-core-2.1-7t64 123 | libevent-pthreads-2.1-7t64 124 | libexpat1 125 | libexpat1-dev 126 | libext2fs2t64 127 | libfakeroot 128 | libfastjson4 129 | libfbclient2 130 | libfcgi-bin 131 | libfcgi-perl 132 | libfcgi0t64 133 | libfdisk1 134 | libffi-dev 135 | libffi8 136 | libfftw3-double3 137 | libfido2-1 138 | libflashrom1 139 | libfontconfig1 140 | libfontenc1 141 | libfreetype6 142 | libfribidi0 143 | libfsverity0 144 | libftdi1-2 145 | libfuse3-3 146 | libfwupd2 147 | libgbm1 148 | libgc1 149 | libgcc-12-dev 150 | libgcc-13-dev 151 | libgcc-14-dev 152 | libgcc-s1 153 | libgcrypt20 154 | libgd3 155 | libgdbm-compat4t64 156 | libgdbm6t64 157 | libgdk-pixbuf-2.0-0 158 | libgdk-pixbuf2.0-common 159 | libgfortran-12-dev 160 | libgfortran-13-dev 161 | libgfortran-14-dev 162 | libgfortran5 163 | libgirepository-1.0-1 164 | libgl1 165 | libgl1-mesa-dri 166 | libglapi-mesa 167 | libglib2.0-0t64 168 | libglib2.0-bin 169 | libglib2.0-data 170 | libglvnd0 171 | libglx-mesa0 172 | libglx0 173 | libgmp-dev 174 | libgmp10 175 | libgmpxx4ldbl 176 | libgnutls30t64 177 | libgomp1 178 | libgpg-error-l10n 179 | libgpg-error0 180 | libgpgme11t64 181 | libgpm2 182 | libgprofng0 183 | libgraphite2-3 184 | libgssapi-krb5-2 185 | libgstreamer1.0-0 186 | libgtk-3-0t64 187 | libgtk-3-common 188 | libgudev-1.0-0 189 | libgusb2 190 | libharfbuzz0b 191 | libhashkit2t64 192 | libhavege2 193 | libheif-plugin-aomdec 194 | libheif-plugin-libde265 195 | libheif1 196 | libhogweed6t64 197 | libhtml-parser-perl 198 | libhtml-tagset-perl 199 | libhtml-template-perl 200 | libhttp-date-perl 201 | libhttp-message-perl 202 | libhunspell-1.7-0 203 | libhwasan0 204 | libibverbs1 205 | libice6 206 | libicu-dev 207 | libicu70 208 | libicu74 209 | libidn2-0 210 | libinih1 211 | libintl-perl 212 | libintl-xs-perl 213 | libio-html-perl 214 | libio-pty-perl 215 | libip4tc2 216 | libip6tc2 217 | libipc-run-perl 218 | libisl23 219 | libisns0t64 220 | libitm1 221 | libjansson4 222 | libjbig0 223 | libjcat1 224 | libjpeg-turbo8 225 | libjpeg8 226 | libjq1 227 | libjs-jquery 228 | libjs-sphinxdoc 229 | libjs-underscore 230 | libjson-c5 231 | libjson-glib-1.0-0 232 | libjson-glib-1.0-common 233 | libjson-perl 234 | libjson-xs-perl 235 | libk5crypto3 236 | libkeyutils1 237 | libklibc 238 | libkmod2 239 | libkrb5-3 240 | libkrb5support0 241 | libksba8 242 | liblcms2-2 243 | libldap-common 244 | libldap2 245 | liblerc4 246 | liblldb-16t64 247 | liblldb-17t64 248 | liblldb-18 249 | libllvm16t64 250 | libllvm17t64 251 | libllvm18 252 | libllvm19 253 | liblmdb0 254 | liblocale-gettext-perl 255 | liblqr-1-0 256 | liblsan0 257 | libltdl7 258 | liblttng-ust-common1t64 259 | liblttng-ust-ctl5t64 260 | liblttng-ust1t64 261 | liblua5.3-0 262 | liblua5.4-0 263 | liblvm2cmd2.03 264 | liblwp-mediatypes-perl 265 | liblz4-1 266 | liblz4-dev 267 | liblzma5 268 | liblzo2-2 269 | libmagic-mgc 270 | libmagic1t64 271 | libmagickcore-6.q16-7t64 272 | libmagickwand-6.q16-7t64 273 | libmaxminddb0 274 | libmbim-glib4 275 | libmbim-proxy 276 | libmbim-utils 277 | libmd0 278 | libmecab2 279 | libmediainfo0v5 280 | libmemcached11t64 281 | libmm-glib0 282 | libmms0 283 | libmnl0 284 | libmodule-find-perl 285 | libmodule-scandeps-perl 286 | libmount1 287 | libmpc3 288 | libmpfr6 289 | libmspack0t64 290 | libmysqlclient-dev 291 | libmysqlclient21 292 | libncurses-dev 293 | libncurses6 294 | libncursesw6 295 | libnetfilter-conntrack3 296 | libnetplan1 297 | libnettle8t64 298 | libnewt0.52 299 | libnfnetlink0 300 | libnftables1 301 | libnftnl11 302 | libnghttp2-14 303 | libnl-3-200 304 | libnl-genl-3-200 305 | libnl-route-3-200 306 | libnorm1t64 307 | libnpth0t64 308 | libnspr4 309 | libnss-systemd 310 | libnss3 311 | libntfs-3g89t64 312 | libnuma1 313 | libnvme1t64 314 | libobjc-13-dev 315 | libobjc4 316 | libodbc2 317 | libogg0 318 | libonig5 319 | libopeniscsiusr 320 | libopenjp2-7 321 | libp11-kit0 322 | libpackagekit-glib2-18 323 | libpam-cap 324 | libpam-modules 325 | libpam-modules-bin 326 | libpam-runtime 327 | libpam-systemd 328 | libpam0g 329 | libpango-1.0-0 330 | libpangocairo-1.0-0 331 | libpangoft2-1.0-0 332 | libparted2t64 333 | libpcap0.8t64 334 | libpci3 335 | libpciaccess0 336 | libpcre2-16-0 337 | libpcre2-32-0 338 | libpcre2-8-0 339 | libpcre2-dev 340 | libpcre2-posix3 341 | libperl5.38t64 342 | libpfm4 343 | libpgm-5.3-0t64 344 | libpipeline1 345 | libpixman-1-0 346 | libpkgconf3 347 | libplymouth5 348 | libpng16-16t64 349 | libpolkit-agent-1-0 350 | libpolkit-gobject-1-0 351 | libpopt0 352 | libpq-dev 353 | libpq5 354 | libproc-processtable-perl 355 | libproc2-0 356 | libprotobuf-c1 357 | libprotobuf-lite32t64 358 | libpsl5t64 359 | libpython3-dev 360 | libpython3-stdlib 361 | libpython3.12-dev 362 | libpython3.12-minimal 363 | libpython3.12-stdlib 364 | libpython3.12t64 365 | libqdbm14t64 366 | libqmi-glib5 367 | libqmi-proxy 368 | libqmi-utils 369 | libqrtr-glib0 370 | libquadmath0 371 | librabbitmq4 372 | libraw23t64 373 | libre2-10 374 | libreadline8t64 375 | libreiserfscore0t64 376 | librpm9t64 377 | librpmbuild9t64 378 | librpmio9t64 379 | librpmsign9t64 380 | librtmp1 381 | libruby 382 | libruby3.2 383 | libsasl2-2 384 | libsasl2-modules 385 | libsasl2-modules-db 386 | libseccomp2 387 | libselinux1 388 | libsemanage-common 389 | libsemanage2 390 | libsensors-config 391 | libsensors5 392 | libsepol2 393 | libsframe1 394 | libsgutils2-1.46-2 395 | libsharpyuv0 396 | libsigsegv2 397 | libslang2 398 | libslirp0 399 | libsm6 400 | libsmartcols1 401 | libsnappy1v5 402 | libsnmp-base 403 | libsnmp40t64 404 | libsodium23 405 | libsort-naturally-perl 406 | libsqlite3-0 407 | libsqlite3-dev 408 | libss2 409 | libssh-4 410 | libssh2-1t64 411 | libssl-dev 412 | libssl3t64 413 | libstdc++-12-dev 414 | libstdc++-13-dev 415 | libstdc++-14-dev 416 | libstdc++6 417 | libstemmer0d 418 | libsubid4 419 | libsybdb5 420 | libsystemd-shared 421 | libsystemd0 422 | libtalloc2 423 | libtasn1-6 424 | libtcl8.6 425 | libtdb1 426 | libterm-readkey-perl 427 | libtext-charwidth-perl 428 | libtext-iconv-perl 429 | libtext-unidecode-perl 430 | libtext-wrapi18n-perl 431 | libthai-data 432 | libthai0 433 | libtidy5deb1 434 | libtiff6 435 | libtimedate-perl 436 | libtinfo6 437 | libtinyxml2-10 438 | libtirpc-common 439 | libtirpc3t64 440 | libtk8.6 441 | libtommath1 442 | libtool 443 | libtraceevent1 444 | libtraceevent1-plugin 445 | libtracefs1 446 | libtsan2 447 | libtss2-esys-3.0.2-0t64 448 | libtss2-mu-4.0.1-0t64 449 | libtss2-rc0t64 450 | libtss2-sys1t64 451 | libtss2-tcti-cmd0t64 452 | libtss2-tcti-device0t64 453 | libtss2-tcti-mssim0t64 454 | libtss2-tcti-swtpm0t64 455 | libtypes-serialiser-perl 456 | libubsan1 457 | libuchardet0 458 | libudev1 459 | libudisks2-0 460 | libunistring5 461 | libunwind8 462 | liburcu8t64 463 | liburi-perl 464 | libusb-1.0-0 465 | libutempter0 466 | libuuid1 467 | libuv1t64 468 | libvolume-key1 469 | libvorbis0a 470 | libvorbisfile3 471 | libvulkan1 472 | libwayland-client0 473 | libwayland-cursor0 474 | libwayland-egl1 475 | libwayland-server0 476 | libwbclient0 477 | libwebp7 478 | libwebpdemux2 479 | libwebpmux3 480 | libwrap0 481 | libx11-6 482 | libx11-data 483 | libx11-xcb1 484 | libxau6 485 | libxaw7 486 | libxcb-dri2-0 487 | libxcb-dri3-0 488 | libxcb-glx0 489 | libxcb-present0 490 | libxcb-randr0 491 | libxcb-render0 492 | libxcb-shm0 493 | libxcb-sync1 494 | libxcb-xfixes0 495 | libxcb1 496 | libxcomposite1 497 | libxcursor1 498 | libxdamage1 499 | libxdmcp6 500 | libxext6 501 | libxfixes3 502 | libxfont2 503 | libxft2 504 | libxi6 505 | libxinerama1 506 | libxkbcommon0 507 | libxkbfile1 508 | libxml-libxml-perl 509 | libxml-namespacesupport-perl 510 | libxml-sax-base-perl 511 | libxml-sax-perl 512 | libxml2 513 | libxml2-dev 514 | libxmlb2 515 | libxmlsec1t64 516 | libxmlsec1t64-openssl 517 | libxmu6 518 | libxmuu1 519 | libxpm4 520 | libxrandr2 521 | libxrender1 522 | libxshmfence1 523 | libxslt1.1 524 | libxss1 525 | libxt6t64 526 | libxtables12 527 | libxtst6 528 | libxxf86vm1 529 | libxxhash0 530 | libyajl2 531 | libyaml-0-2 532 | libyaml-dev 533 | libz3-4 534 | libz3-dev 535 | libzen0t64 536 | libzip4t64 537 | libzmq5 538 | libzstd-dev 539 | libzstd1 540 | python3-launchpadlib 541 | python3-oauthlib 542 | python3-wadllib 543 | texinfo-lib 544 | -------------------------------------------------------------------------------- /src/scripts/cache.sh: -------------------------------------------------------------------------------- 1 | step_log() { 2 | message=$1 3 | printf "\n\033[90;1m==> \033[0m\033[37;1m%s\033[0m\n" "$message" 4 | } 5 | 6 | add_log() { 7 | mark=$1 8 | shift 9 | subjects=("$@") 10 | for subject in "${subjects[@]}"; do 11 | if [ "$mark" = "$tick" ]; then 12 | printf "\033[32;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s\033[0m\n" "$mark" "$subject" "Added $subject" 13 | else 14 | printf "\033[31;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s\033[0m\n" "$mark" "$subject" "Failed to setup $subject" 15 | [ "${fail_fast:?}" = "true" ] && exit 1 16 | fi 17 | done 18 | } 19 | 20 | get_api_version_from_repo() { 21 | php_header="https://raw.githubusercontent.com/php/php-src/PHP-$version/main/php.h" 22 | status_code=$(curl -sSL -o /tmp/php.h -w "%{http_code}" "$php_header") 23 | if [ "$status_code" != "200" ]; then 24 | curl -sSL --retry 5 "${php_header/PHP-$version/master}" | grep "PHP_API_VERSION" | cut -d' ' -f 3 25 | else 26 | grep "PHP_API_VERSION" /tmp/php.h | cut -d' ' -f 3 27 | fi 28 | } 29 | 30 | get_api_version() { 31 | case $version in 32 | 5.3) echo "20090626" ;; 33 | 5.4) echo "20100525" ;; 34 | 5.5) echo "20121212" ;; 35 | 5.6) echo "20131226" ;; 36 | 7.0) echo "20151012" ;; 37 | 7.1) echo "20160303" ;; 38 | 7.2) echo "20170718" ;; 39 | 7.3) echo "20180731" ;; 40 | 7.4) echo "20190902" ;; 41 | 8.0) echo "20200930" ;; 42 | 8.1) echo "20210902" ;; 43 | 8.2) echo "20220829" ;; 44 | 8.3) echo "20230831" ;; 45 | *) get_api_version_from_repo ;; 46 | esac 47 | } 48 | 49 | fix_ownership() { 50 | dir=$1 51 | sudo chown -R "$USER":"$(id -g -n)" "$(dirname "$dir")" 52 | } 53 | 54 | add_config() { 55 | dependent_extension=$1 56 | dependency_extension=$2 57 | echo "$dependency_extension" | sudo tee "${ext_config_directory:?}/$dependent_extension/$dependency_extension" >/dev/null 2>&1 58 | } 59 | 60 | extension_dir_darwin() { 61 | api_version=$1 62 | if [[ "${version:?}" =~ ${old_versions:?} ]]; then 63 | echo "/opt/local/lib/php${version/./}/extensions/no-debug-non-zts-$api_version" 64 | else 65 | if [[ "$(sysctl -n hw.optional.arm64 2>/dev/null)" == "1" ]]; then 66 | echo "/opt/homebrew/lib/php/pecl/$api_version" 67 | else 68 | echo "/usr/local/lib/php/pecl/$api_version" 69 | fi 70 | fi 71 | } 72 | 73 | extension_dir_linux() { 74 | api_version=$1 75 | if [[ "${version:?}" =~ ${old_versions:?} ]]; then 76 | echo "/usr/local/php/$version/lib/php/extensions/no-debug-non-zts-$api_version" 77 | else 78 | echo "/usr/lib/php/$api_version" 79 | fi 80 | } 81 | 82 | linux_php_semver() { 83 | local php_config=/usr/bin/php-config"${version:?}" 84 | if [ -e "$php_config" ]; then 85 | grep -Eo 'version="[0-9]+(\.[0-9]+){2}((-?[a-zA-Z]+([0-9]+)?)?){2}' "$php_config" | cut -d '"' -f 2 86 | fi 87 | } 88 | 89 | data() { 90 | old_versions="5.[3-5]" 91 | date='20240716' 92 | arch=$(uname -m) 93 | if [ "$os" = "Linux" ]; then 94 | . /etc/os-release 95 | os=$os-$VERSION_CODENAME-$arch 96 | api_version=$(get_api_version) 97 | key="$key$(linux_php_semver)" 98 | dir=$(extension_dir_linux "$api_version") 99 | sudo mkdir -p "$dir/deps" && fix_ownership "$dir" 100 | elif [ "$os" = "Darwin" ]; then 101 | os_version=$(sw_vers -productVersion) 102 | os=$os-$os_version-$arch 103 | api_version=$(get_api_version) 104 | dir=$(extension_dir_darwin "$api_version") 105 | sudo mkdir -p "$dir/deps" && fix_ownership "$dir" 106 | else 107 | os="Windows-$arch" 108 | dir='C:\\tools\\php\\ext' 109 | fi 110 | job="${GITHUB_REPOSITORY}-${GITHUB_WORKFLOW}-${GITHUB_JOB}" 111 | if command -v "sha256sum" >/dev/null; then 112 | key="$(echo -n "$extensions-$key-$job" | sha256sum | cut -d ' ' -f 1)" 113 | else 114 | key="$(echo -n "$extensions-$key-$job" | openssl dgst -sha256 | cut -d ' ' -f 2)" 115 | fi 116 | key="$os"-"$version"-"$key"-"$date" 117 | echo "$dir" > "${RUNNER_TEMP:?}"/dir 118 | echo "$key" > "${RUNNER_TEMP:?}"/key 119 | echo "dir=$dir" >> "${GITHUB_OUTPUT:?}" 120 | echo "key=$key" >> "${GITHUB_OUTPUT:?}" 121 | } 122 | 123 | dependencies() { 124 | if [ "$os" = "Linux" ] || [ "$os" = "Darwin" ]; then 125 | export ext_config_directory="/tmp/extcache" 126 | export deps_cache_directory="${RUNNER_TOOL_CACHE}"/deps 127 | sudo mkdir -p "$deps_cache_directory" 128 | setup_dependencies "$extensions" "$(cat "${RUNNER_TEMP:?}"/dir)" 129 | fi 130 | } 131 | 132 | init() { 133 | export tick="✓" 134 | export cross="✗" 135 | script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd) 136 | if [[ "$os" = "Linux" || "$os" = "Darwin" ]]; then 137 | # shellcheck disable=SC1090 138 | . "$script_dir/$(echo "$os" | tr '[:upper:]' '[:lower:]').sh" 139 | self_hosted_helper 140 | fi 141 | } 142 | 143 | run=$1 144 | extensions=$2 145 | version=$3 146 | key=$4 147 | os="$(uname -s)" 148 | init 149 | $run 150 | -------------------------------------------------------------------------------- /src/scripts/darwin.sh: -------------------------------------------------------------------------------- 1 | fetch_brew_tap() { 2 | tap=$1 3 | tap_user=$(dirname "$tap") 4 | tap_name=$(basename "$tap") 5 | mkdir -p "$tap_dir/$tap_user" 6 | curl -sL "https://github.com/$tap/archive/master.tar.gz" | sudo tar -xzf - -C "$tap_dir/$tap_user" 7 | if [ -d "$tap_dir/$tap_user/$tap_name-master" ]; then 8 | sudo mv "$tap_dir/$tap_user/$tap_name-master" "$tap_dir/$tap_user/$tap_name" 9 | fi 10 | } 11 | 12 | add_brew_tap() { 13 | tap=$1 14 | if ! [ -d "$tap_dir/$tap" ]; then 15 | if [ "${ImageOS:=}-${ImageVersion:=}" = "-" ]; then 16 | brew tap --shallow "$tap" >/dev/null 2>&1 17 | else 18 | fetch_brew_tap "$tap" >/dev/null 2>&1 19 | if ! [ -d "$tap_dir/$tap" ]; then 20 | brew tap --shallow "$tap" >/dev/null 2>&1 21 | fi 22 | fi 23 | fi 24 | } 25 | 26 | get_dependencies() { 27 | extension=$1 28 | list_deps="$(grep "$extension" "${script_dir:?}"/../lists/darwin-deps | cut -d '=' -f 2)" 29 | formula_file="$tap_dir/$ext_tap/Formula/$extension@${version:?}.rb" 30 | if [ -e "$formula_file" ]; then 31 | formula_deps="$(grep "depends_on" "$formula_file" | cut -d '"' -f 2 | tr '\n' ' ')" 32 | formula_deps_from_macos="$(grep "uses_from_macos \"lib" "$formula_file" | cut -d '"' -f 2 | tr '\n' ' ')" 33 | fi 34 | deps=() 35 | [[ -n "${list_deps[*]}" ]] && deps+=("${list_deps[@]}") 36 | [[ -n "${formula_deps[*]}" ]] && deps+=("${formula_deps[@]}") 37 | [[ -n "${formula_deps_from_macos[*]}" ]] && deps+=("${formula_deps_from_macos[@]}") 38 | echo "${deps[@]}" 39 | } 40 | 41 | filter_extensions() { 42 | extensions_array=("$@") 43 | filtered_extensions=() 44 | for ext in "${extensions_array[@]}"; do 45 | if grep -i -q -w "$ext" "${script_dir:?}"/../lists/darwin-extensions || 46 | grep -q "$ext=" "${script_dir:?}"/../lists/darwin-deps; then 47 | filtered_extensions+=("$ext") 48 | fi 49 | done 50 | echo "${filtered_extensions[@]}" 51 | } 52 | 53 | setup_extensions_helper() { 54 | dependent_extension=$1 55 | dependency_extension=$2 56 | extension_dir=$3 57 | dependency_extension_name="$(basename "$(echo $dependency_extension | cut -d'@' -f 1)")" 58 | cached_extension="${deps_cache_directory:?}/$dependency_extension_name.so" 59 | if ! [ -e "$cached_extension" ]; then 60 | brew install "$dependency_extension" 61 | sudo find "$brew_cellar/$dependency_extension_name@${version:?}" -name "$dependency_extension_name.so" -exec cp {} "$cached_extension" \; 62 | else 63 | echo "Found $dependency_extension_name extension in cache" 64 | sudo cp "$cached_extension" "$extension_dir/" 65 | fi 66 | add_config "$dependent_extension" "$dependency_extension_name" 67 | } 68 | 69 | setup_extensions() { 70 | dependent_extension=$1 71 | extension_dir=$2 72 | shift 2 73 | dependency_extensions_array=("$@") 74 | sudo mkdir -p "$cache_directory"/"$extension" 75 | echo "::group::Logs to set up extensions required for $extension" 76 | for dependency_extension in "${dependency_extensions_array[@]}"; do 77 | setup_extensions_helper "$dependent_extension" "$dependency_extension" "$extension_dir" 78 | done 79 | echo "::endgroup::" 80 | add_log "${tick:?}" "${dependency_extensions_array[@]}" 81 | } 82 | 83 | add_library_helper() { 84 | dep_name=$1 85 | cache_dir=$2 86 | [ -e "$cache_dir"/list ] && grep -Eq "^$dep_name" "$cache_dir"/list && return 87 | echo "$dep_name" | sudo tee -a "$cache_dir"/list >/dev/null 2>&1 88 | ( 89 | cd "$brew_cellar" || exit 1 90 | if command -v gtar >/dev/null; then 91 | sudo gtar -I "zstd -T0" -cf "$cache_dir"/"$dep_name".tar.zst "$dep_name" 92 | else 93 | sudo tar -cf - "$dep_name" | zstd -T0 > "$cache_dir"/"$dep_name".tar.zst 94 | fi 95 | ) 96 | } 97 | 98 | add_library() { 99 | lib=$1 100 | cache_dir=$2 101 | brew list "$lib" &>/dev/null || brew install "$lib" 102 | IFS=' ' read -r -a deps_array <<<"$(brew deps --formula "$lib" | tr '\n' ' ')" 103 | to_wait=() 104 | for dep_name in "$lib" "${deps_array[@]}"; do 105 | dep_name="$(basename "$dep_name")" 106 | add_library_helper "$dep_name" "$cache_dir" & 107 | to_wait+=($!) 108 | done 109 | wait "${to_wait[@]}" 110 | } 111 | 112 | restore_library_helper() { 113 | dep_name=$1 114 | cache_dir=$2 115 | if ! [ -d "$brew_cellar/$dep_name" ]; then 116 | if command -v gtar >/dev/null; then 117 | sudo gtar -I "zstd -d" -xf "$cache_dir"/"$dep_name".tar.zst -C "$brew_cellar" 118 | else 119 | sudo zstd -dq "$cache_dir"/"$dep_name".tar.zst && sudo tar -xf "$cache_dir"/"$dep_name".tar -C "$brew_cellar" 120 | fi 121 | fi 122 | if ! [ -d "$brew_prefix/opt/$dep_name" ]; then 123 | brew link --force --overwrite "$dep_name" 2>/dev/null || true 124 | fi 125 | if ! [ -d "$brew_prefix/opt/$dep_name" ]; then 126 | sudo ln -sf "$brew_cellar"/"$dep_name"/* "$brew_prefix"/opt/"$dep_name" 127 | fi 128 | } 129 | 130 | restore_library() { 131 | cache_dir=$1 132 | to_wait=() 133 | while read -r dep_name; do 134 | restore_library_helper "$dep_name" "$cache_dir" & 135 | to_wait+=($!) 136 | done <"$cache_dir"/list 137 | wait "${to_wait[@]}" 138 | } 139 | 140 | setup_libraries() { 141 | extension=$1 142 | shift 1 143 | libraries_array=("$@") 144 | ext_deps_dir="$deps_cache_directory/$extension" 145 | sudo cp -a "$tap_dir"/"$ext_tap"/.github/deps/"$extension"/*.rb "$tap_dir"/"$core_tap"/Formula/ 2>/dev/null || true 146 | sudo mkdir -p "$ext_deps_dir" 147 | echo "::group::Logs to set up libraries required for $extension" 148 | if ! [ -e "$ext_deps_dir"/list ]; then 149 | for lib in "${libraries_array[@]}"; do 150 | add_library "$lib" "$ext_deps_dir" 151 | done 152 | else 153 | restore_library "$ext_deps_dir" 154 | fi 155 | echo "::endgroup::" 156 | add_log "$tick" "${libraries_array[@]}" 157 | } 158 | 159 | setup_dependencies() { 160 | extensions=$1 161 | extension_dir=$2 162 | cache_directory=/tmp/extcache 163 | [[ -z "${extensions// /}" ]] && return 164 | IFS=' ' read -r -a extensions_array <<<"$(echo "$extensions" | sed -e "s/pdo[_-]//g" -Ee "s/^|,\s*/ /g")" 165 | IFS=' ' read -r -a extensions_array <<<"$(filter_extensions "${extensions_array[@]}")" 166 | if [[ -n "${extensions_array[*]// /}" ]]; then 167 | add_brew_tap "$php_tap" 168 | add_brew_tap "$ext_tap" 169 | for extension in "${extensions_array[@]}"; do 170 | IFS=' ' read -r -a dependency_array <<<"$(get_dependencies "$extension")" 171 | libraries_array=() 172 | extension_array=() 173 | for item in "${dependency_array[@]}"; do 174 | if ! [[ "$item" == *"shivammathur"* ]]; then 175 | libraries_array+=("$item") 176 | else 177 | formula_name="$(basename "$item")" 178 | grep -q AbstractPhpExtension "$tap_dir/$ext_tap/Formula/$formula_name.rb" && extension_array+=("$item") || libraries_array+=("$item") 179 | fi 180 | done 181 | if [[ -n "${libraries_array[*]// /}" ]]; then 182 | step_log "Setup libraries for $extension" 183 | setup_libraries "$extension" "${libraries_array[@]}" 184 | fi 185 | if [[ -n "${extension_array[*]// /}" ]] && [ "${skip_dependency_extensions:=}" != "true" ]; then 186 | step_log "Setup extensions for $extension" 187 | setup_extensions "$extension" "$extension_dir" "${extension_array[@]}" 188 | fi 189 | done 190 | fi 191 | } 192 | 193 | self_hosted_helper() { 194 | : 195 | } 196 | 197 | export HOMEBREW_CHANGE_ARCH_TO_ARM=1 198 | export HOMEBREW_NO_INSTALL_CLEANUP=1 199 | export HOMEBREW_NO_AUTO_UPDATE=1 200 | export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 201 | 202 | brew_prefix="$(brew --prefix)" 203 | brew_cellar="$brew_prefix/Cellar" 204 | tap_dir="$(brew --repository)"/Library/Taps 205 | core_tap=homebrew/homebrew-core 206 | php_tap=shivammathur/homebrew-php 207 | ext_tap=shivammathur/homebrew-extensions 208 | -------------------------------------------------------------------------------- /src/scripts/linux.sh: -------------------------------------------------------------------------------- 1 | read_env() { 2 | fail_fast="${fail_fast:-${FAIL_FAST:-false}}" 3 | [[ -z "${ImageOS}" && -z "${ImageVersion}" || -n ${ACT} ]] && _runner=self-hosted || _runner=github 4 | runner="${runner:-${RUNNER:-$_runner}}" 5 | 6 | if [[ "$runner" = "github" && $_runner = "self-hosted" ]]; then 7 | fail_fast=true 8 | add_log "${cross:?}" "Runner" "Runner set as github in self-hosted environment" 9 | fi 10 | } 11 | 12 | check_package() { 13 | apt-cache policy "$1" 2>/dev/null | grep -q 'Candidate' 14 | } 15 | 16 | add_package() { 17 | package=$1 18 | if ! command -v "$package" >/dev/null; then 19 | check_package "$package" || apt-get update >/dev/null 2>&1 20 | apt-get install -y "$package" >/dev/null 2>&1 || (apt-get update >/dev/null 2>&1 && apt-get install -y "$package" >/dev/null 2>&1) 21 | fi 22 | } 23 | 24 | add_ppa_package() { 25 | package=$1 26 | package_link="$(get_package_link "$package")" 27 | curl -o /tmp/"$package.deb" -sL "$package_link" 28 | sudo DEBIAN_FRONTEND=noninteractive dpkg -i "/tmp/$package.deb" 29 | } 30 | 31 | link_apt_fast() { 32 | if ! command -v apt-fast >/dev/null; then 33 | sudo ln -sf /usr/bin/apt-get /usr/bin/apt-fast 34 | trap "sudo rm -f /usr/bin/apt-fast 2>/dev/null" exit 35 | fi 36 | } 37 | 38 | fetch_package() { 39 | if ! [ -e /tmp/Packages ]; then 40 | . /etc/os-release 41 | arch=$(dpkg --print-architecture) 42 | curl -o /tmp/Packages.gz -sL "http://ppa.launchpad.net/ondrej/php/ubuntu/dists/$VERSION_CODENAME/main/binary-$arch/Packages.gz" 43 | gzip -df /tmp/Packages.gz 44 | fi 45 | } 46 | 47 | get_dependencies() { 48 | package=$1 49 | prefix=$2 50 | list_deps="$(grep "${package#*-}" "${script_dir:?}"/../lists/linux-deps | cut -d '=' -f 2 | grep -Eo "$prefix.*")" 51 | IFS=$'\n' read -d '' -r -a package_deps < <(sed -n '/Package:\s'"$package"'/,/^$/p' /tmp/Packages | grep '^Depends:' | cut -d ':' -f2- | tr ',' '\n' | grep -E '^\s*'"$prefix" | cut -d '(' -f1 | sed 's/^\s*//;s/\s*$//' | sort -u); 52 | deps=() 53 | [[ -n "${list_deps[*]}" ]] && deps+=("${list_deps[@]}") 54 | [[ -n "${package_deps[*]}" ]] && deps+=("${package_deps[@]}") 55 | echo "${deps[@]}" 56 | } 57 | 58 | get_package_link() { 59 | package=$1 60 | trunk="http://ppa.launchpad.net/ondrej/php/ubuntu" 61 | file=$(sed -e '/Package:\s'"$package$"'/,/^\s*$/!d' /tmp/Packages | grep -Eo "^Filename.*" | cut -d' ' -f 2 | tr -d '\r') 62 | echo "$trunk/$file" 63 | } 64 | 65 | setup_extensions_helper() { 66 | dependency_extension=$1 67 | extension_dir=$2 68 | cached_extension="${deps_cache_directory:?}/$dependency_extension.so" 69 | if ! [ -e "$extension_dir/$dependency_extension.so" ]; then 70 | if ! [ -e "$cached_extension" ]; then 71 | extension_package_link="$(get_package_link "php${version:?}-$dependency_extension")" 72 | sudo curl -H "User-Agent: Debian APT-HTTP/GHA(ce)" -o "/tmp/$dependency_extension".deb -sL "$extension_package_link" 73 | sudo dpkg-deb -x "/tmp/$dependency_extension".deb / 74 | sudo cp "$extension_dir/$dependency_extension.so" "$cached_extension" 75 | fix_ownership "$extension_dir" 76 | else 77 | sudo cp "$cached_extension" "$extension_dir/" 78 | fi 79 | fi 80 | } 81 | 82 | setup_extensions() { 83 | extension_dir=$1 84 | IFS=' ' read -r -a dependency_extension_array <<<"$(echo "$2" | xargs -n1 | sort | uniq | xargs)" 85 | to_wait=() 86 | step_log "Setup extensions" 87 | for dependency_extension in "${dependency_extension_array[@]}"; do 88 | setup_extensions_helper "$dependency_extension" "$extension_dir" & 89 | to_wait+=($!) 90 | done 91 | wait "${to_wait[@]}" 92 | add_log "${tick:?}" "${dependency_extension_array[@]}" 93 | } 94 | 95 | filter_libraries() { 96 | libraries="$(echo "$1" | xargs -n1 | sort | uniq | xargs)" 97 | if [ "$runner" = "github" ]; then 98 | for library in $libraries; do 99 | if grep -i -q -w "$library" "${script_dir:?}"/../lists/"$VERSION_CODENAME"-libs; then 100 | libraries=${libraries//$library/} 101 | fi 102 | done 103 | fi 104 | echo "$libraries" 105 | } 106 | 107 | setup_libraries() { 108 | libraries=$1 109 | if [[ -n "${libraries// /}" ]]; then 110 | libraries=$(filter_libraries "$libraries") 111 | if [[ "$libraries" = *libgd* ]]; then 112 | check_package 'libavif[0-9]*$' && libraries="$libraries libavif[0-9]*$" 113 | check_package 'libheif[0-9]*$' && libraries="$libraries libheif[0-9]*$" 114 | check_package 'libraqm[0-9]*$' && libraries="$libraries libraqm[0-9]*$" 115 | check_package 'libraqm[0-9]*$' && libraries="$libraries libimagequant[0-9]*$" 116 | fi 117 | if [[ -n "${libraries// /}" ]]; then 118 | step_log "Setup libraries" 119 | IFS=' ' read -r -a libraries_array <<<"$libraries" 120 | echo "::group::Logs to set up required libraries" 121 | sudo DEBIAN_FRONTEND=noninteractive apt-fast install --no-install-recommends --no-upgrade -y "${libraries_array[@]}" || (sudo DEBIAN_FRONTEND=noninteractive apt-get update && sudo DEBIAN_FRONTEND=noninteractive apt-fast install --no-install-recommends --no-upgrade -y "${libraries_array[@]}") 122 | ec="$?" 123 | [[ "$libraries" = *libgd* ]] && add_ppa_package libgd3 124 | echo "::endgroup::" 125 | if [ "$ec" -eq "0" ]; then mark="${tick:?}"; else mark="${cross:?}"; fi 126 | add_log "$mark" "${libraries_array[@]//\[0-9]*$/}" 127 | fi 128 | fi 129 | } 130 | 131 | setup_dependencies() { 132 | extensions=$1 133 | extension_dir=$2 134 | [[ -z "${extensions// }" ]] && return 135 | IFS=' ' read -r -a extensions_array <<<"$(echo "$extensions" | sed -e "s/pdo[_-]//g" -Ee "s/^|,\s*/ php$version-/g")" 136 | . /etc/os-release 137 | sudo rm -rf "${ext_config_directory:?}" || true 138 | libraries="" 139 | extension_packages="" 140 | for extension_package in "${extensions_array[@]}"; do 141 | [[ ! "$extension_package" =~ php[0-9]+\.[0-9]+-[a-zA-Z0-9]+$ ]] && continue 142 | fetch_package 143 | libraries="$libraries $(get_dependencies "$extension_package" "lib")" 144 | IFS=' ' read -r -a dependency_extension_packages_array <<<"$(get_dependencies "$extension_package" "php$version-")" 145 | extension_packages="$extension_packages ${dependency_extension_packages_array[*]}" 146 | extension_packages="${extension_packages//php$version-common/}" 147 | for dependency_extension in "${dependency_extension_packages_array[@]}"; do 148 | if [[ "${dependency_extension#*-}" != 'common' && "$extension_package" != "$dependency_extension"* ]]; then 149 | mkdir -p "$ext_config_directory/${extension_package#*-}" 150 | add_config "${extension_package#*-}" "${dependency_extension#*-}" 151 | fi 152 | done 153 | done 154 | if [[ -n "${libraries// /}" ]]; then 155 | setup_libraries "$libraries" 156 | fi 157 | if [[ -n "${extension_packages// /}" ]] && [ "${skip_dependency_extensions:=}" != "true" ]; then 158 | setup_extensions "$extension_dir" "${extension_packages//php$version-/}" 159 | fi 160 | } 161 | 162 | self_hosted_helper() { 163 | add_package sudo 164 | add_package curl 165 | link_apt_fast 166 | read_env 167 | } 168 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs'; 2 | import * as path from 'path'; 3 | import * as spu from 'setup-php/lib/utils'; 4 | 5 | /** 6 | * Function to get outputs 7 | */ 8 | export async function getOutput(output: string): Promise { 9 | return fs.readFileSync( 10 | path.join(await spu.readEnv('RUNNER_TEMP'), output), 11 | 'utf8' 12 | ); 13 | } 14 | 15 | /** 16 | * Function to filter extensions 17 | * 18 | * @param extension_csv 19 | */ 20 | export async function filterExtensions(extension_csv: string): Promise { 21 | return JSON.stringify( 22 | extension_csv 23 | .split(',') 24 | .filter(extension => { 25 | return extension.trim()[0] != ':'; 26 | }) 27 | .join(',') 28 | ); 29 | } 30 | 31 | /** 32 | * Function to get script call 33 | * 34 | * @param fn 35 | * @param args 36 | */ 37 | export async function scriptCall( 38 | fn: string, 39 | ...args: string[] 40 | ): Promise { 41 | const script: string = path.join(__dirname, '../src/scripts/cache.sh'); 42 | return ['bash', script, fn, ...args].join(' '); 43 | } 44 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "esModuleInterop": true, 5 | "lib": [ 6 | "ESNext" 7 | ], 8 | "module": "commonjs", 9 | "moduleResolution": "node", 10 | "noImplicitAny": true, 11 | "outDir": "./lib", 12 | "removeComments": true, 13 | "rootDir": "./src", 14 | "sourceMap": true, 15 | "strict": true, 16 | "target": "ESNext" 17 | }, 18 | "exclude": ["__tests__", "lib", "node_modules"] 19 | } --------------------------------------------------------------------------------