Saya mulai menggunakan mode-org untuk merencanakan tugas-tugas saya dalam sistem gaya GTD . Menempatkan setiap file org dalam direktori folder Dropbox , saya menjalankan emacs untuk mengedit / mengelola file-file ini dari tiga mesin lokal yang berbeda: Cygwin, Mac OS X, dan Debian. Karena saya juga menggunakan MobileOrg untuk mengakses file org ini dari iPad saya, checksums.dat
file harus tetap terbaru ketika ada perubahan. Ini bisa dilakukan dengan menjalankan md5sum *.org > checksums.dat
.
Masalahnya adalah ada tiga perintah untuk perintah yang berbeda md5sum
: md5sum.exe
di Cygwin, md5
di Mac OS X, dan md5sum
di Debian. Situasi paling ideal adalah makefile, disimpan dalam foder Dropbox, mendeteksi perintah mana yang tersedia di mesin saat ini dan menjalankan perintah itu untuk melakukan operasi checksum md5.
autotools
make checksum
untuk menghasilkan data checksum di bawah folder Dropbox, saya ingin makefile menggunakan perintah yang sesuai setelah mendeteksi perintah checksum mana yang tersedia di mesin saat ini.Jawaban:
Perintah yang mungkin untuk menghasilkan checksum
Sayangnya, tidak ada utilitas standar untuk menghasilkan checksum kriptografi. Ada utilitas standar untuk menghasilkan CRC:
cksum
; ini mungkin cukup untuk tujuan Anda mendeteksi perubahan di lingkungan yang tidak bermusuhan.Saya akan merekomendasikan menggunakan SHA1 daripada MD5. Tidak banyak sistem yang memiliki utilitas MD5 tetapi tidak ada SHA1, dan jika Anda akan menggunakan checksum kriptografi, Anda mungkin juga menggunakan algoritma tanpa metode yang diketahui untuk menemukan tabrakan (dengan asumsi Anda juga memeriksa ukurannya).
Salah satu alat yang tidak standar tetapi umum dan dapat menghitung pencernaan adalah OpenSSL . Ini tersedia untuk Cygwin, Debian dan OSX, tetapi sayangnya bukan bagian dari instalasi default di OSX.
Pada OSX 10.6, ada
shasum
utilitas, yang juga ada di Debian (itu bagian dariperl
paket) dan saya percaya pada Cygwin juga. Ini adalah skrip Perl. Sebagian besar sistem unix memasang Perl, sehingga Anda dapat menggabungkan skrip tersebut bersama makefile Anda jika Anda khawatir skrip ini tidak tersedia di mana-mana.Memilih perintah yang tepat untuk sistem Anda
Oke, katakanlah Anda benar-benar tidak dapat menemukan perintah yang berfungsi di mana-mana.
Di dalam shell
Gunakan
type
built-in untuk melihat apakah perintah tersedia.GNU membuat
Anda dapat menggunakan
shell
fungsi untuk menjalankan potongan shell ketika makefile dimuat dan menyimpan output dalam suatu variabel.Portable (POSIX) buat
Anda hanya dapat menjalankan perintah shell dalam aturan, sehingga setiap aturan yang menghitung checksum harus berisi kode pencarian. Anda dapat menempatkan potongan dalam variabel. Ingatlah bahwa baris yang terpisah dalam aturan dievaluasi secara independen. Juga ingat bahwa
$
tanda - tanda yang akan diteruskan ke shell perlu diloloskan$$
.sumber
-P
opsitype
perintah untuk mendapatkan metode "GNU make" yang dijelaskan di atas untuk bekerja dengan baik, jadi saya berakhir dengansum := $(shell { type -P sha1sum || type -P sha1 || type -P shasum; } 2>/dev/null)
.type -P
hanya berfungsi jika shell Anda adalah bash, bukan jika itu misalnya ksh atau dash (yang merupakan kasus di Ubuntu antara lain). Anda dapat menggunakancommand -v
untuk portabilitas.type
ke menggunakancommand
. Haruskah metode lain diperbarui juga?type
adalah cara yang benar dan portabel untuk menguji keberadaan perintah, masalahnya adalah bahwa ia menghasilkan keluaran sepertisha1sum is /usr/bin/sha1sum
bukan hanya nama program. Ini adalah satu-satunya tempat di mana saya menggunakan outputtype
daripada hanya nilai pengembaliannya.Ini semacam retasan, tetapi Anda bisa menguji apakah masing-masing ada dan menjalankannya jika ada:
Saya cukup yakin cygwin mengenali perintah (termasuk
md5sum
) tanpa.exe
, tetapi sertakan jika Anda harus.sumber
which
nilai keluar tidak portabel. Gunakantype
sebagai gantinya (dan Anda mungkin ingin menggunakannyaif; then; elif
untuk menghindari masalah karena ada beberapa file yang dapat dieksekusi).which
dantype
hanya mencari executable, jadi pengujian Anda dengan -x tidak ada gunanya.Karena Anda menjalankan emacs, maka Anda dapat menggunakan emacs sendiri untuk menghitung checksum: http://www.gnu.org/software/emacs/manual/html_node/elisp/MD5-Checksum.html .
sumber
Entah GNU autotools (seperti yang disebutkan dalam komentar), atau juga CMake adalah sebuah pilihan.
Autotool GNU adalah pendekatan yang lebih tradisional, tetapi (dan mungkin hanya berbicara untuk diri saya sendiri) saya tidak berpikir orang-orang benar-benar terlalu bersemangat pada prospek awalnya mengatur proyek menggunakan mereka. Bagaimanapun, ini adalah kurva belajar. CMake adalah anak baru di blok, dan mungkin kurang umum (dan masih memiliki kurva belajar). Ini memiliki sintaks sendiri, dan menghasilkan makefile untuk platform Anda. CMake memang memiliki keuntungan berbeda karena tidak begitu tidak * x-sentris; ini berfungsi dengan baik pada unix, windows dan mac juga (mis., ia dapat menghasilkan proyek-proyek msvc, misalnya, daripada membuat file.)
Sunting: dan tentu saja karena 'makefiles' disarankan, jawaban ini sejalan dengan anggapan itu. Tapi mungkin hanya skrip python atau (terkesiap) program Java sederhana akan lebih sesuai untuk tugas ini; bahasa scripting / pemrograman akan melakukan hal yang sama di seluruh platform.
sumber