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

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

프로그램:

이름


makepp_extending -- Perl을 사용하여 makepp를 확장하는 방법

기술


Makepp은 내부적으로 충분히 유연하므로 약간의 Perl 코드를 작성하면 다음을 수행할 수 있습니다.
기능을 추가하거나 기타 여러 작업을 수행합니다.

일반 노트 on 쓰기 암호 메이크업
각 메이크파일은 자체 패키지에 있습니다. 따라서 하나의 makefile에 있는 정의는 영향을 미치지 않습니다.
다른 makefile의 정의. 모든 표준을 포함한 공통 기능 세트
텍스트 조작 기능은 패키지가 생성될 때 패키지로 가져옵니다.

Makefile 변수는 해당 패키지에 Perl 스칼라로 저장됩니다. (예외가 있습니다.
이것: 자동 변수와 CC와 같은 변수의 기본값은 실제로
인수가 없는 함수로 구현되었습니다. 대상 특정 변수, 명령줄 변수 및
환경 변수는 이런 식으로 표시되지 않습니다.) 따라서 여러분이 작성하는 모든 Perl 코드는 모든 변수에 액세스할 수 있습니다.
메이크파일 변수. 전역 변수는 "Mpp::global" 패키지에 저장됩니다. 보다
자세한 내용은 Makefile 변수입니다.

각 명령문(ifperl / ifmakeperl, perl / makeperl, sub / makesub)은
함수(perl/makeperl, map/makemap) 및 규칙 작업(perl/makeperl)
Makefile에 Perl 코드를 직접 작성하는 방법에는 두 가지가 있습니다. 첫 번째는 절대적으로
일반적인 Perl에서는 다음 섹션에 설명된 대로 "f_" 접두사를 사용해야 함을 의미합니다.
makepp 함수를 호출하고 싶습니다. 두 번째 변형은 먼저 명령문을 다음을 통해 전달합니다.
Make 스타일 변수 확장은 Perl이 보길 원하는 "$"를 두 배로 늘려야 함을 의미합니다.

makepp의 거대한(빌드 시스템에 따라) 데이터가 많기 때문에 최종 처리가 특별합니다.
구조는 정상적인 종료로 가비지 수집에 몇 초가 걸립니다. 그래서 우리는
무차별 출구. 기본 프로세스에는 여전히 "END" 블록이 있을 수 있지만,
전역 파일 핸들은 플러시되지 않을 수 있습니다. 하지만 현대 어휘를 사용해야 합니다.
범위를 벗어날 때 제대로 닫히는 파일 핸들.

Perl 코드에서는 규칙 작업으로 직접 실행되거나 정의한 명령을 통해 실행됩니다.
반대. "END" 블록은 실행되지 않지만 전역 파일 핸들은 플러시됩니다. 그만큼
전역 개체의 "DESTROY"는 실행되지 않습니다.

첨가 텍스트 기능
간단히 다음과 같은 Perl 서브루틴을 정의하여 makepp의 레퍼토리에 새 기능을 추가할 수 있습니다.
이름은 같지만 접두사 "f_"가 붙습니다. 예를 들어:

하위 f_myfunc {
내 $argument = &arg; # 인수의 이름을 지정합니다.
my( undef, $mkfile, $mkfile_line ) = @_; # 인수의 이름을 지정합니다.

... 여기서 뭔가 해보세요

$return_value를 반환합니다.
}

XYZ := $(myfunc 내 func 인수)

함수에 인수가 없으면 아무 작업도 수행할 수 없습니다. 귀하의 기능이 하나를 취하는 경우
인수를 얻으려면 위의 예에서와 같이 간단한 접근자 &arg를 사용하십시오. 만약 너라면
더 많은 인수가 필요하면 아래에 설명된 더 복잡한 접근자 "args"가 필요합니다.

이러한 접근자는 "f_"에 전달되어야 하는 동일한 세 가지 매개변수를 처리합니다.
함수, 즉 함수 인수, makefile 객체 및 라인 설명자
메시지. 따라서 첫 번째 경우에는 효율적인 &arg 형식을 사용할 수 있습니다.

&arg 접근자는 다음을 처리합니다. 인수가 이미 있는 경우
확장됨(예: "$(my$(function) arg)"에서 함수 이름을 찾으려면 인수는 다음과 같습니다.
문자열로 전달되어 방금 반환되었습니다. 만약 논증이 여전히 확장이 필요하다면, 이것은
일반적인 경우에는 대신 문자열에 대한 참조입니다. &arg 접근자는 이를 확장합니다.
두 번째 매개변수로 makefile 객체가 필요합니다.

변수 번호로 더 많은 인수가 필요한 경우 작업은 "args"에 의해 수행됩니다.
이 접근자는 arg와 동일한 3개의 매개변수와 추가 매개변수를 사용합니다.

max: 인수 수(기본값 2): 무한의 경우 ~0(maxint) 제공
min: 인수 수(max가 ~0이면 기본값은 0이고, 그렇지 않으면 max와 동일)
only_comma: 파일 이름이 아닌 경우 일반적으로 쉼표 주위에 공간을 차지하지 마십시오.

확장 전에 존재하는 최대 최대, 최소 최소 쉼표를 사용하여 분할합니다.
인수. makepp 내장 함수의 몇 가지 예:

my( $prefix, $text ) = args $_[0], $_[1], $_[2], 2, 2, 1; # 접두사 추가
for my $cond ( args $_[0], undef, $_[2], ~0 ) ... # 그리고, 또는
내 @args= args $_[0], $_[1], $_[2], ~0, 1, 1; # 부르다
my( $filters, $words ) = args $_[0], $_[1], $_[2]; # 필터

함수는 스칼라 문자열(배열이 아님)을 반환해야 하며, 이 문자열은
그 시점에 문자를 보내세요.

함수에 오류가 발생하면 일반적인 Perl die 문을 사용하여 함수가 종료되어야 합니다.
이것은 makepp에 의해 트랩되며 파일 이름과 행을 표시하는 오류 메시지가 표시됩니다.
오류를 일으킨 표현식의 번호가 인쇄됩니다.

함수가 수행할 수 있는 작업에는 기본적으로 제한이 없습니다. 파일에 액세스하고 실행할 수 있습니다
쉘 명령 등

현재 종속성 및 규칙 작업에 나타나는 표현이 확장됩니다.
대상에 나타나는 표현식은 두 번 확장되므로 주의하세요.
함수에는 부작용이 있으며 대상에 대한 표현식에 존재합니다.

함수가 평가하는 환경(특히 cwd)은
Makefile의 규칙이 적용되는 환경과 반드시 ​​일치할 필요는 없습니다.
평가된 함수가 실행됩니다. 이것이 당신에게 문제가 된다면, 당신의 기능은
아마도 다음과 같이 보일 것입니다 :

하위 f_foo {
...
chdir $makefile->{CWD};

... 등
}

입고 기능 으로 a 모듈
포함 파일에 함수를 넣으면 Makeppfile당 하나의 복사본을 갖게 됩니다.
그것을 사용합니다. 이를 방지하려면 "Exporter"를 사용하여 일반 Perl 모듈로 작성할 수 있습니다.
인터페이스를 선택하고 이를 사용하세요. 이렇게 하면 로드 속도가 빨라지고 메모리가 절약됩니다.

Perl { mymodule 사용 }
펄 {
my::모듈을 사용하세요. # put : 규칙으로 해석되지 않도록 새 줄에 넣습니다.
}

Makefile에서 일반적으로 사용할 수 있는 함수(예: "f_")가 필요한 경우
함수, "arg" 또는 "args"), 다음 줄을 모듈에 넣어야 합니다.

Mpp::Subs를 사용하세요.

단점은 모듈이 함수와 직접적으로 다른 패키지에 있다는 것입니다.
makefile에 나타납니다. 따라서 모든 것을 매개변수로 전달하거나 구성해야 합니다.
Perl의 "호출자" 기능을 사용하여 이름을 지정합니다.

호출 외부 스크립트
"시스템"을 통해 또는 규칙 작업으로 외부 Perl 스크립트를 호출하면 makepp는
새로운 프로세스(마지막 규칙 작업이 아닌 한)를 만들고 새로운 Perl 해석기를 실행합니다.
더 효율적인 방법이 있다는 점을 제외하면 아무런 문제가 없습니다.

&명령 인수...
이는 규칙 조치일 수 있습니다. 함수를 호출합니다 명령 "c_" 접두어가 있고,
나머지(선택적으로 makepp 스타일로 인용됨 - 정확히 동일하지는 않음)를 전달합니다.
Shell) 인수. 그러한 함수를 찾을 수 없으면 모든 문자열을 다음으로 전달합니다.
"달리다".

하위 c_mycmd { 내 @args = @_; ... }

$(가짜 전화 cmd):
&mycmd '공백이 있는 인수' arg2 "arg3" # c_mycmd를 호출합니다.

%.아웃: %.in
&myscript -o $(output) $(input) # 외부 myscript 호출

내장 프레임워크 내에서 명령을 작성하여 다음을 사용할 수 있습니다.
기존과 동일한 표준 옵션과 I/O 처리 기능을 제공합니다.

블록 연산자 "Mpp::Cmds::frame" 뒤에는 다음과 같은 단일 문자 옵션 목록이 옵니다.
내장(최대 "qw(fi I ​​o O rs)"). 옵션을 직접 지정하더라도
이들 중 하나를 무시해도 여전히 표준 옵션의 단일 문자가 제공됩니다.

각각의 고유 옵션은 "[qw(n 이름), \$ref, 인수, 보결]". 처음 두
요소는 짧은 이름과 긴 이름이며 그 뒤에 변수 참조가 오고 선택적으로
인수를 취할지 여부에 대한 부울입니다. 인수가 없으면 변수는 다음과 같습니다.
옵션이 제공될 때마다 증가하고, 그렇지 않으면 옵션 값이 저장됩니다.

sub c_my_ocmd { # 일반적인 출력 사례
로컬 @ARGV = @_;
Mpp::Cmds::프레임 {

... 옵션이 이미 자동으로 제거된 상태에서 @ARGV를 사용하여 여기에 무언가를 인쇄합니다.

} 'f', qw(o O);
}

sub c_my_icmd { # 2가지 옵션이 있는 일반적인 입력 사례
로컬 @ARGV = @_;
내( $짧은, $긴 );
Mpp::Cmds::프레임 {

... 여기서 <>로 뭔가를 해보세요

} qw(i I rs), # s는 -s가 아닌 --separator만 지정합니다.
[qw(s short), \$short], # 옵션 인수 없음 -> $short == 1
[qw(l long), \$long, 1, sub { 경고 "인수 $long이 있음"}];
}

다음은 각 입력의 첫 번째 문자만 대문자로 바꾸는 간단한 명령입니다.
레코드("&sed '$$_ = "\u\L$$_"'"와 동일):

하위 c_uc {
로컬 @ARGV = @_;
Mpp::Cmds::프레임 {
<> 동안 "\u\L$_"을 인쇄합니다;
} 'f', qw(i I o O rs);
}

프레임별로 처리되는 블록 내에서는 중요한 작업을 수행하기 위해 중첩된 블록을 가질 수 있습니다.
다른 파일을 여는 것과 같은 작업.

Mpp::Cmds::perform { ... } '메시지';

이는 "--verbose"(모든 명령이 허용하는) 메시지를 출력합니다.
명령이 성공적으로 실행되었습니다. 그러나 블록이 거짓으로 평가되면 블록은 다음과 같이 죽습니다.
부정된 메시지.

운영 스크립트 인수...
이것은 makefile 내의 Perl 컨텍스트에서 사용할 수 있는 일반적인 Perl 함수입니다.
다중 인수 형식의 시스템과 유사하지만 내부에서 Perl 스크립트를 실행합니다.
현재 프로세스. makepp 문의 경우 perl 함수 또는 사용자 고유 함수
이것이 makepp를 실행하는 프로세스입니다. 그러나 하위 프로세스를 수행하는 규칙의 경우
그것. 스크립트는 호출될 때마다 구문 분석되지만 실제 내용을 넣을 수 있습니다.
pod2html처럼 lib로 작업하세요. 그러면 이 lib는 최상위 수준에서 사용될 수 있으므로
이미 존재한다는 것입니다.

perl { use mylib } # 재분석할 필요가 없는 모든 규칙으로 분기됩니다.

%.아웃: %.in
makeperl { qw'myscript -o $(출력) $(입력)' 실행 }

스크립트가 "exit"를 호출하면 표준 파일 설명자를 닫거나 시스템에 의존합니다.
그 후에 정리하려면(열린 파일, 메모리...) "실행"에 문제가 될 수 있습니다. 만약에
명령문이나 Perl 함수 내에서 "run"을 호출하면 makepp이 방해를 받거나
정리는 makepp이 끝날 때만 발생합니다.

앞서 언급한 문제가 있는 경우 외부에서 스크립트를 실행하십시오.
대신 명령줄을 사용하세요. 규칙 내 정리는 문제가 되지 않습니다. 특히 그렇지 않습니다.
규칙의 마지막 작업으로 규칙 하위 프로세스는 어쨌든 나중에 종료되므로
Windows를 제외하고.

쓰기 your 자신의 서명 방법
때로는 makepp가 다른 기술을 사용하여 서명 방법을 계산하기를 원할 수도 있습니다. 을 위한
예를 들어 공유 라이브러리에 의존하는 바이너리가 있다고 가정해 보겠습니다. 일반적으로 당신이
공유 라이브러리를 변경하면 이에 의존하는 실행 파일을 다시 링크할 필요가 없습니다.
연결은 런타임에 수행됩니다. (그러나 실행 파일을 다시 링크하는 것은 가능합니다.
필요할 수도 있으므로 이것을 기본값으로 설정하지 않았습니다.) 원하는 것 makepp
해야 할 일은 공유 라이브러리가 변경되더라도 동일한 서명을 갖는 것입니다.

이는 여러 가지 방법으로 수행할 수 있습니다. 가장 쉬운 방법은 자신만의 새로운 것을 만드는 것입니다.
서명 방법("shared_object"라고 부르겠습니다). 이 서명 방법을 사용합니다
다음과 같이 바이너리를 연결하는 규칙에만 적용됩니다.

myprogram : *.o lib1/lib1.so lib2/lib2.so
: 서명 shared_object
$(CC) $(입력) -o $(출력)

이제 서명 방법을 만들어야 합니다.

모든 서명 메서드는 자체 클래스여야 하며 클래스에는 몇 가지 특수 메서드가 포함되어야 합니다.
항목(자세한 내용은 배포판의 Mpp/Signature.pm 참조). 수업 이름은 다음과 같아야 합니다.
"Mpp::Signature::" 접두사가 붙어 있으므로 이 경우 클래스를 호출해야 합니다.
"Mpp::서명::shared_object". 우리는 shared_object.pm 넣어
그것은 Mpp::서명 Perl 포함 경로 어딘가에 있는 디렉토리; 가장 쉬운 곳
에있을 수도 있습니다 Mpp/서명 makepp 설치 디렉토리(예:
/usr/local/share/makepp/Mpp/서명 또는 어디에 설치했든).

이 수업에서 다루어야 할 내용에 대한 정확한 세부 사항을 보려면 다음을 주의 깊게 살펴보아야 합니다.
파일 Mpp/서명.pm 그리고 아마도 또한 Mpp/서명/exact_match.pm makepp에서
분포. 하지만 우리의 경우 우리가 원하는 것은
기존 서명 메커니즘; 파일이 공유 라이브러리인 경우 상수를 갖고 싶습니다.
서명, 반면에 파일이 다른 것이라면 우리는 makepp의 일반 서명에 의존하고 싶습니다.
서명 메커니즘. 이를 수행하는 가장 좋은 방법은 다음에서 상속하는 것입니다.
일반적으로 선택되는 서명 방법인 "Mpp::Signature::c_compilation_md5"
makepp이 링크 명령을 인식할 때.

그래서 파일 Mpp/서명/shared_object.pm 다음이 포함될 수 있습니다.

엄격한 사용;
패키지 Mpp::Signature::shared_object;
Mpp::Signature::c_compilation_md5를 사용하세요.
우리의 @ISA = qw(Mpp::Signature::c_compilation_md5); # 상속을 나타냅니다.
우리의 $shared_object = 축복 \@ISA; # makepp이 찾는 데 도움이 되는 마법의 조각
# 이 메소드의 서브루틴. 모두
# 서명 방법에는 다음 중 하나가 있어야 합니다.
# 값은 사용되지 않고 임의의 객체만 사용됩니다.
# 이제 서명이 필요할 때 호출되는 메서드는 다음과 같습니다.
# 이 서명 방법이 활성화된 대상 또는 종속성:
하위 서명 {
my ($self, # $shared_object와 동일합니다.
$finfo) = @_; # 모든 것을 포함하는 특별한 구조체
# makepp는 이 파일에 대해 알고 있습니다. 보다
# 자세한 내용은 Mpp/File.pm을 참조하세요.

if ($finfo->{NAME} =~ /\.s[oa]$/) { # 파일 이름이 .so 또는 .sa로 끝나나요?
$finfo->file_exists를 반환합니까? '존재합니다': '';
# 파일이 다음과 같은 경우 항상 동일한 서명을 반환합니다.
# 존재합니다. 이 경우 서명은 다음과 같습니다.
# 문자열 "존재합니다".
}

Mpp::서명::c_compilation_md5::서명;
# 파일이 .so 또는 .sa로 끝나지 않은 경우,
# makepp의 일반적인 서명 방법에 위임합니다.
}

이 파일은 makepp 배포판의 예제로 제공되며 몇 가지 추가 정보가 포함되어 있습니다.
댓글이 있습니다.

그런데 이것을 기본값으로 설정해 놓으면 어떨까요? 글쎄요, 바뀔 때가 있어요.
공유 라이브러리를 사용하려면 프로그램을 다시 연결해야 합니다. 다음 중 하나를 변경하는 경우
공유 라이브러리가 정의하는 기호 또는 다른 라이브러리에 의존하는 기호
때로는 재링크가 필요할 수도 있습니다.

예를 들어, 공유 라이브러리가 프로그램에서 실행되는 일부 서브루틴을 호출한다고 가정해 보겠습니다.
제공합니다. 예를 들어 공유 라이브러리를 변경하여 이제 외부 라이브러리를 호출한다고 가정해 보겠습니다.
서브루틴 "xyz()". 링커에 "-E" 또는 "--export-dynamic" 옵션을 사용하지 않는 한
(GNU binutils의 경우, 다른 링커에는 다른 옵션 이름이 있음) "xyz()" 기호는 그렇지 않을 수 있습니다.
프로그램에 존재하더라도 런타임 링커에 액세스할 수 있어야 합니다.

더 나쁜 것은 다른 라이브러리에서 "xyz()"를 정의했다고 가정해 보겠습니다. libxyz), 이와 같이:

my_program: main.o lib1/lib1.so xyz/libxyz.a

"libxyz"는 .a 파일이 아닌 .그래서 파일을 열면 "xyz()"를 가져올 수 없습니다.
정확하게부터 libxyz.a 바이너리를 다시 연결하지 않는 한.

Mpp::Signature 메소드는 또한 다음을 결정하는 데 사용되는 문자열뿐만 아니라
파일은 변경되었지만 문자열을 비교하는 데 사용되는 알고리즘은 변경되었습니다. 예를 들어,
makepp 배포판의 서명 방법 "target_newer"는 단지
대상은 종속성보다 최신인 반면 서명 방법 "exact_match"(및
"md5" 및 "c_compilation_md5"와 같이 이에 의존하는 모든 항목에는 다음이 필요합니다.
파일에는 마지막 빌드와 동일한 서명이 있습니다.

다음은 귀하가 깨닫는 데 도움이 될 수 있는 몇 가지 다른 종류의 서명 방법입니다.
가능성. 일반적인 목적이 충분하다면 이들 중 일부는 결국
makepp에 통합됨:

· 내보낸 모든 항목의 체크섬을 반환하는 공유 라이브러리에 대한 서명 방법
기호 및 다른 라이브러리에서 필요한 모든 기호도 포함됩니다. 이는 다음을 해결합니다.
위 예의 문제를 해결하고 모든 상황에서 올바른 링크를 보장합니다.
makepp 배포판에서 이를 수행하기 위한 실험적인 시도가 이루어졌습니다(참조:
Mpp/서명/shared_object.pm), 그러나 GNU binutils 및 ELF에서만 작동합니다.
현재 도서관.

· 파일에 기록된 날짜 스탬프를 무시하는 서명 방법입니다. 예를 들어, 만약 당신이
생성 .c 문자열을 넣어야 한다고 주장하는 일부 프로그램을 사용하여 자동으로 파일을 저장합니다.
다음과 같이 :

static char * date_stamp = "01년 2004월 XNUMX일에 아무도 자동으로 생성하지 않았습니다.";

날짜 스탬프의 변경 사항을 특별히 무시하는 서명 방법을 작성할 수 있습니다.
따라서 날짜 스탬프만 변경된 경우 makepp는 다시 빌드되지 않습니다.

· 일반적인 방법으로 서명을 계산하지만 서명을 무시하는 서명 방법
재구축 여부를 결정할 때 아키텍처 의존성. 이는 다음과 같은 경우에 유용할 수 있습니다.
진정한 아키텍처 독립적 파일; 현재 하나의 아키텍처를 기반으로 구축하는 경우
makepp는 전환할 때 아키텍처 독립적인 파일도 다시 빌드해야 한다고 주장합니다.
다른 아키텍처로.

· 라텍스 파일의 주석을 무시하는 방법을 아는 서명 방법
"c_compilation_md5" 메소드는 C 파일의 주석을 무시하는 방법을 알고 있습니다.

· 문서에만 체크섬을 적용하는 자동 문서 추출을 위한 서명 방법
문서 추출기에 필요한 주석을 달고 소스에 대한 다른 변경 사항을 무시합니다.
파일.

미완성
이 문서는 아직 완료되지 않았습니다. 자신만의 스캐너를 작성하는 방법을 다루어야 합니다.
파일 등을 포함합니다.

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



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