Como tornar meu Makefile compatível com o Cygwin? (instalar: usuário inválido "root")

0

Eu escrevi um Makefile muito simples

$ cat Makefile

install_path=/usr/local/bin
script_name_1=encrypt-file-aes256
script_name_2=decrypt-file-aes256

.PHONY: install
.PHONY: uninstall

install:
        install -m 0755 -o root -g root -t $(install_path) $(script_name_1) $(script_name_2)

uninstall:
        rm $(install_path)/$(script_name_1) $(install_path)/$(script_name_2)

Funciona como um encanto no Linux Mint 18.3 Eu testei isso.

Mas não em Cygwin ; isso é o que eu recebo como um erro

$ make install

install -m 0755 -o root -g root -t /usr/local/bin encrypt-file-aes256 decrypt-file-aes256
install: invalid user ‘root’
make: *** [Makefile:9: install] Error 1

Eu sei que não há root usuário em Cygwin , mas não tenho ideia de como corrigi-lo.

Como generalizar o Makefile para funcionar em Cygwin e no Linux?

Comentários importantes integrados e respondidos aqui

  1. O que acontece se você eliminar completamente as opções -o e -g no sistema Cygwin ?

    Então funciona bem, mas o usuário e o grupo estariam errados em um sistema Linux, suponho.

  2. Codificar um nome de usuário e grupo parece ser uma má ideia.

    Eu admito que não pensei nisso, e quando eu agora penso nisso, eu também penso nisso.

  3. Recomendamos que você não codifique o caminho da instalação.

    Esta é uma ideia adorável e, sim, concordo, deixe que o usuário decida onde ele a instala.

  4. Como você está invocando este Makefile no Linux?

    Como usuário normal com sudo , ou seja, sudo make install .

  5. Se você conseguir que a linha 9 funcione fora de make , ela funcionará. Não é um problema make .

    Eu sei que não é um problema de make . Eu só não sabia como generalizar o Makefile para ele funcionar em Cygwin também.

por Vlastimil 12.06.2018 / 07:24

2 respostas

2

Aqui está um exemplo de Cygwin compatible Makefile :

DESTDIR?=/usr/local/bin
install_path=$(DESTDIR)
USER_ID=$(shell whoami)
GROUP_ID=$(shell id -gn)
script_name_1=encrypt-file-aes256
script_name_2=decrypt-file-aes256

.PHONY: install
.PHONY: uninstall

install:
    install -m 0755 -o $(USER_ID) -g $(GROUP_ID) -t $(install_path) $(script_name_1) $(script_name_2)

    # with long options together with verbosity turned on it might be better for users
    #install --verbose --mode=0755 --owner=$(USER_ID) --group=$(GROUP_ID) --target-directory=$(install_path) $(script_name_1) $(script_name_2)

uninstall:
    rm $(install_path)/$(script_name_1) $(install_path)/$(script_name_2)

Quando você quiser instalar em qualquer outro local, poderá substituir a variável DESTDIR ou fornecer uma na Makefile .

Quando você executar o script como sudo em GNU/Linux , o USER_ID será definido como raiz.

Observação: foi confirmado em GNU/Linux .

Notas do editor:

  1. Verificado em Cygwin .

  2. Alterou a maneira como USER_ID e GROUP_ID são atribuídos ao padrão shell builtin.

  3. Adicionada versão de opções longas com verbosidade, em um comentário.

  4. Se você quiser alterar o destino, pode simplesmente invocar, por exemplo:

    DESTDIR=/desired/target/directory/ make install
    
por 12.06.2018 / 07:47
0

O problema não é o Makefile , mas um problema causado pelo fato de seu programa install ser incompatível com o Cygwin.

Se você gosta de ter sistemas de construção portáteis que funcionam em plataformas sem root usuário, você precisa de um programa melhor install que seja capaz de detectar se o usuário atual é capaz de alterar o propriedade de arquivos para o usuário desejado.

Eu recomendo ver o script conf/install-sh no schilytools package .

Foi escrito para suportar Cygwin e o script é gratuito.

    
por 12.06.2018 / 12:46