makefile은 로컬 컴퓨터에서 명령을 사용할 수 있는지 어떻게 감지합니까?

makefile은 로컬 컴퓨터에서 명령을 사용할 수 있는지 어떻게 감지합니까?

나는 사용하기 시작했다조직 모델내 작업 계획하기GTD스타일 시스템. 각 조직 파일을 다음 디렉터리에 배치합니다.드롭 박스폴더에서 저는 Cygwin, Mac OS X, Debian이라는 세 가지 다른 로컬 컴퓨터에서 이 파일을 편집/관리하기 위해 emacs를 실행하고 있습니다. 나도 사용하니까모바일 조직내 iPad에서 이러한 조직 파일에 액세스하려면 checksums.dat파일이 변경 사항에 따라 최신 상태로 유지되어야 합니다. 이는 를 실행하여 수행할 수 있습니다 md5sum *.org > checksums.dat.

문제는 거기에 있다명령에 대한 다른 명령 md5sum: md5sum.exeCygwin, md5Mac OS X 및 md5sumDebian에서. 이상적인 상황은 현재 컴퓨터에서 사용 가능한 명령을 감지하고 해당 명령을 실행하여 md5 체크섬 작업을 수행하는 Dropbox 폴더에 저장된 makefile입니다.

답변1

체크섬을 생성하는 데 가능한 명령

불행하게도 암호화 체크섬을 생성하는 표준 유틸리티는 없습니다. CRC 생성을 위한 표준 유틸리티가 있습니다:cksum;이는 적대적이지 않은 환경에서 변경 사항을 감지하는 데 충분할 수 있습니다.

MD5 대신 SHA1을 사용하는 것이 좋습니다. MD5 유틸리티는 있지만 SHA1은 없는 시스템이 많지 않습니다. 암호화 체크섬을 사용하려는 경우 충돌을 찾는 알려진 방법이 없는 알고리즘을 사용하는 것이 좋습니다(크기도 확인한다고 가정).

비표준이지만 요약을 계산할 수 있는 일반적인 도구는 다음과 같습니다.OpenSSL. Cygwin, Debian 및 OSX에서 작동하지만 불행히도 OSX의 기본 설치에는 포함되어 있지 않습니다.

openssl dgst -sha1

OSX 10.6에는shasum이 유틸리티는 Debian(패키지의 일부 perl)에도 존재하며 Cygwin에도 존재한다고 생각합니다. 이것은 Perl 스크립트입니다. 대부분의 Unix 시스템에는 Perl이 설치되어 있으므로 이 스크립트를 모든 곳에서 사용할 수 없는 것이 걱정된다면 makefile과 함께 번들로 묶을 수 있습니다.

시스템에 적합한 명령을 선택하십시오

글쎄, 실제로 모든 곳에서 작동하는 명령을 찾을 수 없다고 가정해 보겠습니다.

껍질에

내장된 명령을 사용하여 type해당 명령이 사용 가능한지 확인하십시오.

sum=
for x in sha1sum sha1 shasum 'openssl dgst -sha1'; do
  if type "${x%% *}" >/dev/null 2>/dev/null; then sum=$x; break; fi
done
if [ -z "$sum" ]; then echo 1>&2 "Unable to find a SHA1 utility"; exit 2; fi
$sum *.org

GNU가 만든다

당신은 그것을 사용할 수 있습니다shell기능makefile이 로드될 때 셸 조각을 실행하고 출력을 변수에 저장합니다.

sum := $(shell { command -v sha1sum || command -v sha1 || command -v shasum; } 2>/dev/null)
%.sum: %
        $(sum) $< >$@

포터블(POSIX) 브랜드

규칙 내에서만 셸 명령을 실행할 수 있으므로 체크섬을 계산하는 각 규칙에는 조회 코드가 포함되어야 합니다. 코드 조각을 변수에 넣을 수 있습니다. 규칙의 개별 줄은 독립적으로 평가된다는 점을 기억하세요. 또한 $쉘에 전달되는 기호는 이스케이프되어야 한다는 점을 기억하십시오 $$.

determine_sum = \
        sum=; \
        for x in sha1sum sha1 shasum 'openssl dgst -sha1'; do \
          if type "$${x%% *}" >/dev/null 2>/dev/null; then sum=$$x; break; fi; \
        done; \
        if [ -z "$$sum" ]; then echo 1>&2 "Unable to find a SHA1 utility"; exit 2; fi

checksums.dat: FORCE
    $(determine_sum); \
    $$sum *.org

답변2

약간의 해킹이지만 각각이 존재하는지 테스트하고 존재하는 경우 실행할 수 있습니다.

[ -x "`which md5 2>/dev/null`" ] && md5 newfile >>sums
[ -x "`which md5sum 2>/dev/null`" ] && md5sum newfile >>sums

md5sum나는 cygwin이 (include) 없이 명령을 인식한다고 확신 .exe하지만 필요한 경우 포함될 수 있습니다.

답변3

누구나 GNU 자동 도구(댓글에서 언급했듯이) 또는CMake옵션입니다.

GNU autotools는 보다 전통적인 접근 방식이지만 (아마도 내 생각으로는) 초기 프로젝트 구축에 GNU autotools를 사용할 가능성에 대해 사람들이 그다지 흥분하지 않는 것 같습니다. 어쨌든, 그것은 학습 곡선입니다. CMake는 더 새롭고 아마도 덜 일반적일 것입니다(그리고 여전히 학습 곡선이 있습니다). 자체 구문이 있으며 플랫폼에 맞는 makefile을 생성합니다. CMake는 x 중심이 덜하다는 뚜렷한 장점이 있습니다. Unix, Windows 및 Mac에서도 안정적으로 작동합니다. 예를 들어 makefile 대신 msvc 프로젝트를 생성할 수 있습니다.

편집: 물론 "makefiles"가 제안되었으므로 이 답변은 해당 가정에 맞습니다. 그러나 아마도 Python 스크립트나 간단한 Java 프로그램이 작업에 더 적합할 수 있습니다. 스크립트/프로그래밍 언어는 플랫폼 전반에서 동일한 작업을 수행합니다.

답변4

emacs를 실행 중이므로 emacs 자체를 사용하여 체크섬을 계산할 수 있습니다.http://www.gnu.org/software/emacs/manual/html_node/elisp/MD5-Checksum.html.

관련 정보