Postagem completa do processo https://ask.oceanbase.com/t/topic/35604437/7
1. Pergunta
Conforme mencionado, encontrei o seguinte erro ao compilar o miniob.
[mu@vm-cnt8:~/code/miniob]$ sudo bash build.sh init
build.sh init
HEAD is now at 5df3037d Merge branch 'release-2.1.12-stable-pull' into patches-2.1
build.sh: line 83: cmake: command not found
build.sh: line 91: cmake: command not found
build.sh: line 99: cmake: command not found
build.sh: line 107: cmake: command not found
De acordo com o significado literal, o comando cmake não pode ser encontrado, mas meu sistema já possui um ambiente qualificado; a seguir está how_to_build.md
o conteúdo dos documentos no armazém gihub/miniob
MiniOB requer:
- versão cmake >= 3.13
- gcc/clang gcc recomenda 8.3 ou superior, o compilador precisa suportar o novo padrão c++20
- flex (2.5+), bison (3.7+) para gerar código de análise léxica e sintática
O sistema que utilizo é a máquina virtual vmware do centos8-steam; o commit do miniob usado atualmente é
76221e46e66ef408771ce886aa0c586a09374b0d
A seguir estão os números de versão de cada dependência do meu sistema. Você pode ver que no subusuário todos os comandos das dependências podem ser executados normalmente.
[mu@vm-cnt8:~/code/miniob]$ gcc --version
gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-20)
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[mu@vm-cnt8:~/code/miniob]$ cmake --version
cmake version 3.27.4
CMake suite maintained and supported by Kitware (kitware.com/cmake).
[mu@vm-cnt8:~/code/miniob]$ flex --version
flex 2.6.1
[mu@vm-cnt8:~/code/miniob]$ bison --version
bison (GNU Bison) 3.8
Written by Robert Corbett and Richard Stallman.
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
No root, você também pode executar esses comandos normalmente
[root@vm-cnt8:~]# cmake --version
cmake version 3.27.4
CMake suite maintained and supported by Kitware (kitware.com/cmake).
[root@vm-cnt8:~]# flex --version
flex 2.6.1
[root@vm-cnt8:~]# bison --version
bison (GNU Bison) 3.8
Written by Robert Corbett and Richard Stallman.
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Mas quando o sudo executa o script de instalação do miniob, o comando cmake não pode ser encontrado.
2. processo de depuração
Após o ensinamento do chefe, aprendi um novo uso do sudo:sudo -E
sudo -E
É para herdar as variáveis de ambiente do usuário atual e executar o comando após sudo, caso contrário as variáveis de ambiente serão limpas;
No entanto, ao usá-lo pela primeira vez, o miniob ainda não pode ser compilado com êxito e o comando cmake não pode ser encontrado.
[mu@vm-cnt8:~/code/miniob]$ sudo -E bash build.sh init
[sudo] password for mu:
build.sh init
HEAD is now at 5df3037d Merge branch 'release-2.1.12-stable-pull' into patches-2.1
build.sh: line 83: cmake: command not found
build.sh: line 91: cmake: command not found
build.sh: line 99: cmake: command not found
build.sh: line 107: cmake: command not found
[mu@vm-cnt8:~]$ sudo -E cmake --version
[sudo] password for mu:
sudo: cmake: command not found
3. Solução final: variável de ambiente PATH
A solução final foi algo que eu mesmo inventei (o chefe também me respondeu com esta solução)
sudo -E
Atualmente, o comando cmake não pode ser encontrado ao usar o subusuário .
[mu@vm-cnt8:~]$ sudo -E cmake --version
[sudo] password for mu:
sudo: cmake: command not found
As variáveis de ambiente PATH em meu sistema são as seguintes.
[mu@vm-cnt8:~]$ sudo env | grep PATH
PATH=/sbin:/bin:/usr/sbin:/usr/bin
O caminho do cmake é o seguinte
[mu@vm-cnt8:~]$ type cmake
cmake is /usr/local/bin/cmake
[mu@vm-cnt8:~]$ whereis cmake
cmake: /usr/local/bin/cmake /usr/share/cmake
É possível que o comando não possa ser encontrado durante o sudo porque cmake não está na variável de ambiente PATH? Embora o cmake possa ser executado diretamente pelos usuários root e mu.
Então fui ao root e executei uma conexão suave.
[root@vm-cnt8:~]# ls /usr/bin | grep cmake
[root@vm-cnt8:~]# ln -s /usr/local/bin/cmake /usr/bin/cmake
[root@vm-cnt8:~]# ll /usr/bin | grep cmake
lrwxrwxrwx. 1 root root 20 Sep 1 05:57 cmake -> /usr/local/bin/cmake
Tente novamente
$ sudo -E cmake --version
cmake version 3.27.4
CMake suite maintained and supported by Kitware (kitware.com/cmake).
Finalmente, tente compilar novamente. Deve estar OK. O Init foi executado com sucesso e a compilação passou sem erros.
Obrigado aos líderes da comunidade miniob pela ajuda!
4. Conclusão
Se um comando aparecer, tanto o root quanto os subusuários podem executá-lo, mas o sudo no subusuário não consegue encontrar o comando. Você pode tentar verificar se o caminho onde o comando está localizado não corresponde à variável de ambiente PATH do atual sistema!