Zacząłem używać trybu org do planowania moich zadań w systemie GTD . Umieszczając wszystkie pliki org w katalogu folderu Dropbox , uruchamiam emacsa, aby edytować / zarządzać tymi plikami z trzech różnych lokalnych komputerów: Cygwin, Mac OS X i Debian. Ponieważ korzystam również z MobileOrg, aby uzyskać dostęp do tych plików org z mojego iPada, checksums.dat
plik musi być aktualizowany po wprowadzeniu jakichkolwiek zmian. Można to zrobić, uruchamiając md5sum *.org > checksums.dat
.
Problem polega na tym, że istnieją trzy różne polecenia do md5sum
polecenia: md5sum.exe
w Cygwin, md5
w Mac OS X i md5sum
w Debianie. Najbardziej idealną sytuacją jest plik makefile zapisany w foderze Dropbox, wykrywa, które polecenie jest dostępne w bieżącej maszynie i uruchamia to polecenie, aby wykonać operację sumy kontrolnej md5.
autotools
make checksum
aby wygenerować dane sumy kontrolnej w folderze Dropbox, chcę, aby plik makefile używał odpowiedniego polecenia po wykryciu, które polecenie sumy kontrolnej jest dostępne na bieżącym komputerze.Odpowiedzi:
Możliwe polecenia do wygenerowania sumy kontrolnej
Niestety nie ma standardowego narzędzia do generowania kryptograficznej sumy kontrolnej. Jest to standardowe narzędzie do generowania CRC:
cksum
; może to być wystarczające do wykrycia zmian w nieprzyjaznym środowisku.Polecam używanie SHA1 zamiast MD5. Nie ma wielu systemów, które mają narzędzie MD5, ale nie ma SHA1, a jeśli zamierzasz użyć kryptograficznych sum kontrolnych, równie dobrze możesz użyć algorytmu bez znanej metody znajdowania kolizji (zakładając, że również sprawdzasz rozmiar).
Jednym z nietypowych, ale powszechnych narzędzi, które mogą obliczać skróty, jest OpenSSL . Jest dostępny dla Cygwin, Debian i OSX, ale niestety nie jest częścią domyślnej instalacji w OSX.
W OSX 10.6 jest
shasum
narzędzie, które jest również obecne w Debianie (jest to częśćperl
pakietu) i wierzę również w Cygwin. To jest skrypt Perla. Większość systemów uniksowych ma zainstalowanego Perla, więc możesz spakować ten skrypt razem z plikiem makefile, jeśli martwisz się, że ten skrypt nie będzie dostępny wszędzie.Wybór właściwego polecenia dla twojego systemu
Ok, powiedzmy, że naprawdę nie możesz znaleźć polecenia, które działa wszędzie.
W skorupce
Użyj
type
wbudowanego, aby sprawdzić, czy polecenie jest dostępne.Marka GNU
Możesz użyć tej
shell
funkcji do uruchomienia fragmentu powłoki, gdy plik makefile jest załadowany i zapisać dane wyjściowe w zmiennej.Marka przenośna (POSIX)
Komendy powłoki można uruchamiać tylko w regule, więc każda reguła obliczająca sumę kontrolną musi zawierać kod odnośnika. Możesz umieścić fragment kodu w zmiennej. Pamiętaj, że osobne wiersze w regułach są oceniane niezależnie. Pamiętaj również, że
$
znaki, które mają być przekazane do powłoki, muszą być zabezpieczone$$
.źródło
-P
opcjitype
polecenia, aby opisana powyżej metoda „GNU make” działała poprawnie, więc skończyłem zsum := $(shell { type -P sha1sum || type -P sha1 || type -P shasum; } 2>/dev/null)
.type -P
działa tylko wtedy, gdy twoja powłoka jest bash, a nie, jeśli jest to np. ksh lub dash (co ma miejsce między innymi w Ubuntu). Możesz użyćcommand -v
do przenoszenia.type
na używaniecommand
. Czy inne metody również powinny zostać zaktualizowane?type
jest poprawnym, przenośnym sposobem na przetestowanie obecności polecenia, problem polega na tym, że generuje on dane wyjściowe,sha1sum is /usr/bin/sha1sum
a nie tylko nazwę programu. To było jedyne miejsce, w którym użyłem wyjścia,type
a nie tylko jego wartości zwracanej.To coś w rodzaju włamania, ale możesz sprawdzić, czy każdy istnieje, i wykonać je, jeśli:
Jestem pewien, że cygwin rozpoznaje polecenia (w tym
md5sum
) bez.exe
, ale dołącz je, jeśli musisz.źródło
which
wartości wyjściowe nie są przenośne. Użyjtype
zamiast tego (i prawdopodobnie chcesz użyć,if; then; elif
aby uniknąć problemów z wieloma plikami wykonywalnymi).which
i i taktype
szukaj tylko plików wykonywalnych, więc twój test z -x jest bezcelowy.Ponieważ używasz emacsa, możesz użyć samego emacsa do obliczenia sum kontrolnych: http://www.gnu.org/software/emacs/manual/html_node/elisp/MD5-Checksum.html .
źródło
Albo GNU autotools (jak wspomniano w komentarzu), albo CMake jest opcją.
Narzędzia automatyczne GNU są bardziej tradycyjnym podejściem, ale (i być może mówię tylko dla siebie) nie sądzę, aby ludzie byli naprawdę podekscytowani perspektywą rozpoczęcia projektu z ich wykorzystaniem. W każdym razie jest to krzywa uczenia się. CMake jest nowszym dzieckiem na bloku i być może rzadziej (i wciąż ma krzywą uczenia się). Ma własną składnię i generuje makefile na twoją platformę. CMake ma tę wyraźną zaletę, że nie jest tak nie * x-centryczny; działa niezawodnie również na systemach Unix, Windows i Mac (np. może generować projekty msvc, na przykład, zamiast plików makefile).
Edycja: i oczywiście od kiedy zaproponowano „makefile”, ta odpowiedź jest zgodna z tym domniemaniem. Ale być może po prostu skrypt Pythona lub (wstrzymujący oddech) prosty program Java byłby bardziej odpowiedni do tego zadania; język skryptowy / programistyczny zrobiłby to samo na różnych platformach.
źródło