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
gcovem todos os arquivos e mova-os. - Execute
gcovem um arquivo e mova sua saída. - Execute
gconvnos 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