makefile이 로컬 머신에서 명령을 사용할 수 있는지 여부를 어떻게 감지 할 수 있습니까?


11

GTD 스타일 시스템 에서 작업을 계획 하기 위해 org-mode 를 사용하기 시작했습니다 . 모든 조직 파일을 Dropbox 폴더 의 디렉토리에 넣고 emacs를 실행하여 Cygwin, Mac OS X 및 Debian의 세 가지 로컬 시스템에서이 파일을 편집 / 관리합니다. 또한 MobileOrg 를 사용 하여 iPad에서 이러한 조직 파일에 액세스 할 때 파일이 변경 될 때 파일을 최신 상태로 유지해야합니다. 이를 실행하여 수행 할 수 있습니다 .checksums.datmd5sum *.org > checksums.dat

문제가 있다는 것입니다 가지에 대한 명령 md5sum: 명령 md5sum.exe의 Cygwin에서, md5맥 OS X, 그리고 md5sum데비안에서가. 가장 이상적인 상황은 Dropbox Foder에 저장된 makefile이며 현재 시스템에서 사용할 수있는 명령을 감지하고 해당 명령을 실행하여 md5 체크섬 작업을 수행합니다.



1
@Kevin 과잉 인 것 같습니다. 세 개의 다른 시스템에 프로그램을 설치하고 싶지 않습니다. 각 시스템에서 Dropbox 폴더는 로컬 디렉토리로 액세스 할 수 있습니다. make checksumDropbox 폴더에서 체크섬 데이터를 생성하기 위해 실행할 때 현재 컴퓨터에서 사용할 수있는 체크섬 명령을 감지 한 후 makefile이 적절한 명령을 사용하기를 원합니다.
Federico Magallanez 2012 년

상당한 양의 스크립팅을하려고하는데 프로젝트가 작다면 스콘을 제안합니다.
Faheem Mitha

답변:


7

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

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

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

표준은 아니지만 일반적이며 다이제스트를 계산할 수있는 도구 중 하나는 OpenSSL 입니다. Cygwin, Debian 및 OSX에서 사용할 수 있지만 불행히도 OSX에서 기본 설치의 일부는 아닙니다.

openssl dgst -sha1

OSX 10.6에는 shasumDebian ( perl패키지 의 일부)에도 있는 유틸리티가 있으며 Cygwin도 믿습니다. 이것은 Perl 스크립트입니다. 대부분의 유닉스 시스템에는 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 메이크

makefile이로드 될 때 shell함수 를 사용하여 쉘 스 니펫을 실행하고 출력을 변수에 저장할 수 있습니다.

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

위에서 설명한 "GNU make"메소드가 제대로 작동하려면 명령 -P옵션 을 사용해야 type했기 때문에로 끝났습니다 sum := $(shell { type -P sha1sum || type -P sha1 || type -P shasum; } 2>/dev/null).
Sean

@Sean 버그 보고서에 감사드립니다. type -P쉘이 bash 인 경우에만 작동합니다 (예 : ksh 또는 dash (우분투의 경우)). command -v휴대 성을 위해 사용할 수 있습니다 .
Gilles 'SO- 악마 그만'

사용에서 사용 type으로 전환 한 것 같습니다 command. 다른 방법도 업데이트해야합니까?
Sean

@Sean 다른 방법은 훌륭합니다. type명령의 존재를 테스트하는 정확하고 이식 가능한 방법입니다. 문제 sha1sum is /usr/bin/sha1sum는 프로그램 이름이 아닌 출력을 생성 한다는 것입니다. 이것은 type반환 값 이 아닌 출력을 사용한 유일한 장소였습니다 .
Gilles 'SO- 악마 그만'

5

그것은 해킹의 일이지만, 각각 존재하는지 테스트하고 그들이 있다면 실행할 수 있습니다.

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

cygwin은을 포함 md5sum하지 않고 명령 (을 포함하여 )을 인식 .exe하지만 필요한 경우 포함시켜야합니다.


4
which종료 값은 이식 가능하지 않습니다. type대신 사용하십시오 ( if; then; elif여러 개의 실행 파일이있는 데 문제가 없도록 사용하려고합니다 ). whichtype-x와 테스트가 무의미하므로 만, 어쨌든 실행 파일을 찾습니다.
Chris Down

"type"사용에 대한 자세한 내용 : cmd = $ (foo md5 md5sum bar의 cmd의 경우 $ cmd> / dev / null 2> & 1 && echo $ cmd && break; done); $ cmd file1 file2 file3> md5.txt
michael


1

어느 GNU의 autotools를 (코멘트에서 언급 한 바와 같이) 또는도 CMake는 옵션입니다.

GNU autotools는보다 전통적인 접근 방식이지만 (그리고 아마도 나 자신만을 위해 말하면) 사람들이 처음에 그것들을 사용하여 프로젝트를 설정할 것이라는 기대에 너무 흥분하지 않는다고 생각합니다. 어쨌든 그것은 학습 곡선입니다. CMake는 블록의 새로운 아이이며, 덜 일반적입니다 (그리고 여전히 학습 곡선이 있습니다). 자체 구문이 있으며 플랫폼에 대한 makefile을 생성합니다. CMake는 그렇게 xx 중심적이지 않다는 뚜렷한 이점이 있습니다. 그것은 유닉스, 윈도우 및 맥에서도 안정적으로 작동합니다 (예를 들어, makefile 대신에 msvc 프로젝트를 생성 할 수 있습니다).

편집 : 물론 'makefiles'가 제안 된 이후이 대답은 그 가정과 함께 진행됩니다. 그러나 아마도 파이썬 스크립트 또는 간단한 Java 프로그램이이 작업에 더 적합 할 것입니다. 스크립팅 / 프로그래밍 언어는 여러 플랫폼에서 동일하게 수행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.