Find dependencies
Continued lines ('\')
Some ports' Makefiles contain line-continuations making it non-trivial to find dependencies etc. These lines end in a '\' so an OPT_USE could be on one line whereas the mysql may appear on a different line
To counter this, use
perl -pe 's/\\\n/ /' {} \;
to remove line-continuations.
Finding in files
Finding in (all) files is a lot easier with textproc/the_silver_searcher or textproc/ripgrep. To find all relevant files containing references to mysql as a first filter use
ag --ignore 'pkg-*' --ignore 'distinfo' --ignore 'patch-*' mysql
Silver Searcher/ag will perform a case-insensitive search by default (switch with -s), RipGrep/rg defaults to case-sensitive (switch with -i).
Example
This example is used to refactor the MySQL part from Mk/bsd.databases.mk to Mk/Uses/mysql.mk
To find all files requiring MySQL, you could use something like
Breaking this down
- Fast finding in files, limits the number of files that we need to process and many forks
- Concatenate continued lines so we can use grep
- Depenencies come in two forms that we need to find (USE_MYSQL and OPT_USE are always caps but the latter allows for mixed case values)
- - USE_MYSQL= boolean:option - OPT_USE= mysql=option
- We want to know what file this appears in, so add it again using sed
More info
https://people.freebsd.org/~ak/gettext/
Mk/Uses/mysql.mk
USE_MYSQL
193 ports contain USE_MYSQL
Mk/bsd.databases.mk defines values as client/server/embedded yet only server and embedded are handled specifically, everything else therefor is client
Found in ports: USE_MYSQL=([45]1+|[Yy][Ee][Ss]|client|compat|embedded|server)
server |
12 |
embedded |
1 |
client |
188 |
total |
201 |
Transformations
USE_MYSQL=\([ ]*\)server to USES+=\1mysql:server
USE_MYSQL=\([ ]*\)embedded to USES+=\1mysql:embedded
USE_MYSQL=\([ ]*\)([45]1+|[Yy][Ee][Ss]|client|compat) to USES+=\1mysql
OPT_USE= mysql
Often shown as OPT_USE= mysql=yes
There may already be a OPT_USES= line in the Makefile, take that into account
OPT_USE= [Mm][Yy][Ss][Qq][Ll]=([Yy][Ee][Ss]|client|compat|server
There may be multiple OPT_USE= variables
OPT_USE= MYSQL=client PHP=mysql,pdo_mysql
There's a USE_OFF awell MYSQLD_USE_OFF= MYSQL=client
Transformations
\([A-Z_]*\)_USE=\([ ]*\)[Mm][Yy][Ss][Qq][Ll]=[Yy][Ee][Ss] to \1_USES=\2mysql
Convert git diff
git diffs need to be transformed to use in ports.
--- a/src/openssl-dtls.c +++ b/src/openssl-dtls.c
needs to be transformed into
--- src/openssl-dtls.c.orig +++ src/openssl-dtls.c
This can easily be achieved with sed
sed -i '' -e 's|^--- a/\(.*\)|--- \1.orig|;s|^+++ b/|+++ |' patch-LibreSSL