Suprimir nova linha ao ativar um array

1

Isso é uma continuação do Awk e descartando tokens não correspondentes em uma string? Estou usando o Awk para filtrar sinalizadores indesejados do compilador derivados dos recursos da CPU (o SunCC 12.2 não pode manipular os mesmos sinalizadores do SunCC 12.5). O CXXFLAGS produzido pelo filtro resulta em um erro de compilação no SunCC 12.2:

/opt/solstudio12.2/bin/CC -DDEBUG -g -xO0 -D__SSE2__ -D__SSE3__ -D__SSSE3__
usage: usage: CCCC [ options ] files.  Use 'CC -flags' for details
 [ options ] files.  Use 'CC -flags' for details
usage: CC [ options ] files.  Use 'CC -flags' for details
usage: CC [ options ] files.  Use 'CC -flags' for details
m64 -KPIC -template=no%extdef -w -erroff=wvarhidemem -erroff=voidretw -c cryptlib.cpp

O que está acontecendo é que o Awk está produzindo -D__SSE2__ -D__SSE3__ -D__SSSE3__ + \n . Então o CXXLAGS está sendo dividido em duas linhas, o que leva ao seguinte do GNUmake:

  1. /opt/solstudio12.2/bin/CC -DDEBUG -g -xO0 -D__SSE2__ -D__SSE3__ -D__SSSE3__
  2. -m64 -KPIC -template=no%extdef -w -erroff=wvarhidemem -erroff=voidretw -c cryptlib.cpp

Quando eu depurar o script Bash que direciona isso. As linhas 1012 e 1014 parecem ser problemáticas se eu estiver analisando a saída corretamente.

$ PS4='Line ${LINENO}: ' bash -x ./cryptest.sh
...
Line 1005: SUNCC_CXXFLAGS='-D__SSE2__ -D__SSE3__ -D__SSSE3__'
Line 1008: echo 'PLATFORM_CXXFLAGS: -D__SSE2__' -D__SSE3__ -D__SSSE3__
PLATFORM_CXXFLAGS: -D__SSE2__ -D__SSE3__ -D__SSSE3__
Line 1009: echo 'SUNCC_CXXFLAGS: -D__SSE2__ -D__SSE3__ -D__SSSE3__'
SUNCC_CXXFLAGS: -D__SSE2__ -D__SSE3__ -D__SSSE3__
LLine 1012: echo '-D__SSE2__ -D__SSE3__ -D__SSSE3__'
LLine 1012: /usr/gnu/bin/awk /SSE/ 'ORS= ' 'RS= '
Line 1012: SUNCC_SSE_CXXFLAGS='-D__SSE2__ -D__SSE3__ -D__SSSE3__
 '
Line 1014: echo 'SUNCC_SSE_CXXFLAGS: -D__SSE2__ -D__SSE3__ -D__SSSE3__
 '
SUNCC_SSE_CXXFLAGS: -D__SSE2__ -D__SSE3__ -D__SSSE3__

Line 1020: [[ -e /opt/solstudio12.2/bin/CC ]]

Aqui está a fonte Bash correspondente. Eu acredito que o ofensor é a linha 1012, SUNCC_SSE_CXXFLAGS=$(echo "$SUNCC_CXXFLAGS" | "$AWK" '/SSE/' ORS=' ' RS=' ') .

1003   # If PLATFORM_CXXFLAGS is for SunCC, then use them
1004   if [[ ("$SUNCC_121_OR_ABOVE" -ne "0") ]]; then
1005       SUNCC_CXXFLAGS="${PLATFORM_CXXFLAGS[@]}"
1006   fi
1007   
1008   echo "PLATFORM_CXXFLAGS: ${PLATFORM_CXXFLAGS[@]}"
1009   echo "SUNCC_CXXFLAGS: ${SUNCC_CXXFLAGS[@]}"
1010
1011   # Sun Studio 12.3 and below workaround, http://github.com/weidai11/cryptopp/issues/228
1012   SUNCC_SSE_CXXFLAGS=$(echo "$SUNCC_CXXFLAGS" | "$AWK" '/SSE/' ORS=' ' RS=' ')
1013
1014   echo "SUNCC_SSE_CXXFLAGS: ${SUNCC_SSE_CXXFLAGS[@]}"
...
1018   ############################################
1019   # Sun Studio 12.2
1020   if [[ (-e "/opt/solstudio12.2/bin/CC") ]]; then

A minha pergunta é: como suprimir nova linha ao ativar um array no Solaris?

Veja como o script invoca make. O script pode ser encontrado em cryptest.sh . É um monstro, mas as linhas problemáticas estão em torno de 2880 (a linha 1000 de cima é o caso de teste reduzido para ajudar a isolar as coisas).

CXXFLAGS="-DDEBUG -g -xO0 ${SUNCC_SSE_CXXFLAGS[@]}"
CXX="/opt/solstudio12.2/bin/CC" CXXFLAGS="$CXXFLAGS" "$MAKE" "${MAKEARGS[@]}" static dynamic cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"

Veja como o PLATFORM_CXXFLAGS é formado. É necessário para o nosso código-fonte, porque os caminhos de código são ativados com base nas definições do GCC (mas o SunCC não os define).

if [[ ("$IS_SOLARIS" -ne "0") && ("$SUNCC_121_OR_ABOVE" -ne "0") ]]; then
    ISAINFO=$(isainfo -v 2>/dev/null)
    if [[ ($(echo "$ISAINFO" | "$GREP" -c "sse2") -ne "0") ]]; then PLATFORM_CXXFLAGS+=("-D__SSE2__"); fi
    if [[ ($(echo "$ISAINFO" | "$GREP" -c "sse3") -ne "0") ]]; then PLATFORM_CXXFLAGS+=("-D__SSE3__"); fi
    if [[ ($(echo "$ISAINFO" | "$GREP" -c "ssse3") -ne "0") ]]; then PLATFORM_CXXFLAGS+=("-D__SSSE3__"); fi
    if [[ ($(echo "$ISAINFO" | "$GREP" -c "sse4.1") -ne "0") ]]; then PLATFORM_CXXFLAGS+=("-D__SSE4_1__"); fi
    if [[ ($(echo "$ISAINFO" | "$GREP" -c "sse4.2") -ne "0") ]]; then PLATFORM_CXXFLAGS+=("-D__SSE4_2__"); fi
    if [[ ($(echo "$ISAINFO" | "$GREP" -c "aes") -ne "0") ]]; then PLATFORM_CXXFLAGS+=("-D__AES__"); fi
    if [[ ($(echo "$ISAINFO" | "$GREP" -c "pclmulqdq") -ne "0") ]]; then PLATFORM_CXXFLAGS+=("-D__PCLMUL__"); fi
    if [[ ($(echo "$ISAINFO" | "$GREP" -c "rdrand") -ne "0") ]]; then PLATFORM_CXXFLAGS+=("-D__RDRND__"); fi
    if [[ ($(echo "$ISAINFO" | "$GREP" -c "rdseed") -ne "0") ]]; then PLATFORM_CXXFLAGS+=("-D__RDSEED__"); fi
    if [[ ($(echo "$ISAINFO" | "$GREP" -c "avx") -ne "0") ]]; then PLATFORM_CXXFLAGS+=("-D__AVX__"); fi
    if [[ ($(echo "$ISAINFO" | "$GREP" -c "avx2") -ne "0") ]]; then PLATFORM_CXXFLAGS+=("-D__AVX2__"); fi
    if [[ ($(echo "$ISAINFO" | "$GREP" -c "bmi") -ne "0") ]]; then PLATFORM_CXXFLAGS+=("-D__BMI__"); fi
    if [[ ($(echo "$ISAINFO" | "$GREP" -c "bmi2") -ne "0") ]]; then PLATFORM_CXXFLAGS+=("-D__BMI2__"); fi
fi
    
por Community 24.08.2016 / 03:36

1 resposta

3

Em:

echo '-D__SSE2__ -D__SSE3__ -D__SSSE3__' | awk /SSE/ RS=' ' ORS=' '

Você está alimentando -D__SSE2__ -D__SSE3__ -D__SSSE3__<newline> a awk ( echo adiciona a nova linha).

Com RS=' ' , isso significa 3 registros: -D__SSE2__ , -D__SSE3__ e -D__SSSE3__<newline> . Todas as correspondências /SSE/ são impressas, seguidas pelo separador de registro de saída ( ORS=' ' ). Para o terceiro, é -D__SSSE3__<newline><space>

Então, aqui, você quer não gerar o <newline> em primeiro lugar:

printf %s '-D__SSE2__ -D__SSE3__ -D__SSSE3__' | awk...

Ou adicione um espaço extra, para que o <newline> esteja em seu próprio registro (que não corresponde a /SSE/ ):

echo '-D__SSE2__ -D__SSE3__ -D__SSSE3__ ' | awk...

Ou, como você está usando o GNU awk em oposição ao Solaris, torne qualquer sequência de espaçamento caractere o separador de registro:

echo -D__SSE2__ -D__SSE3__ -D__SSSE3__ | gawk -v 'RS=[[:space:]]+' ...
    
por 24.08.2016 / 18:13