makepp_signatures - 클라우드에서의 온라인

이것은 Ubuntu Online, Fedora Online, Windows 온라인 에뮬레이터 또는 MAC OS 온라인 에뮬레이터와 같은 여러 무료 온라인 워크스테이션 중 하나를 사용하여 OnWorks 무료 호스팅 제공업체에서 실행할 수 있는 makepp_signatures 명령입니다.

프로그램:

이름


makepp_signatures -- 파일이 변경된 시기를 makepp이 아는 방법

기술


C: C,
c_compilation_md5, M: "MD5", P: "솔직한", S: "공유_객체", X: "xml",
xml_space

각 파일은 서명, 파일에 다음이 있는 경우 변경되는 문자열입니다.
변경되었습니다. Makepp은 서명을 비교하여 재구축이 필요한지 여부를 확인합니다. 그만큼
파일의 기본 서명은 파일 수정 시간과 해당 파일의 수정 시간을 연결한 것입니다.
C/C++ 컴파일 명령을 실행하지 않는 한, 이 경우 기본값은
서명은 주석을 무시하고 파일 내용에 대한 암호화 체크섬입니다.
공백. 원하는 경우 다른 방법으로 전환하거나 직접 정의할 수 있습니다.
서명 기능.

서명이 실제로 사용되는 방식은 빌드 검사 방법 (참조
makepp_build_check). 일반적으로 파일의 서명이 변경되면 파일 자체는 변경됩니다.
변경된 것으로 간주되어 makepp가 강제로 다시 빌드됩니다.

makepp이 파일을 작성하고 있는데 그렇게 해서는 안 된다고 생각한다면 확인하고 싶을 수도 있습니다.
빌드 로그(makepplog 참조) Makepp은 각 파일의 생각에 대한 설명을 작성합니다.
의존하고 있으며 재구축을 선택한 이유를 설명합니다.

makepp에는 여러 가지 서명 방법이 포함되어 있습니다. Makepp은 일반적으로 가장 많은 것을 선택합니다.
적절한 표준을 자동으로 수행합니다. 그러나 서명 방법을 변경할 수 있습니다.
파일에 따라 달라지는 규칙에 ":signature" 수정자를 사용하여 개별 규칙을 만듭니다.
확인하고 싶거나 "서명" 문을 사용하여 makefile의 모든 규칙을 확인하려는 경우, 또는
"-m" 또는 "--signature-method" 명령줄 옵션을 사용하여 모든 makefile을 한 번에 생성합니다.

Mpp::서명 방법 포함 in 전에, 분포
일반 (실제로는 이름이 없음)
일반 서명 방법은 파일 수정 시간과 파일 크기,
연결되었습니다. 이러한 값은 운영 체제에서 빠르게 얻을 수 있으며
파일이 변경되면 거의 항상 변경됩니다. 심볼릭 링크의 경우 다음 값을 사용합니다.
링키. 연결 대상이 없는 경우, 즉 매달려 있는 심볼릭 링크인 경우 자체적인 심볼릭 링크를 사용합니다.
값을 지정하지만 사실을 표시하기 위해 앞에 0을 붙입니다.

Makepp은 예전에는 파일이 수정된 시간만 보았지만, makepp를 실행하면
XNUMX초 내에 여러 번(예: 여러 개의 작은 파일을 작성하는 스크립트에서)
것), 때로는 수정 시간이 변경되지 않는 경우도 있습니다. 그러면 파일 크기가
바뀔 것이다.

makepp를 초당 여러 번 실행할 수 있는 경우가 문제인 경우
"md5" 방법을 사용하는 것이 다소 더 안정적이라는 것을 알 수 있습니다. makepp이 빌드하는 경우
파일의 날짜가 변경되지 않은 경우에도 캐시된 MD5 서명을 플러시합니다.

효율성을 위해 makepp는 파일을 다시 읽지 않고 복잡한 값을 다시 계산하지 않습니다.
이 일반 서명이 마지막 이후로 변경되지 않은 경우 아래 서명
그것을 계산했다. 변경이 가능하기 때문에 이론적으로 문제가 발생할 수 있습니다.
날짜와 크기를 변경하지 않고 파일 내용을 변경합니다. 실제로 이것은 꽤
하기가 어렵기 때문에 심각한 위험은 아닙니다. 앞으로는 더 많은 파일 시스템이
XNUMX초 미만의 타임스탬프를 사용하면 Perl이 이 정보에 대한 액세스를 제공할 수 있기를 바랍니다.
이 안전 장치.

C
c_compilation_md5
이는 컴파일러와 마찬가지로 C에 파일을 입력하는 방법입니다. 파일 이름이 있는지 확인합니다.
Corba IDL과 같은 것을 포함하여 C 또는 C++ 소스 코드처럼 보입니다. 그렇다면 이
방법이 적용됩니다. 그렇지 않은 경우 바이너리 파일에 대한 일반 서명으로 대체됩니다.
(이름이나 내용에 따라 결정됨) 그렇지 않으면 "md5"로 결정됩니다.

아이디어는 형식 변경과 무관하다는 것입니다. 당기는 방식으로 이루어집니다.
가능한 한 모든 것을 최대한 활용하고 중요하지 않은 공간을 제거합니다. 단어는
"__LINE__"을 포함하는 매크로일 수 있으므로 풀업에서 제외됩니다.
그들이 있던 라인에 남아 있습니다.

// 주석을 무시했습니다.

#ifdef XYZ
#포함하다
#endif

정수 = 1;

#라인 20
무효 f
(
정수 b
)
{
a += b + ++c;
}

/* 더 많은 무시된 주석 */

마치 그런 것처럼 취급된다

#ifdef XYZ
#포함하다
#endif

정수 a=1;
#라인 20
무효 f(

정수 b){

a+=b+ ++c;}

이렇게 하면 코드를 다시 정렬하거나 주석을 추가하거나 변경할 수 있습니다.
줄 번호를 변경하지 않는 한 다시 작성하십시오. (이 서명 방법은
"__LINE__" 호출이 발생하기 때문에 줄 번호가 변경된 경우 다시 컴파일합니다.
대부분의 디버깅 정보를 변경해야 합니다.) 공백과 주석도 무시합니다. 시간 내에
마지막 토큰. 이는 VC가 라인을 추가하는 경우 쓸모없는 재구축을 방지하는 데 유용합니다.
체크인 시 "$""Log$" 태그에

이 방법은 다음과 같은 상황에 특히 유용합니다.

· 일반적으로 포함된 헤더 파일의 주석을 변경하려는 경우, 또는
일부를 다시 포맷하거나 다시 들여쓰고 싶습니다. 내가 참여한 한 프로젝트의 경우
오래 전에 우리는 공통적으로 부정확한 의견을 수정하는 것을 매우 꺼려했습니다.
심각하게 오해의 소지가 있는 경우에도 헤더 파일을 사용하면
몇 시간에 걸쳐 재구축을 시작합니다. 이 서명 방법을 사용하면 더 이상
문제.

· 당신은 파일을 자주 저장하는 것을 좋아하며 편집자는 (emacs와는 달리) 행복하게 될 것입니다.
아무것도 변경되지 않았더라도 새 사본을 작성하십시오.

· 다른 빌드에 의해 자동으로 생성된 C/C++ 소스 파일이 있습니다.
명령(예: yacc 또는 기타 전처리기). 제가 사용하는 시스템 중 하나는
yacc와 같이 ".cxx"와 ".cxx"라는 두 개의 출력 파일을 생성하는 전처리기가 있습니다.
".h" 파일:

%.h %.cxx: %.qtdlg $(HLIB)/Qt/qt_dialog_generator
$(HLIB)/Qt/qt_dialog_generator $(입력)

입력 파일이 변경될 때마다 결과는 다음과 같습니다. .h 파일도 다시 작성되었으며
일반적으로 이를 포함하는 모든 항목의 재구축이 시작됩니다. 하지만,
대부분의 경우 내용은 .h 파일이 실제로 변경되지 않았습니다(예외
전처리기가 작성한 빌드 시간에 대한 설명)이므로 재컴파일은 다음과 같습니다.
실제로는 필요하지 않습니다.

실제로 실제로 이렇게 하면 원하는 것보다 재컴파일 횟수가 줄어듭니다.
주석 변경으로 인해 줄이 추가되는 경우가 많습니다. "__LINE__" 또는 디버거를 사용하여 로깅하려면
소스와 일치시키려면 재컴파일이 필요합니다. 그래서 이 서명은 특별히
당신의 코드가 있는 전문 프로그래밍의 "tangle" 도구 제품군에는 쓸모가 없습니다.
더 큰 파일에 상주하며 심지어 관련 없는 문서 섹션의 변경 사항도 있습니다.
코드는 "#line" 지시어를 통해 추출된 소스에 반영됩니다.

개발 중에 잘못된 줄 번호로 살 수 있다면 변수를 설정할 수 있습니다
"makepp_signature_C_plat"(대문자 C 사용)을 실제 값(예: 1)으로 바꿉니다. 그 다음에,
컴파일러는 여전히 실제 파일을 보는 반면, 위의 예는 다음과 같이 평면화됩니다.
다음으로 서명:

#ifdef XYZ
#포함하다
#endif
int a=1;void f(int b){a+=b+ ++c;}

서명은 파일이 변경될 때만 다시 계산됩니다. 그래서 당신은 다음을 위해 구축할 수 있습니다
이 옵션이 없는 저장소의 모든 사람과 옵션을 원하는 사람은 이를 설정할 수 있습니다.
샌드박스에 구축할 때. 처음 로컬에서 파일을 변경할 때,
사소한 일이지만, 이 옵션을 사용하면 완전히 재컴파일이 발생하기 때문입니다.
다른 서명이 계산됩니다. 하지만 그런 다음 파일을 최대한 다시 형식화할 수 있습니다.
그들은 더 이상 재컴파일하지 않고 원합니다.

반대의 경우도 마찬가지입니다. 이 옵션을 설정한 후 생략하고 다시 컴파일하면 됩니다.
줄 번호는 수정되지 않습니다. 따라서 라인 번호가 중요하다면 제작을 하지 마세요.
먼저 청소하지 않고 동일한 샌드박스에 빌드합니다.

md5 이것은 "C" 방법으로 인식되지 않는 파일에 대한 기본 방법입니다. 계산합니다
파일의 날짜나 크기를 확인하는 대신 파일 내용의 MD5 체크섬입니다.
이는 파일의 날짜를 변경했지만 내용은 변경하지 않은 경우,
makepp는 이에 의존하는 어떤 것도 재구축하려고 시도하지 않습니다.

이는 작업 중에 자주 재생성되는 파일이 있는 경우 특히 유용합니다.
다른 파일이 의존하지만 일반적으로 실제로는 그렇지 않은 빌드 프로세스
변화. "md5" 서명 확인 방법을 사용하면 makepp는
파일 날짜가 변경되더라도 파일 내용은 변경되지 않습니다. (물론 이
아카이브 파일처럼 파일 내부에 타임스탬프가 기록되어 있으면 도움이 되지 않습니다.
예를 들어.)

공유_객체
이 방법은 경로에 "nm" 유틸리티가 있고 다음을 허용하는 경우에만 작동합니다.
Posix 형식을 출력하는 "-P" 옵션입니다. 이 경우 기호의 이름과 유형만
동적으로 로드된 라이브러리에서는 서명의 일부가 됩니다. 결과는
사용하는 프로그램을 다시 연결하지 않고도 기능 코딩을 변경할 수 있습니다.
그들.

다음 명령에서 파서는 다음에 대한 암시적 종속성을 감지합니다.
$(LIBDIR)/libmylib.so, 필요한 경우 빌드합니다. 그러나 link 명령은
라이브러리가 다른 기호 세트를 내보낼 때마다 다시 수행됩니다.

myprog: $(OBJECTS) :서명 shared_object
$(LD) -L$(LIBDIR) -lmylib $(입력) -o $(출력)

이는 함수의 인터페이스가 변경되지 않는 한 작동합니다. 하지만 그런 경우에는
선언을 변경하면 호출자도 변경해야 합니다.

이 방법은 이름이 공유 라이브러리처럼 보이는 파일에만 적용됩니다.
다른 모든 파일의 경우 "c_compilation_md5"로 대체되며, 이는 다시 대체될 수 있습니다.
다른 사람에게.

XML
xml_space
이는 xml을 정식으로 처리하고 그 내용만 다른 두 가지 유사한 방법입니다.
공백 처리. 첫 번째는 태그 주변을 완전히 무시하고 고려합니다.
다른 곳의 단일 공백처럼 서명이 서식 변경에 영향을 받지 않도록 합니다. 그만큼
두 번째는 XML의 공백을 존중합니다. 이는 작은 공백이라도 필요합니다.
부분에서는 " " xhtml 문서의 섹션.

두 방법의 공통점은 각 XML 문서의 본질에 서명한다는 것입니다. 있음
또는 BOM이 아니거나 " " 헤더는 무시됩니다. 주석은 무시됩니다.
텍스트는 "CDATA" 또는 엔터티로 보호됩니다. 속성의 순서 및 인용 스타일
중요하지 않으며 빈 태그를 렌더링하는 방법도 마찬가지입니다.

유효한 xml이 아닌 파일의 경우 또는 Expat 기반 "XML::Parser" 또는
"XML::LibXML" 구문 분석기가 설치되지 않았습니다. 이는 md5 메서드로 대체됩니다. 전환하면
파서 중 하나에서 다른 파서로 Perl을 설치하면 makepp는 다음과 같이 생각할 것입니다.
타임스탬프가 변경되자마자 파일은 달라집니다. 이는 의 결과 때문이다.
두 파서는 논리적으로 동일하지만 서로 다른 서명을 생성합니다. 에서
이것이 문제가 될 가능성은 거의 없지만 "XML::LibXML"만 강제로 사용할 수 있습니다.
Perl에서 설정:

$Mpp::Signature::xml::libxml = 1;

확장 적용 가능성
"C" 또는 "c_compilation_md5" 메소드에는 다음과 같이 인식되는 접미사 목록이 내장되어 있습니다.
C 또는 C와 유사합니다. 다른 파일에 적용되면 더 간단한 서명으로 대체됩니다.
행동 양식. 그러나 많은 파일 형식은 이 방법이 가능하도록 구문적으로 C++와 유사합니다.
유용한. 충분히 가깝다는 것은 C++ 주석과 문자열 구문 및 공백이 의미가 없음을 의미합니다.
단어 사이에 하나의 공백을 제외하고(그리고 C++의 문제 사례인 "- -", "+ +", "/ *" 및 "< <").

이제 이 클래스(및 하위 클래스)를 다른 접미사로 쉽게 확장할 수 있습니다. 당신이 할 수 있는 어느 곳에서나
이제 이러한 구문 중 하나에 추가하여 메소드를 만들 수 있는 서명을 지정하십시오.
추가 파일 이름을 허용합니다:

C.접미사1,접미사2,접미사3
하나 이상의 쉼표로 구분된 접미사를 콜론으로 메서드에 추가할 수 있습니다. 을 위한
예를 들어 "C.ipp,tpp"는 내장된 접미사 외에 다음에도 적용된다는 의미입니다.
다음으로 끝나는 파일 .ipp or .tpp, 인라인 및 템플릿에 사용할 수 있습니다.
C++ 헤더의 일부입니다.

씨.(접미사 정규식)
이것은 이전과 같지만 접미사를 열거하는 대신 Perl을 제공합니다.
원하는 것과 일치하는 정규 표현식입니다. 이전 예는 다음과 같습니다.
이 구문에서는 "C.(ipp|tpp)" 또는 "C.([it]pp)"입니다.

C(정규 표현식)
점이 없으면 Perl 정규식은 파일 이름의 어느 위치에서나 일치할 수 있습니다. 그 경우
슬래시가 포함되어 있으면 정규화된 파일 이름에 대해 시도됩니다. 그렇지 않으면
디렉토리 없이 마지막 부분에 대해서만. 따라서 C++ 스타일이 있다면
디렉토리의 접미사 없는 헤더 , 서명 방법으로 "C(include/)"를 사용하십시오.
그러나 위의 접미사 예는 "C(\.(?:ipp|tpp)$$)"와 같이 매우 불쾌합니다.
또는 "C(\.[it]pp$$)" 왜냐하면 "$"는 makefile의 확장 문자이기 때문입니다.

단점
서명 방법은 규칙의 모든 파일에 적용됩니다. 이제 C를 사용하는 컴파일러가 있다면
소스 코드 및 XML 구성 파일과 같이 결합된 서명이 필요합니다.
두 가지 파일 형식을 모두 현명하게 처리하는 방법을 선택하거나 기존 방법을 선택해야 합니다.
다른 파일의 변경 사항이 중요한지 여부를 알 수 없습니다.

향후 서명 방법 구성은 파일 이름 패턴으로 변경될 수 있습니다.
선택적으로 명령에 따라.

관습 방법
원하는 경우 파일 서명 계산을 위한 고유한 방법을 정의하고
그들을 비교합니다. 이를 수행하려면 Perl 모듈을 작성해야 합니다. 다음을 살펴보세요.
배포판의 "Mpp/Signature.pm" 및 기존 서명에 있는 주석
자세한 내용은 "Mpp/Signature/*.pm"의 알고리즘을 참조하세요.

사용자 정의 서명 방법이 필요한 경우는 다음과 같습니다.

· 파일의 모든 변경 사항을 무시하려는 경우. 항상 원한다고 말해 dateStamp.o
종속성이 있어야 하지만(재구축을 강제하기 위해), 다음과 같은 경우에만 재구축을 원하지 않는 경우
dateStamp.o 변경되었습니다. 다음에서 상속하는 서명 메서드를 정의할 수 있습니다.
"c_compilation_md5"는 다음을 인식합니다. dateStamp.o 이름으로 파일을 저장하고 항상
해당 파일에 대한 상수 값을 반환합니다.

· 파일의 일부를 무시하고 싶을 때. 다음과 같은 프로그램이 있다고 가정해 보겠습니다.
날짜 스탬프가 있는 파일을 생성하지만 다음과 같은 경우에만 다시 컴파일하고 싶지 않습니다.
날짜 스탬프가 변경되었습니다. 다음과 유사한 서명 방법을 정의하십시오.
파일 형식을 이해하고 이해하지 못하는 부분을 건너뛰는 "c_compilation_md5"
고려하고 싶습니다.

onworks.net 서비스를 사용하여 온라인으로 makepp_signatures 사용



최신 Linux 및 Windows 온라인 프로그램