Mover a estrutura de diretórios e preservar links simbólicos [duplicados]

1

Estou tentando resolver um problema do makefile em que as bibliotecas são instaladas no lugar errado. Alguém escreveu o makefile e não é fácil corrigi-lo. Estou tentando mover as bibliotecas depois que elas foram instaladas. A instalação inclui permissões, links simbólicos nos BSDs, Linux e Solaris.

Dado um prefix de /usr/local e libdir de /usr/local/lib/64/ , o makefile está colocando artefatos com libdir em prefix em vez de tratar libdir como um caminho absoluto. Aqui está parte da cópia que acontece:

cp libcrypto.pc /usr/local//usr/local/lib/64/pkgconfig
chmod 644 /usr/local//usr/local/lib/64/pkgconfig/libcrypto.pc
cp libssl.pc /usr/local//usr/local/lib/64/pkgconfig
chmod 644 /usr/local//usr/local/lib/64/pkgconfig/libssl.pc
cp openssl.pc /usr/local//usr/local/lib/64/pkgconfig
chmod 644 /usr/local//usr/local/lib/64/pkgconfig/openssl.pc

Eu achei que seria relativamente fácil pegar o /usr/local//usr/local/* e mover toda a árvore de artefatos para /usr/local , mas está se tornando mais complicado do que eu pensava.

Eu tentei várias sugestões para mover o diretório, incluindo Como mover todos os arquivos e pastas via comando mv e Mova arquivos e pastas recursivamente no Linux . Cada um deles sofreu pequenos problemas, como se mudar para /usr/local/lib/64/64/pkgconfig/openssl.pc e não preservar links simbólicos.

Olhando para a página man mv(1) do Linux, eu nem tenho certeza se há alguma garantia de preservação permissão e links simbólicos presentes em um diretório. O comando mv do Posix fala um pouco sobre permissões, mas é no contexto de escrever para o diretório de destino.

Eu também tentei remover componentes de caminho com ${filename:$prefix} , mas isso causou problemas com links simbólicos. ${filename:$prefix} provavelmente não é Posix, mas eu tenho Bash.

A minha pergunta é, é possível fazê-lo de forma portável nos BSDs, Linux, OS X e Solaris? Se sim, então como devo estar fazendo isso?

Aqui está o código que eu criei, mas parece que está errado:

# Fix OpenSSL's broken directory structure
path="$PREFIX/$LIBDIR"
while [ $(echo "$path" | cut -c1-3) != "lib" ]
do
    echo "PATH: $path"
    path=${path#*/}
done
echo "PATH: $path"

Aqui está a saída:

PATH: /usr/local//usr/local/lib/64
PATH: usr/local//usr/local/lib/64
PATH: local//usr/local/lib/64
PATH: /usr/local/lib/64
PATH: usr/local/lib/64
PATH: local/lib/64
PATH: lib/64

Seguido por:

cd "$PREFIX/$PREFIX"
mv "$path" "$PREFIX"
rm -rf "$PREFIX/$PREFIX"
    
por jww 19.07.2018 / 23:20

1 resposta

2

Acho que minha sugestão seria deixá-lo no lugar e criar um link em /usr/local/lib/ que direciona para este diretório /usr/local/lib/64/ .

Por exemplo:

$ tree usr/
usr/
└── local
    ├── lib
    │   └── 64 -> ../usr/local/lib/64
    └── usr
        └── local
            └── lib
                └── 64
                    └── pkgconfig

Eu fiz assim:

$ cd /usr/local/lib/
$ ln -s ../usr/local/lib/64 64

Isso normaliza a árvore, então isso funciona:

$ ls usr/local/lib/64/
pkgconfig
    
por 20.07.2018 / 00:12