UTFPR-PG / latex

LaTeX class and related things
3 stars 8 forks source link

make install not working #8

Open farosas opened 10 years ago

farosas commented 10 years ago

No meu sistema, TEXMFLOCAL retorna /usr/local/share/texmf:/usr/share/texmf então quando acontece: mkdir -p $(LOCAL)/{tex,source,doc}/latex/$(NAME) o make cria uma pasta "texmf:/" e ai já viu né..

Não sei se TEXMFLOCAL deveria retornar mais de um valor, mas como qualquer variável de ambiente dessas do tipo path pode ter mais de um valor, acho que deveríamos dar uma checada se tem como filtrar isso direito.

gbc921 commented 10 years ago

Depois de muito brigar com o google, achei:

Precisamos avisar o shell qual vai ser o internal field separator:

install: all
 IFS=:
 mkdir -p $(LOCAL)/{tex,source,doc}/latex/$(NAME)
 unset IFS

Provavelmente vai funcionar. Testo depois.

gbc921 commented 8 years ago

Ok, vamos lá novamente.

Para a (melhor) distro, Arch Linux o retorno da variável TEXMFLOCAL é /usr/local/share/texmf:/usr/share/texmf como citado anteriormente. No entanto (as of 2015-11-10) as duas pastas não existem, mas a /usr/share/texmf é substituída por usr/share/texmf-dist.

Provavelmente instalar os arquivos nessa pasta além de não surtir efeito, cairíamos no famoso problema de suporte a diferentes distribuições, além de requerer acesso root/sudo ao usuário.

Nos meus testes (tanto em texstudio e comando pdflatex) a instalação somente pela home do usuário (TEXMFHOME, inst no makefile) funciona like a charm. Acredito que se mantermos somente esse tipo de instalação, eliminamos o problema acima, não enfiamos o dedo nos arquivos do sistema e provavelmente a chance de possuírmos sucesso com esse diretório/solução em outras distros é maior.

O que acham?

gbc921 commented 8 years ago

Also, a questão do IFS ainda não está funcionando. Tentei usar as variações de declaração do IFS:

Sem sucesso nenhum. Ele não reconhece a porcaria como Field Separator. Pelo que vi o problema é que ele não consegue setar o IFS, pois se mandarmos imprimir ela aparece vazia.

farosas commented 8 years ago

Fiz um teste aqui e deu certo:

homes = $$VAR #export VAR=/root:/home

run:
        @echo $(homes)
        @IFS=':' ; \
        for path in $(homes); do \
          echo $$path ; \
        done
gbc921 commented 8 years ago

Hum, deu parcialmente certo aqui:

LOCAL = /home/<username>/tmp/usr/local/share/texmf:/home/<username>/tmp/usr/share/texmf
install: all
    @IFS=':'; \
    for path in $(LOCAL); do \
        echo  $$path/tex/latex/$(NAME); \
        mkdir -p $$path/{tex,source,doc}/latex/$(NAME); \
#cp $(NAME).dtx $$path/source/latex/$(NAME); \
#cp $(NAME).cls $$path/tex/latex/$(NAME); \
#cp $(NAME).pdf $$path/doc/latex/$(NAME); \
    done
    unset IFS

A questão é que para o primeiro passo do for, ele não expande o $(NAME) e não cria a pasta final utpfr-pg, mas no segundo isso acontece. Tanto que se descomentar o cp ele quer tentar copiar a pasta, ao invés do arquivo (ommiting directory err).

Não cheguei a testar se a opção -p do mkdir teria influência nisso, mas a expansão {} não tem.

E a questão sobre a logística que comentei ali em cima, alguma opinião?

gabrielprioli commented 8 years ago

Algo que pode ajudar a entender o problema é o fato de que o mkdir só considera a expansão feita por {} no último valor da variável $LOCAL. Testamos sem a última variável $NAME para simplicidade.

$ LOCAL=./a:./b:./c
$ IFS=:
$ mkdir $LOCAL/{d,e}
mkdir: cannot create directory `./c/d': No such file or directory
mkdir: cannot create directory `./a': File exists
mkdir: cannot create directory `./b': File exists
mkdir: cannot create directory `./c/e': No such file or directory
$ ls
a  b

Pela execução acima (com erro forçado) vemos que o mkdir tentou criar "/c/d" e "/c/e" corretamente (expandindo o {}), mas não expandiu para os dois primeiros valores da variavel $LOCAL. Portanto, as execuções de mkdir foram as seguintes:

mkdir ./a # criou o diretório com sucesso
mkdir ./a # erro que vemos no output do mkdir
mkdir ./b # criou o diretório com sucesso
mkdir ./b # erro que vemos no output do mkdir
mkdir ./c/d # erro que vemos no output do mkdir (forçado sem opção -p)
mkdir ./c/e # erro que vemos no output do mkdir (forçado sem opção -p)

PS: estava discutindo isso com o Gabriel e registrei para documentar o que testamos!

farosas commented 8 years ago
root@localhost:~ $ cat Makefile
homes = $$VAR #export VAR=/root:/home
name = pkg
run:
        @set -x; IFS=: ; \
        for path in $(homes); do \
            mkdir -p $$path/{tex,src,doc}/latex/$(name) ; \
        done
root@localhost:~ $ make
+ IFS=:
+ for path in '$VAR'
+ mkdir -p /root/tex/latex/pkg /root/src/latex/pkg /root/doc/latex/pkg
+ for path in '$VAR'
+ mkdir -p /home/tex/latex/pkg /home/src/latex/pkg /home/doc/latex/pkg
root@localhost:~ $ for dir in /{root,home}/{tex,src,doc}/latex/pkg; do [ -d $dir ] && echo "$dir exists"; done
/root/tex/latex/pkg exists
/root/src/latex/pkg exists
/root/doc/latex/pkg exists
/home/tex/latex/pkg exists
/home/src/latex/pkg exists
/home/doc/latex/pkg exists
root@localhost:~ $

Não entendi o lance de não expandir a variável. É GNU make que vocês estão usando?

GNU Make 3.82
Built for armv5tel-redhat-linux-gnu

Sobre a questão de colocar tudo no ~/texmf, eu concordo. Fica mais simples de manter.