entendendo a terminologia do arquivo .sh e o cmake

1

Estou tentando usar o cmake e o OpenGL para aprender computação gráfica, e o tutorial inclui um arquivo run.sh que deve compilar / construir os programas cpp. Aqui está o código:

#!/bin/bash
#calls cd build 
#cmake .. -DSRC<argument> && make argument

EMBEDDED='echo $2'
DIRECTORY='echo $1 |cut -d'/' -f1'
FILENAME='echo $1 |cut -d'/' -f2 |cut -d'.' -f1 | sed -e "s|/|_|g"'
TARGET=${FILENAME}

mkdir build
cd build
rm bin/${TARGET}
cmake .. -DSRC=../$1
make VERBOSE=1
bin/${TARGET}

Pelo que entendi, mkdir cria um diretório de compilação, então 'cd' nesse diretório, remove algo da compilação anterior, cmake o arquivo real, não tenho idéia do que faz "VERBOSE = 1", e então eu Estou pensando em acessar o executável na última linha.

Eu não entendo o que o meio bloco de código que começa com EMBEDDED faz, nem tenho certeza sobre o que o terceiro comentário "#cmake ..." faz. Eu estou usando arquivos cpp, e eu acho que tenho que passar o arquivo como um argumento de linha de comando junto com ./run.sh.

    
por user3150552 07.08.2018 / 14:48

1 resposta

3

tarefa excessivamente complicada

EMBEDDED='echo $2'

Isso leva o segundo argumento para o script e executa um split e um glob nele (surpresa!) e passa o resultado disso para echo e então atribui o resultado de qualquer echo (o que, devido a featurism rastejando, pode não ser um eco ) para EMBEDDED . Isto é provavelmente mais sensivelmente escrito usando um simples

EMBEDDED=$2

declaração de atribuição.

determinação de componentes de caminho de arquivo excessivamente complicada

DIRECTORY='echo $1 |cut -d'/' -f1'

Isso pode ser escrito com mais atenção usando o comando dirname(1) com também "" para eliminar o split POSIX e glob como um provavelmente não quer os resultados da divisão (surpresa) e do glob que são atribuídos a DIRECTORY .

DIRECTORY='dirname "$1"'

No entanto, dirname e cut -d'/' -f1 não são iguais, a menos que a única entrada seja somedirectory/somefile . Alguém precisaria entender as entradas para o código para saber se a simplificação para dirname pode ser feita. As entradas esperadas não estão documentadas no roteiro postado na pergunta - elas estão documentadas em algum lugar?

Em uma nota relacionada, há um comando basename(1) que pode ajudar com

FILENAME='echo $1 |cut -d'/' -f2 |cut -d'.' -f1 | sed -e "s|/|_|g"'

embora apareça este pipeline com cut -d'.' -f1 tentando obter um prefix de prefix.whatever , e não tenho idéia para qual sed -e "s|/|_|g" serve, pois / não pode aparecer em nomes de arquivos. Se houver _ no argumento sendo passado, seria mais sensato passá-las como _ e não adicionar código extra para alterar / em _ . Então, provavelmente, o acima poderia ser simplificado para

FILENAME='basename "$1" | cut -d'.' -f1'

comandos desnecessariamente perigosos

mkdir build
cd build
rm bin/${TARGET}

Esta sequência pode ou não criar um diretório build e, em seguida, tentará excluir várias coisas do novo diretório build ou da falha do pai dele. Isso é desleixado e indeterminado. E por várias coisas quero dizer que ${TARGET} será expandido com o POSIX shell split e glob, então pode conter nomes de arquivos bastante inesperados - por sorte o rm não é o usual "oh sim, sobre esse sistema de arquivos que você acabou de perder" rm -rf então a hilaridade será limitada a vários (ainda surpreendentes!) nomes de arquivos, possivelmente do diretório errado.

(Alguns podem argumentar que o gerenciamento de configuração ou pelo menos comandos protegidos deve ser usado em vez de scripts de shell frágeis e propensos a erros , mas aqui estamos nós ...)

[ -d build ] || { mkdir build; [ -d build ] || exit 1; }
cd build || exit 1
rm bin/"${TARGET}"
cmake .. -DSRC=../"$1" && make VERBOSE=1 && bin/"${TARGET}"

Aqui build é um diretório, é feito como um diretório ou, na sua falta, o script aplica (você também pode adicionar uma mensagem de erro personalizada, embora o mkdir normalmente faça ruído). Isso não é atômico, pois algo mais poderia touch build entre a -d check e subseqüente mkdir , então outra abordagem é "fazer o diretório e então inspecionar o resultado para ver se foi uma falha (não ok) ou EEXIST em um diretório (ok). cd também é verificado quanto a falhas, e $TARGET cotado para evitar a divisão POSIX e glob do POSIX.

    
por 07.08.2018 / 18:12