{"id":13435321,"url":"https://github.com/bootlin/elixir","last_synced_at":"2026-04-07T15:37:11.710Z","repository":{"id":17426887,"uuid":"81215265","full_name":"bootlin/elixir","owner":"bootlin","description":"The Elixir Cross Referencer","archived":false,"fork":false,"pushed_at":"2026-03-27T10:09:01.000Z","size":2409,"stargazers_count":1154,"open_issues_count":61,"forks_count":167,"subscribers_count":36,"default_branch":"master","last_synced_at":"2026-03-27T22:08:07.578Z","etag":null,"topics":["hacktoberfest"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bootlin.png","metadata":{"files":{"readme":"README.adoc","changelog":"CHANGELOG.adoc","contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2017-02-07T14:12:22.000Z","updated_at":"2026-03-27T10:09:06.000Z","dependencies_parsed_at":"2024-01-13T18:14:04.961Z","dependency_job_id":"86fb158b-fdf8-43e1-8813-317f7457aa65","html_url":"https://github.com/bootlin/elixir","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/bootlin/elixir","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bootlin%2Felixir","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bootlin%2Felixir/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bootlin%2Felixir/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bootlin%2Felixir/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bootlin","download_url":"https://codeload.github.com/bootlin/elixir/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bootlin%2Felixir/sbom","scorecard":{"id":248072,"data":{"date":"2025-08-11","repo":{"name":"github.com/bootlin/elixir","commit":"05da14b29574441acefbab211dc0d0489c4bdd73"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.9,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":9,"reason":"5 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 9","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: COPYING:0","Info: FSF or OSI recognized license: GNU Affero General Public License v3.0: COPYING:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Pinned-Dependencies","score":2,"reason":"dependency not pinned by hash detected -- score normalized to 2","details":["Warn: containerImage not pinned by hash: docker/Dockerfile:1","Warn: containerImage not pinned by hash: docker/Dockerfile:22: pin your Docker image by updating debian:bookworm to debian:bookworm@sha256:731dd1380d6a8d170a695dbeb17fe0eade0e1c29f654cf0a3a07f372191c3f4b","Warn: pipCommand not pinned by hash: docker/Dockerfile:45-48","Info:   0 out of   2 containerImage dependencies pinned","Info:   1 out of   2 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-cpwx-vrp4-4pq7"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 1 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-17T07:57:39.196Z","repository_id":17426887,"created_at":"2025-08-17T07:57:39.196Z","updated_at":"2025-08-17T07:57:39.196Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31518632,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T03:10:19.677Z","status":"ssl_error","status_checked_at":"2026-04-07T03:10:13.982Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hacktoberfest"],"created_at":"2024-07-31T03:00:34.848Z","updated_at":"2026-04-07T15:37:11.685Z","avatar_url":"https://github.com/bootlin.png","language":"C","funding_links":[],"categories":["C","Tools"],"sub_categories":["Writing"],"readme":"= The Elixir Cross Referencer\n:doctype: book\n:pp: {plus}{plus}\n:toc:\n:toc-placement!:\n\nElixir is a source code cross-referencer inspired by\nhttps://en.wikipedia.org/wiki/LXR_Cross_Referencer[LXR]. It's written\nin Python and its main purpose is to index every release of a C or C{pp}\nproject (like the Linux kernel) while keeping a minimal footprint.\n\nIt uses Git as a source-code file store and Berkeley DB for cross-reference\ndata. Internally, it indexes Git _blobs_ rather than trees of files to avoid\nduplicating work and data. It has a straightforward data structure\n(reminiscent of older LXR releases) to keep queries simple and fast.\n\nYou can see it in action on https://elixir.bootlin.com/\n\nlink:CHANGELOG.adoc[Changelog]\n\ntoc::[]\n\n= Requirements\n\n* Python \u003e= 3.8\n* Git \u003e= 1.9\n* The Jinja2 and Pygments (\u003e= 2.7) Python libraries\n* Berkeley DB (and its Python binding)\n* Universal Ctags\n* Perl (for non-greedy regexes and automated testing)\n* Falcon and `mod_wsgi` (for the REST API)\n\n= Architecture\n\nThe shell script (`script.sh`) is the lower layer and provides commands\nto interact with Git and other Unix utilities. The Python commands use\nthe shell script's services to provide access to the annotated source\ncode and identifier lists (`query.py`) or to create and update the\ndatabases (`update.py`). Finally, the web interface (`web.py`) and\nuses the query interface to generate HTML pages and to answer REST\nqueries, respectively.\n\nWhen installing the system, you should test each layer manually and make\nsure it works correctly before moving on to the next one.\n\n= Manual Installation\n\n== Install Dependencies\n\n____\nFor Debian\n____\n\n----\nsudo apt install python3-pip python3-venv libdb-dev python3-dev build-essential universal-ctags perl git apache2 libapache2-mod-wsgi-py3 libjansson4\n----\n\n== Download Elixir Project\n\n----\ngit clone https://github.com/bootlin/elixir.git /usr/local/elixir/\n----\n\n== Create a virtualenv for Elixir\n\n----\npython -m venv /usr/local/elixir/venv\n. /usr/local/elixir/venv/bin/activate\npip install -r /usr/local/elixir/requirements.txt\n----\n\n== Create directories for project data\n\n----\nmkdir -p /path/elixir-data/linux/repo\nmkdir -p /path/elixir-data/linux/data\n----\n\n== Set environment variables\n\nTwo environment variables are used to tell Elixir where to find the project's\nlocal git repository and its databases:\n\n* `LXR_REPO_DIR` (the git repository directory for your project)\n* `LXR_DATA_DIR` (the database directory for your project)\n\nNow open `/etc/profile` and append the following content.\n\n----\nexport LXR_REPO_DIR=/path/elixir-data/linux/repo\nexport LXR_DATA_DIR=/path/elixir-data/linux/data\n----\n\nAnd then run `source /etc/profile`.\n\n== Clone Kernel source code\n\nFirst clone the master tree released by Linus Torvalds:\n\n----\ncd /path/elixir-data/linux\ngit clone --bare https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git repo\n----\n\nThen, you should also declare a `stable` remote branch corresponding to the `stable` tree, to get all release updates:\n\n----\ncd repo\ngit remote add stable git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git\ngit fetch stable\n----\n\nThen, you can also declare an `history` remote branch corresponding to the old Linux versions not present in the other repos, to get all the old version still available:\n\n----\ncd repo\ngit remote add history https://github.com/bootlin/linux-history.git\ngit fetch history --tags\n----\n\nFeel free to add more remote branches in this way, as Elixir will consider tags from all remote branches.\n\n== First Test\n\n----\ncd /usr/local/elixir/\n./script.sh list-tags\n----\n\n== Create Database\n\n----\n. ./venv/bin/activate\n./update.py \u003cnumber of threads\u003e\n----\n\n____\nGenerating the full database can take a long time: it takes about 15 hours on a Xeon E3-1245 v5 to index 1800 tags in the Linux kernel. For that reason, you may want to tweak the script (for example, by limiting the number of tags with a \"head\") in order to test the update and query commands. You can even create a new Git repository and just create one tag instead of using the official kernel repository which is very large.\n____\n\n== Second Test\n\nVerify that the queries work:\n\n $ python3 -m utils.query ident v4.10 raw_spin_unlock_irq C\n $ python3 -m utils.query file v4.10 /kernel/sched/clock.c\n\nNOTE: `v4.10` can be replaced with any other tag.\nNOTE: Don't forget to activate the virtual environment!\n\n== Configure httpd\n\nThe CGI interface (`web.py`) is meant to be called from your web\nserver. Since it includes support for indexing multiple projects,\nit expects a different variable (`LXR_PROJ_DIR`) which points to a\ndirectory with a specific structure:\n\n* `\u003cLXR_PROJ_DIR\u003e`\n ** `\u003cproject 1\u003e`\n  *** `data`\n  *** `repo`\n ** `\u003cproject 2\u003e`\n  *** `data`\n  *** `repo`\n ** `\u003cproject 3\u003e`\n  *** `data`\n  *** `repo`\n\nIt will then generate the other two variables upon calling the query\ncommand.\n\nNow replace `/etc/apache2/sites-enabled/000-default.conf` with `docker/000-default.conf`.\nNote: If using httpd (RedHat/Centos) instead of apache2 (Ubuntu/Debian),\nthe default config file to edit is `/etc/httpd/conf.d/elixir.conf`.\n\nFinally, start the httpd server.\n\n----\nsystemctl restart apache2\n----\n\n\n== Configure SELinux policy\n\nWhen running systemd with SELinux enabled, httpd server can only visit limited directories.\nIf your /path/elixir-data/ is not one of these allowed directories, you will be responded with 500 status code.\n\nTo allow httpd server to visit /path/elixir-data/, run following codes:\n----\nchcon -R -t httpd_sys_rw_content_t /path/elixir-data/\n----\n\nTo check if it takes effect, run the following codes:\n----\nls -Z /path/elixir-data/\n----\n\nIn case you want to check SELinux log related with httpd, run the following codes:\n----\naudit2why -a | grep httpd | less\n----\n\n== Configure systemd log directory\n\nBy default, the error log of elixir will be put in /tmp/elixir-errors.\nHowever, systemd enables PrivateTmp by default.\nAnd, the final error directory will be like /tmp/systemd-private-xxxxx-httpd.service-xxxx/tmp/elixir-errors.\nIf you want to disable it, configure httpd.service with the following attribute:\n----\nPrivateTmp=false\n----\n\n== Configuration for other servers\n\nOther HTTP servers (like nginx or lighthttpd) may not support WSGI and may require a separate WSGI server, like uWSGI.\n\nInformation about how to configure uWSGI with Lighthttpd can be found here:\nhttps://redmine.lighttpd.net/projects/lighttpd/wiki/HowToPythonWSGI#Python-WSGI-apps-via-uwsgi-SCGI-FastCGI-or-HTTP-using-the-uWSGI-server\n\nPull requests with example uWSGI configuration for Elixir are welcome.\n\n= REST API usage\n\nAfter configuring httpd, you can test the API usage:\n\n== ident query\n\nSend a get request to `/api/ident/\u003cProject\u003e/\u003cIdent\u003e?version=\u003cversion\u003e\u0026family=\u003cfamily\u003e`.\nFor example:\n\n curl http://127.0.0.1/api/ident/barebox/cdev?version=latest\u0026family=C\n\nThe response body is of the following structure:\n\n----\n{\n    \"definitions\":\n        [{\"path\": \"commands/loadb.c\", \"line\": 71, \"type\": \"variable\"}, ...],\n    \"references\":\n        [{\"path\": \"arch/arm/boards/cm-fx6/board.c\", \"line\": \"64,64,71,72,75\", \"type\": null}, ...]\n}\n----\n\n= Maintenance and enhancements\n\n== Using a cache to improve performance\n\nAt Bootlin, we're using the https://varnish-cache.org/[Varnish http cache]\nas a front-end to reduce the load on the server running the Elixir code.\n\n .-------------.           .---------------.           .-----------------------.\n | Http client | --------\u003e | Varnish cache | --------\u003e | Apache running Elixir |\n '-------------'           '---------------'           '-----------------------'\n\n== Keeping Elixir databases up to date\n\nTo keep your Elixir databases up to date and index new versions that are released,\nwe're proposing to use a script like `index /srv/elixir-data --all` which is called\nthrough a daily cron job.\n\nYou can set `$ELIXIR_THREADS` if you want to change the number of threads used by\nupdate.py for indexing (by default the number of CPUs on your system).\n\n= Building Docker images\n\nDockerfiles are provided in the `docker/` directory.\nTo build the image, run the following commands:\n\n # git clone https://github.com/bootlin/elixir.git ./elixir\n # docker build -t elixir --build-arg ELIXIR_VERSION=`git rev-parse --short HEAD` -f ./elixir/docker/Dockerfile ./elixir\n\nELIXIR_VER build argument is optional. Since .git directory is not copied into Docker image by default,\nthe option is used to pass a version string to Elixir.\n\nYou can then run the image using `docker run`.\nHere we mount a host directory as Elixir data:\n\n # mkdir ./elixir-data\n # docker run -v ./elixir-data/:/srv/elixir-data -d --name elixir-container elixir\n\nThe Docker image does not contain any repositories.\nTo index a repository, you can use the `index-repository` script.\nFor example, to add the https://musl.libc.org/[musl] repository, run:\n\n # docker exec -it elixir-container index /srv/elixir-data musl\n\nOr, to run indexing in a separate container:\n\n # docker run -v ./elixir-data/:/srv/elixir-data \\\n    --entrypoint index elixir /srv/elixir-data musl\n\nYou can also use `index /srv/elixir-data --all` to start indexing all officially supported repositories.\n\nAfter indexing is done, Elixir should be available under the following URL on your host:\nhttp://172.17.0.2/musl/latest/source\n\nIf 172.17.0.2 does not answer, you can check the IP address of the container by running:\n\n # docker inspect elixir-container | grep IPAddress\n\n== Automatic repository updates\n\nThe Docker image does not automatically update repositories by itself.\nYou can, for example, start `index /srv/elixir-data --all` in the container (or in a separate container, with Elixir data volume/directory mounted)\nfrom cron on the host to periodically update repositories.\n\n== Using Docker image as a development server\n\nYou can easily use the Docker image as a development server by following the steps above, but mounting Elixir source directory from the host\ninto `/usr/local/elixir/` in the container when running `docker run elixir`.\n\nChanges in the code made on the host should be automatically reflected in the container.\nYou can use `apache2ctl` to restart Apache.\nError logs are available in `/var/log/apache2/error.log` within the container.\n\n= Hardware requirements\n\nPerformance requirements depend mostly on the amount of traffic that you get\non your Elixir service. However, a fast server also helps for the initial\nindexing of the projects.\n\nSSD storage is strongly recommended because of the frequent access to\ngit repositories.\n\nAt Bootlin, here are a few details about the server we're using:\n\n* As of July 2019, our Elixir service consumes 17 GB of data (supporting all projects),\nor for the Linux kernel alone (version 5.2 being the latest), 12 GB for indexing data,\nand 2 GB for the git repository.\n* We're using an LXD instance with 8 GB of RAM on a cloud server with 8 CPU cores\nrunning at 3.1 GHz.\n\n= Contributing to Elixir\n\n== Supporting a new project\n\nElixir has a very simple modular architecture that allows to support\nnew source code projects by just adding a new file to the Elixir sources.\n\nElixir's assumptions:\n\n* Project sources have to be available in a git repository\n* All project releases are associated to a given git tag. Elixir\nonly considers such tags.\n\nFirst make an installation of Elixir by following the above instructions.\nSee the `projects` subdirectory for projects that are already supported.\n\nOnce Elixir works for at least one project, it's time to clone the git\nrepository for the project you want to support:\n\n cd /srv/git\n git clone --bare https://github.com/zephyrproject-rtos/zephyr\n\nAfter doing this, you may also reference and fetch remote branches for this project,\nfor example corresponding to the `stable` tree for the Linux kernel (see the\ninstructions for Linux earlier in this document).\n\nNow, in your `LXR_PROJ_DIR` directory, create a new directory for the\nnew project:\n\n cd $LXR_PROJ_DIR\n mkdir -p zephyr/data\n ln -s /srv/git/zephyr.git repo\n export LXR_DATA_DIR=$LXR_PROJ_DIR/data\n export LXR_REPO_DIR=$LXR_PROJ_DIR/repo\n\nNow, go back to the Elixir sources and test that tags are correctly\nextracted:\n\n ./script.sh list-tags\n\nDepending on how you want to show the available versions on the Elixir pages,\nyou may have to apply substitutions to each tag string, for example to add\na `v` prefix if missing, for consistency with how other project versions are\nshown. You may also decide to ignore specific tags. All this can be done\nby redefining the default `list_tags()` function in a new `projects/\u003cprojectname\u003e.sh`\nfile. Here's an example (`projects/zephyr.sh` file):\n\n list_tags()\n {\n     echo \"$tags\" |\n     grep -v '^zephyr-v'\n }\n\nNote that `\u003cproject_name\u003e` *must* match the name of the directory that\nyou created under `LXR_PROJ_DIR`.\n\nThe next step is to make sure that versions are classified as you wish\nin the version menu. This classification work is done through the\n`list_tags_h()` function which generates the output of the `./scripts.sh list-tags -h`\ncommand. Here's what you get for the Linux project:\n\n v4 v4.16 v4.16\n v4 v4.16 v4.16-rc7\n v4 v4.16 v4.16-rc6\n v4 v4.16 v4.16-rc5\n v4 v4.16 v4.16-rc4\n v4 v4.16 v4.16-rc3\n v4 v4.16 v4.16-rc2\n v4 v4.16 v4.16-rc1\n ...\n\nThe first column is the top level menu entry for versions.\nThe second one is the next level menu entry, and\nthe third one is the actual version that can be selected by the menu.\nNote that this third entry must correspond to the exact\nname of the tag in git.\n\nIf the default behavior is not what you want, you will have\nto customize the `list_tags_h` function.\n\nYou should also make sure that Elixir properly identifies\nthe most recent versions:\n\n ./script.sh get-latest-tags | head\n\nIf needed, customize the `get_latest_tags()` function.\n\nIf you want to enable support for `compatible` properties in Devicetree files,\nadd `dts_comp_support=1` at the beginning of `projects/\u003cprojectname\u003e.sh`.\n\nYou are now ready to generate Elixir's database for your\nnew project:\n\n ./update.py \u003cnumber of threads\u003e\n\nYou can then check that Elixir works through your http server.\n\n== Coding style\n\nIf you wish to contribute to Elixir's Python code, please\nfollow the https://www.python.org/dev/peps/pep-0008/[official coding style for Python].\n\n== How to send patches\n\nThe best way to share your contributions with us is to https://github.com/bootlin/elixir/pulls[file a pull\nrequest on GitHub].\n\n= Automated testing\n\nElixir includes a simple test suite in `t/`.  To run it,\nfrom the top-level Elixir directory, run:\n\n prove\n\nThe test suite uses code extracted from Linux v5.4 in `t/tree`.\n\n== Licensing of code in `t/tree`\n\nThe copied code is licensed as described in the https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/COPYING[COPYING] file included with\nLinux.  All the files copied carry SPDX license identifiers of `GPL-2.0+` or\n`GPL-2.0-or-later`.  Per https://www.gnu.org/licenses/gpl-faq.en.html#AllCompatibility[GNU's compatibility table], GPL 2.0+ code can be used\nunder GPLv3 provided the combination is under GPLv3.  Moreover, https://www.gnu.org/licenses/license-list.en.html#AGPLv3.0[GNU's overview\nof AGPLv3] indicates that its terms \"effectively consist of the terms of GPLv3\"\nplus the network-use paragraph.  Therefore, the developers have a good-faith\nbelief that licensing these files under AGPLv3 is authorized.  (See also https://github.com/Freemius/wordpress-sdk/issues/166#issuecomment-310561976[this\nissue comment] for another example of a similar situation.)\n\n= License\n\nElixir is copyright (c) 2017--2020 its contributors.  It is licensed AGPLv3.\nSee the `COPYING` file included with Elixir for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbootlin%2Felixir","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbootlin%2Felixir","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbootlin%2Felixir/lists"}