Você tem os comandos, então coloque-os em um script!
Para executar vários comandos em dados diferentes, coloque os dados alterados em uma variável .
Para executar gcov
e mv
em todos os arquivos, há vários métodos possíveis, incluindo:
- Execute
gcov
em todos os arquivos e mova-os. - Execute
gcov
em um arquivo e mova sua saída. - Execute
gconv
nos arquivos em um diretório e mova-os.
A primeira abordagem não funciona porque gcov
precisa ser executado no diretório que contém os arquivos de origem. A terceira abordagem baseada em diretório é, na verdade, a mais complicada das três: o método mais simples seria executar gcov
em um arquivo de cada vez.
No bash, você pode enumerar todos os arquivos C em um diretório e seus subdiretórios recursivamente com o padrão de curinga **/*.c
. O curinga **
precisa ser ativado com a globstar
opção . Para iterar os arquivos, use um for loop
.
Para mudar para um diretório apenas para executar um comando, execute cd
e esse comando em um subshell : (cd … && gcov …)
.
Você precisa de mais um tipo de construção de shell: um pouco de manipulação de nomes de arquivos para extrair a parte do diretório. A expansão do parâmetro construct ${x%/*}
se expande para o valor da variável x
com o menor sufixo correspondente ao padrão /*
removido. Em outras palavras, essa é a parte do diretório do nome do arquivo armazenado em x
. Isso não funcionaria se x
consistisse apenas em um nome de arquivo sem parte de diretório (por exemplo, foo
em oposição a bar/foo
); Acontece que não há nenhum arquivo .c
na raiz da árvore de código-fonte do OpenSSL, mas uma maneira simples de garantir que o nome do arquivo comece com ./
, que designa o diretório atual.
Invoque esse script na raiz da árvore de código-fonte do OpenSSL, depois de executar ./config
com as opções desejadas.
#!/bin/bash
shopt -s globstar
gcov_data_dir="../../gcovdata/${PWD##*/}"
make
make tests
for x in ./**/*.c; do
mkdir -p "$gcov_data_dir/${x%/*}"
(cd "${x%/*}" && gcov "${x##*/}") &&
mv "$x.gcov" "$gcov_data_dir/${x%/*}"
done
Para evitar a necessidade de mover os arquivos .gcov
, uma abordagem alternativa seria criar uma floresta de links simbólicos para o diretório de compilação e executar gcov
no diretório gcovdata
. Com o GNU coreutils (ou seja, no Linux ou Cygwin não integrado), você pode fazer isso com cp -al
.
cp -al openssl-1.0.0 gcovdata
cd gcovdata
for x in ./**/*.c; do
(cd "${x%/*}" && gcov "${x##*/}")
done