영어프랑스어스페인어

Ad


온웍스 파비콘

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

Ubuntu Online, Fedora Online, Windows 온라인 에뮬레이터 또는 MAC OS 온라인 에뮬레이터를 통해 OnWorks 무료 호스팅 제공업체에서 makepp_functions를 실행하세요.

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

프로그램:

이름


makepp_functions -- makepp의 함수

기술


A: 절대_파일이름,
절대_파일 이름_nolink,
압패스,
접두사 추가,
접미사,
과, B: 기본 이름, C: 요구, D: 디렉토리,
dir_noslash, E: 오류, F: 파일 대체,
필터,
필터아웃,
필터아웃_디렉터리,
파일 찾기,
find_first_upwards,
찾기 프로그램,
검색 문자열,
find_upwards,
첫 번째_사용 가능,
첫번째 단어,
각각, I: 만약,
만약 사실이라면,
추론_링커,
추론 객체,
정보, J: 어울리다, M: 하다,
메이크맵,
메이크펄,
지도,
"mktemp", N: 아니, O: 만 생성,
only_nontargets,
only_phony_targets,
만_부실,
only_targets,
또는,
기원, P: 팻 스트,
펄,
위조품,
사전 빌드,
인쇄, R: 실제 경로,
상대_파일이름,
상대_에, S: 껍질,
종류,
조각,
대체,
접미사, T: 일시적인, W: 경고,
와일드카드,
워드,
단어 목록,
단어, X: xargs

"name"이 변수 이름이 아닌 "$(name)" 형식의 표현식
"$(name arg1 arg2 arg3)"은 함수 호출로 해석됩니다. 이름에는 문자가 포함될 수 있습니다.
밑줄 또는 하이픈; 혼동을 피하기 위해 하이픈이나 밑줄을 사용할 수 있습니다.
내부적으로 하이픈은 밑줄로 변환되므로 서로 바꿔서 사용할 수 있습니다. 등을 평가
표현식은 단순히 Perl 서브루틴을 호출합니다. "이름" 앞에 "&"가 오면 다음을 실행합니다.
makepp 프로세스 내에서 해당 이름의 내장 명령 또는 스크립트를 실행하고 표준을 반환합니다.
산출. 이를 위해서는 PerlIO용으로 Perl을 구축해야 합니다. 이름이 기능의 이름을 지정하지 않는 경우
호출 호출로 변환됩니다.

변수와 마찬가지로 "$(name ...)" 또는 "${name ...}"을 선택할 수 있습니다. 당신이 원한다면
동일한 괄호를 삽입하려면 쌍을 이루어야 하며 다른 하나는 중요하지 않습니다. "$(name
...(){..." 또는 "${name ...{}(...}". (그러나 map 및 perl의 경우 첫 번째 닫는 괄호는 끝납니다.
표현식.) 두 배로 하면 인수가 여러 줄에 걸쳐 있을 수 있습니다. 개행 문자는 다음과 같습니다.
"정의"를 제외하고는 공백으로 처리됩니다. "$[name ...]" 구문도 있습니다.
또는 $[[name ...]], 메이크파일을 읽는 동안 규칙을 작성하기 전에 평가됩니다.
그리고 다른 구조물.

Makepp에는 유용할 수 있는 여러 내장 기능이 있습니다. 거의 모든 것을 지원합니다.
GNU make의 텍스트 기능(자세한 내용은 GNU make의 문서 참조) 및 그 중 일부
소유하다. Perl 서브루틴을 정의하여 원하는 대로 수행할 수 있습니다. "sub" 설명을 참조하세요.
자세한 내용은 makepp 확장 섹션을 참조하세요.

가정 어구 기능
조건1[,조건2[,조건3...]]
and 함수는 "단락" AND 연산을 제공합니다. 각 인수는
순서대로 확장되었습니다. 인수가 빈 문자열로 확장되면 처리가 중지되고
확장의 결과는 빈 문자열입니다. 모든 인수가 비로 확장되는 경우
빈 문자열이면 확장 결과는 마지막 인수의 확장입니다.

if 끈, 결과-문자열이 비어 있지 않은 경우[, 문자열이 비어 있는 경우 결과]
만약 사실이라면 끈, 결과-문자열-true[, 문자열이 false인 경우 결과]
"ifeq" 등의 진술에 대한 대안입니다. 문자열이 비어 있지 않은 경우(예:
조건이 true인 경우) 두 번째 인수("then" 절)가 반환됩니다(뒤에).
변수 확장); 문자열이 비어 있으면 세 번째 인수("else" 절)는 다음과 같습니다.
반환되었습니다.

예를 들어,

CFLAGS := $(if $(filter gcc egcc, $(CC)), -g -Wall, -g)

변수 CC가 "gcc" 또는 "egcc"이고 "-g"인 경우 CFLAGS를 "-g -Wall"로 정의합니다.
그렇지 않으면. (이것이 기본 빌드 규칙의 역할입니다.)

"iftrue"는 문자열 0이 공백으로 처리된다는 점을 제외하면 "if"와 유사합니다.

or 조건1[,조건2[,조건3...]]
or 함수는 "단락" OR 연산을 제공합니다. 각 인수를 확장하면
순서대로. 인수가 비어 있지 않은 문자열로 확장되면 처리가 중지되고
확장의 결과는 해당 문자열입니다. 모든 인수가 확장된 후 모든 인수가
false(비어 있음)인 경우 확장 결과는 빈 문자열입니다.

입양 부모로서의 귀하의 적합성을 결정하기 위해 미국 이민국에 파일 이름 기능
절대_파일이름 파일
아스파파트 파일
없이 상대 파일 이름을 절대 이름으로 변환합니다. . or ... 예를 들어,
"$(absolute_filename xyz.c)"는 "/usr/src/our_project/subdir/xyz.c"를 반환할 수 있습니다.

절대_파일 이름_nolink 파일
진짜 경로 파일
Absolute_filename과 비슷하지만 심볼릭 링크가 해결되었는지 확인합니다.

기본 이름 파일 이름
기본 이름은 전체 파일 이름(디렉토리 포함)에서 및 뒤의 텍스트를 뺀 것입니다.
마지막 기간을 포함하여. 예를 들어, "$(basename myfile/version-1.0-module.c)"는
"myfile/버전-1.0-모듈"

DIR 파일 이름
후행을 포함하여 파일 이름 목록에 있는 각 파일의 디렉터리 부분을 추출합니다.
삭감. 파일 이름에 디렉터리가 없으면 "./"를 반환합니다.

dir_noslash 파일 이름
후행 슬래시를 반환하지 않는다는 점을 제외하면 "$(dir )"과 동일합니다.

파일 대체 무늬, 대용품,
파일 이름에 대해 패턴 대체를 수행합니다. 이는 patsubst와 다른 점에서
디렉토리에 대한 대체 이름이 지정되면 올바르게 수행됩니다(
백분율 기호 앞에 표시됩니다. 예를 들어,

$(filesubst ./src/%.c, %.o, $(와일드카드 src/*.c))

filesubst에서는 작동하지만 patsubst에서는 작동하지 않습니다.

filter_out_dirs 파일 이름
디렉터리를 참조하지 않는 모든 파일 이름을 반환합니다.

파일 찾기 파일 이름, 통로
지정된 경로에서 파일을 찾거나 아무것도 없으면 환경 변수 PATH에서 파일을 찾습니다.
지정. 이는 바이너리나 포함 파일을 찾는 데 유용할 수 있습니다. 예를 들어,

TCL_INCLUDE := -I$(dir_noslash $(findfile tcl.h, \
/usr/local/stow/tcl-8.4.5-nothread/include \
/usr/include/tcl8.4 /usr/include/tcl \
/net/na1/tcl8.4a3/include /net/na1/tcl8.4a3/include))

파일을 찾습니다. tcl.h 위의 모든 디렉토리를 검색하여. 절대적인
파일 경로가 반환됩니다. 그런 다음 "$(dir_noslash )"는 해당 디렉토리를 추출하고
포함 경로에 들어갑니다.

찾기_프로그램 name
PATH에서 찾을 수 있는 목록의 첫 번째 프로그램을 반환합니다. 이것은 유용하다
사용할 수 있는 동등한 프로그램이 여러 개 있고 원하는 경우
그 중 하나를 선택하세요. 예를 들어, 다음은 몇 가지 공통 항목의 기본 정의입니다.
makefile에 변수를 넣지 않은 경우 makepp이 제공하는 변수:

CC = $(find_program gcc egcc pgcc c89 cc) # 머신에 따라 그 이상
F77 = $(find_program f77 g77 fort77)
CXX = $(find_program g++ c++ pg++ cxx CC aCC)

어떤 프로그램도 발견되지 않으면 "$(find_program )"은 찾을 수 없는 문자열을 반환하고,
발견되지 않은 것을 기록합니다. 이는 일반적으로 기능적인 makefile을 생성하지 않지만
더 나은 오류 메시지를 만드는 경향이 있습니다. 예를 들어, 다음과 같은 작업을 수행하면
이:

%.o : %.c
$(CC) $(입력) -o $(출력)

makepp이 위 목록에서 C 컴파일러를 찾을 수 없으면 not-found로 대체됩니다.
그렇지 않으면 쉘이 소스 파일을 실행하려고 시도하고 결과 오류가 발생합니다.
메시지가 정말 이상할 수도 있습니다.

find_upwards 파일 이름
., .., .. 디렉토리에서 주어진 이름의 파일을 검색합니다./ ..../../..등,
파일을 찾거나 루트 디렉터리에 도달하거나 디렉터리를 찾을 때까지
다른 파일 시스템에서. (이 마지막 요구 사항은 다음과 같은 문제를 방지하기 위한 것입니다.
자동 마운트 또는 중단된 네트워크 파일 시스템.) RootMakepp 파일, 그것도 그렇죠
더 높은 곳을 찾는 것을 막는 장벽.

예를 들어, 여러 수준의 하위 디렉터리가 있는 프로젝트가 있는 경우 다음을 수행할 수 있습니다.
모든 makefile에 이 공통 조각을 포함시킵니다(예: "include"를 사용하여).
성명):

TOP_LEVEL_INCLUDE_DIR := $(find_upwards 포함)
# 다음을 포함하는 디렉토리를 검색합니다.
#에는 하위 디렉터리가 포함됩니다.

%.o : %.c
$(CC) $(CFLAGS) -I$(TOP_LEVEL_INCLUDE_DIR) -c $(입력) -o $(출력)

"find_upwards"가 해결하는 데 도움이 될 수 있는 또 다른 문제는 최상위 디렉터리를 찾는 것입니다.
빌드의. 다음과 같이 변수를 정의하는 것이 유용한 경우가 많습니다.

탑 := ../../..

최상위 디렉토리에만 중요한 정보가 있는 경우. 하지만
레벨에 따라 ".."의 개수가 다르기 때문에 유지 관리가 어렵습니다.
디렉토리 트리의. 대신 "find_upwards"를 사용하여 다음과 같은 파일을 찾을 수 있습니다.
최상위 디렉토리에만 존재하는 것으로 알려져 있습니다. 예를 들어,
"LICENSE" 파일은 최상위 디렉토리에만 있습니다. 그러면 다음과 같이 할 수 있습니다.

TOP := $(dir_noslash $(find_upwards 라이센스))

"$(find_upwards LICENSE)"는 라이센스 파일의 전체 경로를 반환합니다.
"$(dir_noslash ...)"는 파일 이름을 제거하고 디렉터리만 반환합니다.

("include" 문은 자동으로 위쪽으로 파일을 검색하므로
다음과 같은 작업을 수행할 필요가 없습니다.

$(find_upwards top_level_rules.mk) 포함

대신, 당신은 할 수 있습니다

top_level_rules.mk 포함

그리고 그것은 잘 작동할 것이다.)

파일을 찾을 수 없으면 "find_upwards"는 오류 메시지와 함께 빌드를 중단합니다.

두 개 이상의 파일을 지정하면 find_upwards는 첫 번째 파일을 검색한 다음
두 번째 등등. 다시 말해서,

$(find_upwards 파일1 파일2)

에 해당하는

$(find_upwards 파일1) $(find_upwards 파일2)

파일 중 하나를 찾으려면 대신 "find_first_upwards"를 사용하세요.

find_first_upwards file1 file2 ...
이 함수는 모든 항목의 첫 번째 파일을 반환한다는 점을 제외하면 "find_upwards"처럼 동작합니다.
찾은 목록의 파일. 특히 현재 디렉터리에서 다음 사항을 확인합니다.
목록에 있는 파일 중 하나를 선택하고 존재하거나 빌드할 수 있는 첫 번째 파일을 반환합니다.
해당 디렉터리에 파일이 없거나 빌드할 수 없으면 확인합니다. ..다음,
../ ..등을 루트 디렉터리나 다음 디렉터리에 도달할 때까지 계속합니다.
다른 파일 시스템에 위치합니다.

첫 번째_사용 가능 file1 file2 ...
존재하거나 빌드할 수 있는 목록의 첫 번째 파일을 반환합니다. 이는 다음과 같은 경우에 유용할 수 있습니다.
여러 다른 컴퓨터나 네트워크에서 작동하도록 makefile을 조정합니다.
중요한 파일은 다른 위치에 있을 수 있습니다. 예를 들어, 다음 줄은 다음과 같습니다.
내 메이크파일 중 하나:

TCL_LIB = $(첫 번째_사용 가능 \
/usr/local/stow/tcl-8.4.5-nothread/lib/libtcl8.4.so \
/usr/lib/libtcl8.4.so /usr/lib/libtcl.so \
/net/na1/tcl8.4a3/lib/libtcl8.4.a \
/net/na1/tcl8.4a3/lib/libtcl8.4.sl)

이 줄은 위의 모든 위치에서 Tcl 라이브러리를 확인하고
가장 먼저 발견한 것. 그런 다음 링크 명령에는 $(TCL_LIB)가 포함되므로 다음을 얻습니다.
적절한 Tcl 라이브러리.

추론_링커 file1 file2 ...
객체 파일 목록이 주어지면 아직 객체 파일이 없으면 먼저 빌드하십시오. 그런 다음 찾아
Fortran, C++ 또는 C 소스에 의존하고 해당 소스를 반환하는지 여부
컴파일러("ld"보다 링크 방법을 더 잘 알고 있음).

infer_objects file1 file2 ..., 무늬
$(infer_objects object1.o object2.o, *.o)

헤더 파일 이름과 관련된 표준 규칙을 사용하는 경우 makepp는 다음을 수행할 수 있습니다.
어떤 ".o" 또는 ".lo" 파일이 프로그램과 연결되어야 하는지 추측합니다. 나는 이것을 사용하여
다양한 용도로 사용되는 모듈이 포함된 라이브러리 디렉토리에서 파일을 선택합니다.
프로그램들. 라이브러리 ".a" 파일을 만들고 링커가 선택하도록 하는 대신
관련 모듈이 있으면 makepp에서 관련 모듈을 골라줄 수 있습니다. 이 방법으로만
관련 모듈이 컴파일됩니다.

개체 종속성을 추론하기 위한 Makepp의 알고리즘은 다음 규칙에 따라 달라집니다.
헤더 파일 "xyz.h"에 정의된 모든 클래스 또는 함수의 구현은 다음과 같습니다.
"xyz.o"(또는 "xyz.lo")라는 개체 파일로 컴파일됩니다. 그래서 makepp의 알고리즘은
객체 종속성을 추론하는 것은 우리가 알고 있는 하나 또는 몇 개의 객체로 시작됩니다.
프로그램에 연결됩니다. "#include"가 포함된 파일이 무엇인지 살펴봅니다.
해당 소스를 검색하고 각 포함 항목에 해당하는 개체 파일을 찾으려고 시도합니다.
파일.

"$(infer_objects )"는 다음과 같이 프로그램의 종속성 목록에 언급되어야 합니다.
이:

myprog: $(infer_objects main.o another_object.o, \
**/*.o /기타/라이브러리/dirs/**/*.o)
$(CXX) $(입력) -o $(출력) $(LIBS)

"$(infer_objects)" 함수는 두 개의 인수(표시된 것처럼 쉼표로 구분)를 사용합니다.
첫 번째는 필요한 것으로 알려진 하나 또는 몇 개의 개체 파일입니다(와일드카드는
여기에서는 허용됩니다.) 두 번째는 가능한 객체의 목록입니다(일반적으로
와일드카드)는 필요한 경우 연결할 수 있습니다. 이것의 반환 값
함수는 첫 번째 인수의 모든 객체를 먼저 포함하는 목록입니다.
그런 다음 두 번째 인수에 포함된 모든 추가 객체
첫 번째 인수의 개체에 필요한 것입니다.

예를 들어, "main.o"가 "my_class.h"를 포함하는 "main.cpp"에서 온다고 가정합니다.
"$(infer_objects)"는 "my_class.o"라는 이름의 파일을 찾습니다. 정확히 하나라면
파일이 발견되면 목록에 추가됩니다. (두 개의 개체 파일 "my_class.o"가 발견된 경우
다른 디렉토리에서는 경고 메시지가 인쇄됩니다.) "infer_objects"도
"my_class.cpp"를 검사하여 포함된 내용과 추가 개체 파일이 무엇인지 확인합니다.
암시.

mktemp
mktemp 접두사
mktemp 접두사트리플 엑스
mktemp /
현재 존재하지 않는 예측할 수 없는 임시 파일 이름을 반환합니다. 이름 없음
상대 경로가 다르더라도 동일한 파일을 가리키는 것이 두 번 반환됩니다.
하나의 makepp 실행 내에서(전통적인 재귀 make를 사용하는 경우 또는 Perl의 경우 제외)
규칙 작업 내에서 실행되는 코드는 "f_mktemp"를 호출합니다. makepp가 끝나면 모두 실행됩니다.
이 함수에 의해 반환된 파일이 존재하는 경우 삭제됩니다.
규칙 내에서 실행되는 Perl 코드에서 이 함수에 의해 반환됩니다.

인수 끝에 있는 임의 개수의 대문자 "X"는 해당 개수로 대체됩니다.
임의의 문자와 숫자. 많을수록 충돌할 가능성이 줄어듭니다.
다른 프로세스와 함께 사용하므로 "/tmp/abc.", 넌 충분히 가지고 있어야 해.
"X". X가 두 개 이상 있으면 첫 번째 문자는 프로세스 ID에서 나옵니다. 만약에
하나도 없고 열 개가 있는 것 같으니 이 정도면 충분할 것 같습니다(8.4e17
가능성이 있거나 Windows에서는 3.7e15). 인수가 없으면 접두사는 기본적으로 다음과 같습니다.
"tmp."를 현재 디렉터리에 저장합니다.

규칙 대상 및 종속성과 같은 이름을 지정하고 싶지는 않습니다. 그만큼
결과는 정확하지만 makepp를 실행할 때마다 다시 생성됩니다.

또한 항상 다르기 때문에 다음을 사용하는 경우에만 규칙 작업에서 이를 사용해야 합니다.
":build_check 무시_작업":

TMPFILE ;= $(mktemp) # 1번 호출; "="는 3번의 호출을 의미합니다: 3개의 파일
A-카운트 B-카운트: :build_checkignore_action
생산 및 B >$(TMPFILE)
&grep -c /A/ $(TMPFILE) -o A-카운트
&grep -c /B/ $(TMPFILE) -o B-카운트

또는 이를 내보내고 셸이 이를 평가하도록 해야 합니다.

TMPFILE 내보내기 ;= $(mktemp)
A-카운트 B-카운트:
producer-As-and-Bs >$$TMPFILE # makepp는 var 값을 보지 못합니다.
fgrep -c A $$TMPFILE >A-count
fgrep -c B $$TMPFILE >B-count

마지막 형식은 이전 반환 값을 반복하므로 패턴 규칙에서 사용할 수 있습니다.

%.x: %.y
&grep foo $(입력) -o $(mktemp)
&sed bar $(mktemp /) -o $(output) # &grep의 출력에 대해 작동

아니오 파일 이름
파일 이름 중 디렉토리가 아닌 부분, 즉 마지막 파일 이름 이후의 모든 부분을 반환합니다.
파일 이름이 있으면 슬래시를, 그렇지 않으면 전체 파일 이름을 입력합니다.

만_생성됨 파일 이름
목록에서 makepp에 의해 생성된 파일 이름만 반환하고 이후 생성된 파일 이름만 반환합니다.
빌드 정보 파일에 따라 수정되었습니다.

이 기능은 깨끗한 대상 규칙에 유용합니다(물론 "makeppclean"이
선호하는 변형):

$(포니 클린):
&rm -f $(only_generated **/*)

only_nontargets 파일 이름
목록에서 어떤 규칙의 대상도 아닌 파일 이름만 반환합니다.
명시적 또는 패턴 규칙). 와일드카드를 지정할 수 있습니다("$(wildcard )" 참조).
makepp의 와일드카드에 대한 자세한 내용은 함수를 참조하세요). 이는
배포 대상(예:

.PHONY: 배포

분포:
&mkdir our_product-$(버전)
&cp $(필터 제외 %~, $(only_nontargets *)) our_product-$(버전)
tar cf - our_product-$(버전) | gzip -9c > our_product-$(버전).tar.gz

이 경우 "$(only_nontargets *)"는 현재 디렉터리의 모든 파일을 반환합니다.
그것은 어떤 규칙의 대상이 아닙니다. "$(filter_out %~, ...)"는 편집기를 제거합니다.
백업.

"only_targets"(위 참조)와 유사하게 "only_nontargets"는 다음과 같은 대상에 대해서만 알고 있습니다.
이미 정의되어 있습니다. 이는 변수를 정의하는 데 사용하는 경우에만 문제가 됩니다.
":=" 할당으로; 종속성 목록이나 본문에서 사용하는 경우
규칙에 따라 다른 모든 규칙은 이미 확인되었을 것입니다.

only_stale 파일 이름
목록에서 makepp에 의해 생성된 파일 이름만 반환하고 이후 생성된 파일 이름만 반환합니다.
빌드 정보 파일에 따라 수정되었지만 더 이상 어떤 규칙의 대상도 아닙니다.

이 기능은 해당 파일에 대한 종속성이 없는지 확인하는 데 유용합니다.
모든 대상을 강제로 새로 빌드하지 않고:

$(가짜 플러시):
&rm -f $(only_stale **/*)

실제로 makepp를 호출하여 생성하는 스크립트를 작성하는 것보다 더 나을 수도 있습니다.
오래된 파일 목록을 삭제한 다음 해당 스크립트에서 나열된 모든 파일을 제거하도록 합니다.
생성된 파일이 소스가 되는 경우를 대비해 현재 소스 제어 대상이 아닙니다.
파일. Makepp에는 그러한 기능이 내장되어 있지 않습니다. 왜냐하면 makepp는 (그리고 아마도
유지해야 함) 소스 제어에 대해 불가지론적이어야 합니다.

only_targets 파일 이름
목록에서 실제로 일부 규칙의 대상인 파일 이름만 반환합니다.
(명시적 규칙이나 패턴 규칙) 와일드카드를 지정할 수 있습니다(makepp 포함).
파일 이름에 특수 와일드카드, "**")를 사용하세요. (자세한 내용은 "$(와일드카드 )" 함수를 참조하세요.
세부. 이는 깨끗한 대상에 사용될 수 있습니다. 예를 들면 다음과 같습니다.

.PHONY: 깨끗함

깨끗한:
&rm -f $(only_targets *)

이제 "makepp clean"을 입력하면 빌드 방법을 알고 있는 모든 항목이 삭제됩니다. 하지만
깨끗한 대상을 만들지 말고 대신 "makeppclean"을 사용하세요!

유용할 수 있는 또 다른 곳은 오래된 항목을 포함하지 않는 것입니다. .o 당신의 파일
짓다. 예를 들어, 다음과 같은 라이브러리를 구축한다면:

mylib.a: *.o
&rm -f $(출력)
$(AR) cr $(출력) $(입력)

그런 다음 일부 소스 파일을 삭제했지만 해당 파일을 삭제하는 것을 잊어버렸습니다. .o 파일
전에, .o 파일은 여전히 ​​주변에 있을 것입니다. 이는 해당 항목이 여전히
더 이상 유용하지 않음에도 불구하고 도서관. 귀하가 귀하의
다음과 같이 규칙을 정하세요:

mylib.a: $(only_targets *.o)
&rm -f $(출력)
$(AR) cr $(출력) $(입력)

그러면 이 문제는 발생하지 않습니다.

이는 대상으로 알려진 파일에만 적용됩니다. at 전에, 시간 당신
호출 "유일한 대상". 종속성 또는 작업에 "only_targets"가 나타나는 경우
규칙을 적용하면 종속성과 작업이 일치하지 않기 때문에 가능한 모든 대상이 알려지게 됩니다.
규칙이 실행될 때까지 평가됩니다. 하지만 평가한다면 평가해 보세요.
다음과 같이 ":=" 변수를 사용하여 makefile의 앞 부분에:

ALL_TARGETS := $(only_targets *)

대상1: 종속성1
행위

대상2: 종속성2
행위

그러면 "only_targets"는 후속 규칙에 대해 알 수 없습니다.

마찬가지로 "only_targets"는 makefile에서 생성된 대상에 대해 알지 못합니다.
재귀 make로 로드됩니다. (그러나 어쨌든 재귀 make를 사용해서는 안 됩니다.
대신 "load_makefile" 문을 사용하거나 암시적 makefile 로딩을 사용하세요.)

상대_파일이름 file1 file2 파일3[, 삭감]
현재 디렉터리(다음 디렉터리)를 기준으로 해당 파일의 이름을 반환합니다.
makefile이 있습니다). 이는 불필요한 "./" 및 기타 정크를 제거하는 데에도 사용할 수 있습니다.
경로:

디렉토리 := .
하위디르 := ..
FNAME := $(DIR)/../otherdir/$(SUBDIR)/files
X := $(relative_filename $(FNAME))

If 베다 true(보통 1)인 경우 반환된 파일 이름에는 슬래시가 포함됩니다.
필요한 경우 "./"를 추가하여 실행 파일 이름으로 사용할 수 있습니다.
디렉토리 위치를 무시하는 명령 검색 경로에 대해 걱정합니다.

경로가 루트 디렉터리를 기준으로 하는 경우 홈 디렉터리 또는
빌드 시스템의 "$(ROOT)" 또는 Windows의 경우 드라이브 루트(
환경에서도 이런 일이 발생합니다. /cygdrive/c or /c) 절대 경로는 다음과 같습니다.
대신 돌아왔습니다.

상대_에 file1 file2 파일3[, 예배 규칙서]
지정된 디렉토리와 관련된 해당 파일의 이름을 반환합니다. 이것은
일반적으로 어떤 이유로든 명령을 실행해야 할 때 유용합니다.
다른 디렉터리(기본 현재 디렉터리):

소스_백업.tar:
cd .. && tar cf $(relative_to $(output), ..) $(relative_to ., ..)

접미사 이름...
이름에서 각 파일 이름의 접미사를 추출합니다. 파일명에 마침표가 포함된 경우
접미사는 마지막 마침표로 시작하는 모든 것입니다. 그렇지 않으면 접미사는
빈 문자열. 이는 이름이 없으면 결과가 비어 있음을 의미하는 경우가 많습니다.
이름에 여러 파일 이름이 포함된 경우 결과에는 더 적은 수의 파일 이름이 포함될 수 있습니다.

예를 들어,

$(접미사 src/foo.c src-1.0/bar.c 해킹)

".c .c"라는 결과가 생성됩니다.

일시적인
지정된 대상이 생성되는 규칙에 의해 제거될 수 있음을 makepp에 알립니다.
그들을. makepp이 해당 이름의 실제 파일을 기대한다는 점을 제외하면 "phony"와 유사합니다.
규칙의 영향을 받을 수 있습니다. 일시적인 경우에만 규칙이 실행되지 않습니다.
대상이 오래되었습니다.

와일드 카드 무늬
존재하는 주어진 패턴과 일치하는 모든 파일의 정렬된 이름을 반환합니다.
아직 존재하지 않지만 makepp이 알고 있는 규칙을 기반으로 구축할 수 있는 파일
표현식을 평가하는 시점에 말이죠. 이 마지막 점에서는 다르다
나중에 발견된 규칙에 의해 생성된 파일에도 적용되는 규칙 입력 와일드카드에서.

Makepp은 모든 일반적인 셸 와일드카드("*", "?" 및 "[]")를 지원합니다. 그것은 또한
중간에 있는 디렉터리 수와 일치하는 와일드카드 "**"입니다. (이 아이디어는
zsh에서 도난당했습니다.) 예를 들어 "**/*.c"는 모든 항목과 일치합니다. .c 전체 소스의 파일
나무. "objects/**/*.o"는 다음과 모두 일치합니다. .o 다음 위치에 포함된 파일
하위 디렉토리 사물 또는 해당 하위 디렉터리 또는 해당 하위 디렉터리 중 하나입니다. 그만큼
"**" 와일드카드는 어떤 수준의 디렉터리에도 소프트 링크를 따르지 않습니다.
존재하지만 읽을 수 없는 디렉토리에 들어가려고 합니다. 또한 파일과
존재하지만 읽을 수 없는 디렉토리는 "$(wildcard )"에 의해 반환되지 않습니다.

기능
접두사 추가 접두사,
각 단어 앞에 접두사 문자열을 추가합니다. 이것은 주로 GNU make용입니다.
호환성; rc 스타일 확장을 사용하면 더 읽기 쉬운 방식으로 수행할 수 있습니다.
이렇게 :

모듈 := abcd
X_OLD_STYLE := $(접두어 추가 $(OBJDIR)/, $(접미어 추가 .o, $(MODULES)))
X_NEW_STYLE := $(OBJDIR)/$(MODULES).o # 읽기가 더 쉽지 않나요?

접미사 접미사,
각 단어에 접미사 문자열을 추가합니다. 이것은 주로 GNU make용입니다.
호환성; rc 스타일 확장을 사용하면 더 읽기 쉬운 방식으로 수행할 수 있습니다.
이렇게 :

X_OLD_STYLE := $(접미사 .o 추가, $(MODULES))
X_NEW_STYLE := $(MODULES).o

전화 변하기 쉬운[, 단어]...
"호출" 기능은 다음과 같은 용도로 사용할 수 있다는 점에서 독특합니다. 변수
매개변수화된 함수. 복잡한 표현식을 할당할 수 있습니다. 변수 사용
"호출"을 통해 내용을 매개변수화된 다른 값으로 확장합니다. 나중에. ~ 안에
다른 make 시스템을 통해 확장할 목적으로 주로 사용되는 변수입니다.
"전화"라고 불린다. 매크로.

매크로를 확장하는 동안 임시 변수는 $1, $2, "..." 참조
호출 중에 "call"에 제공된 인수입니다. 변수 $0 으로 확장될 예정입니다.
매크로 이름(예: 변수) 현재 '통화'가 확대되고 있습니다.

매크로가 "호출"될 수 있는 인수 수 또는 수에는 제한이 없습니다.
매크로가 예상할 수 있는 매개변수입니다. 매크로로 "call"에 더 많은 인수를 전달하는 경우
필요한 경우 초과하는 인수는 모두 삭제됩니다. a보다 적은 수의 인수를 전달하는 경우
매크로가 예상되면 초과하는 모든 매개변수는 빈 문자열로 축소됩니다.

먼저 간단한 예를 들어보겠습니다.

나머지 = $(단어 목록 2, $(단어 $(1)),$(1))
목록 = ABCDE
하지만 먼저 := $(통화 나머지,$(목록))

여기서 변수 "$(butfirst)"에는 "BCDE" 목록이 포함됩니다.

이제 가능한 것을 보여주는 더 복잡한 예를 살펴보겠습니다.

나머지 = $(단어 목록 2,$(단어 $(1)),${1})
mymap = $($2,$(call $1,$(firstword $2)) $(call $0,$1,$(call rest,$2)))
다운케이스 = ${makeperl lc("$1")}

UCWORDS = 이 단어는 모두 대문자입니다.
DCWORDS := $(mymap 호출,downcase,$(UCWORDS))

이제 "$(DCWORDS)"에는 "이 단어는 모두 대문자입니다"가 포함됩니다. 그건 그렇고 : 그것은 안돼
차이점은 다음을 통해 인수에 액세스하는지 여부입니다. $1, "${1}" or "$(1)" 매크로 내에서.

변수가 없으면 마치 함수인 것처럼 변수를 직접 사용할 수 있습니다.
그 이름의 기능. 이는 내부적으로 "call"로 변환되므로 다음과 같습니다.
동등한:

토론 = $0가 $1 $2로 바뀌었습니다.
direct = $(토론,인수)
전화함 = $(전화 토론,an,인수)

"$[call]"이 매크로의 "$[]"도 확장해야 하는지 여부는 논쟁의 여지가 있는 것처럼 보일 수 있습니다.
표현식 또는 함수가 어떻게 작동하든 항상 동일한 작업을 수행해야 하는지 여부
호출됩니다. 후자가 선택되었습니다. 왜냐하면 일반적인 make 구문을 사용하면 다음과 같을 것이기 때문입니다.
"$[1], $[2]..."를 변수로 가져오는 것은 불가능합니다(아무 것도 대체되지 않습니다.
할당이 이루어지기 전에.) 따라서
규칙을 구문 분석할 때 "$(output)"과 같은 표현식이 표시되기를 원하므로
"전화"로부터 보호해야 합니다.

마이룰 정의
$2: $1
내 명령 $$(입력) -o $$(출력)
엔데프
$[myrulemyinput,myoutput]

필터링 패턴,
패턴과 일치하는 목록의 모든 단어를 반환합니다. 패턴은 단순히 다른 것일 수도 있습니다.
단어 또는 파일 이름 와일드카드(예: "*", "?" 및 "[az]"가 인식됨)
해당 지점의 모든 문자열과 일치한다는 의미인 "%" 문자가 있습니다("*"와 동일).

필터아웃 패턴,
패턴과 일치하지 않는 목록의 모든 단어를 반환합니다. 패턴은 단순히
다른 단어 또는 파일 이름 와일드카드(예: "*", "?" 및 "[az]"가 인식됨) 또는
"%" 문자가 있을 수 있습니다. 이는 해당 지점의 모든 문자열과 일치한다는 의미입니다(
"*").

예 :

libproduction.a: $(filter_out test_*, $(와일드카드 *.o))

모두 넣을 것입니다 .o 다음으로 시작하는 파일을 제외하고 존재하거나 빌드될 수 있는 파일 test_,
으로 libproduction.a.

검색 문자열 찾다, in
반품 발견, 그것이 다음의 하위 문자열인 경우 in.

첫번째 단어
첫 번째 단어를 반환합니다.

지도 단어, 펄코드
메이크맵 단어, 펄코드
Perl의 맵과 유사하게 적용됩니다. 펄코드 차례로 각 단어에 대해 다음을 반환합니다.
결과. 첫 번째 변형은 일반 Perl 코드이고 두 번째 변형은 먼저 통과합니다.
Make 스타일 변수 확장을 통한 Perlcode. 단어는 둘 다에서 확장됩니다.
경우.

단어는 $_에 있으며 $_를 undef하지 않는 한 반환됩니다. 이는 다음을 위한 것입니다.
"patsubst"에서는 쉽게 처리할 수 없는 수정 사항입니다. 첫 번째 쉼표만 구분 기호입니다.
다른 모든 것은 다음의 일부로 간주됩니다. 펄코드.

# 단어를 바꿔보세요. Perlcode에서 괄호를 허용하려면 이중 괄호를 사용하거나 ${}를 사용하세요.
X = $((맵 $(VALUES), s/(.+)-(.+)/$2-$1/))
# make 표현식을 사용할 수 있지만 Perl $에는 $$를 사용해야 합니다.
Y = $(makemap $(VALUES), tr/$(OLDCHARS)/$(NEWCHARS)/ 또는 $$_ = '실패')
# 후보자를 제거할 수 있습니다:
Y = $(map $(VALUES), unef $_ if /no_good/)

어울리다 단어1, 단어2
첫 번째 단어와 두 번째 단어를 쌍으로 조인합니다.

팟츠브스트 무늬, 대용품,
단어 목록의 각 단어에 대해 대체를 수행합니다. "%" 문자는 다음과 일치합니다.
끈. 이는 다음 예를 통해 가장 잘 설명됩니다.

OBJS = $(patsubst %.c, object_dir/%.o, $(C_SOURCES))

C_SOURCES의 모든 파일을 가져와 object_dir의 개체 파일 이름을 반환합니다.
때로는 대체 참조를 사용하는 것이 더 간결할 수 있습니다. 예를 들어 위의 내용은 다음과 같습니다.
다음과 같이 작성되었습니다.

OBJS = $(C_SOURCES:%.c=object_dir/%.o)

종류 word1 word2 word3 ...
단어를 어휘순으로 정렬하고 중복된 단어를 제거합니다.

조각
문자열에서 선행 및 후행 공백을 제거하고 각 내부 공백을 대체합니다.
단일 공백이 포함된 하나 이상의 공백 문자 시퀀스입니다. 따라서 "$(ab 스트립
c )"는 "abc"가 됩니다.

명사 시작,끝,텍스트
텍스트 텍스트에 대해 텍스트 대체를 수행합니다. from이 나올 때마다 대체됩니다.
에 의해. 결과는 함수 호출로 대체됩니다. 예를 들어,

$(대체 ee,EE,거리의 피트)

문자열 "fEEt on the strEEt"를 대체합니다.

워드 n,텍스트
반환 n번째 단어 본문. 합법적인 가치 n 1부터 시작해서 처음부터
또는 끝의 -1에서 거꾸로. 만약에 n 단어 수보다 크다. 본문Walk Through California 프로그램,
값이 비어 있습니다.

단어 목록 색인 목록,
단어 목록 첫 번째 인덱스, 마지막 인덱스,
첫 번째 형식에서는 인덱스 목록을 제공합니다(처음에는 1부터 계산하거나
끝의 -1부터 거꾸로) 원하는 단어를 선택하세요. 두 번째 형태에서는
반환하려는 단어 범위를 지정합니다.

본문
단어 수를 반환합니다. 본문.

그 외 기능
각각 var,목록,텍스트
처음 두 인수는 였다명부, 다른 작업이 완료되기 전에 확장됩니다. 메모
마지막 인수인 text는 동시에 확장되지 않습니다. 그러면 각 단어에 대해
list의 확장된 값, var의 확장된 값으로 명명된 변수는 다음과 같이 설정됩니다.
해당 단어와 텍스트가 확장됩니다. 아마도 텍스트에는 해당 변수에 대한 참조가 포함되어 있을 것입니다.
그래서 그 확장은 매번 다를 것입니다.

이 간단한 예는 변수를 설정합니다. 파일 모든 파일 목록에
목록의 디렉터리 dirs:

디렉토리 := ABCD
파일 := $(foreach dir,$(dirs),$(와일드카드 $(dir)/*))

여기서 텍스트는 "$(와일드카드 $(dir)/*)"입니다. 첫 번째 반복에서는 dir의 "a" 값을 찾습니다.
따라서 "$(wildcard a/*)"와 동일한 결과가 생성됩니다. 두 번째 반복은
"$(와일드카드 b/*)"의 결과; 세 번째는 "$(와일드카드 c/*)"입니다.

이 예는 다음 예와 동일한 결과를 갖습니다("dirs" 설정 제외).

파일 := $(와일드카드 a/* b/* c/* d/*)

텍스트가 복잡할 경우 이름을 지정하여 가독성을 높일 수 있습니다.
추가 변수:

find_files = $(와일드카드 $(dir)/*)
디렉토리 := ABCD
파일 := $(foreach dir,$(dirs),$(find_files))

여기서는 find_files 변수를 이런 식으로 사용합니다. 우리는 일반 "="를 사용하여
재귀적으로 확장되는 변수로, 그 값에는 다음에 대한 실제 함수 호출이 포함됩니다.
foreach의 제어 하에 다시 확장됩니다. 단순히 확장된 변수는 그렇지 않습니다.
와일드카드는 find_files를 정의할 때 한 번만 호출되기 때문입니다.

참고: 이를 "$(foreach)" 특수 변수와 혼동하지 마십시오.

정보 본문
경고 본문
오류 본문
아무것도 반환하지 않는 출력 텍스트입니다. 첫 번째는 STDOUT으로 이동하고 두 번째는 STDERR로 이동합니다.
세 번째는 추가로 처리를 중단합니다.

사전 빌드 목표
확인 목표
인수를 그대로 반환하지만 먼저 나열된 모든 파일을 빌드합니다. 이것은 유용하다
make 표현식을 평가할 때 특정 파일이 필요할 때. 이는 일반적으로 발생합니다.
관련된 파일 세트가 일부 쉘에 의해 계산되는 빌드가 있는 경우
명령. 예를 들어,

파일_목록:
# 프로그램에 넣을 파일 목록을 계산하는 쉘 명령

my_program : $(&cat $(사전 빌드 파일 목록))

둘 이상의 규칙에 목록이 필요한 경우
최대 한 번 변수를 확장합니다.

file_list ;= $(&cat $(사전 빌드 file_list))

my_program1 : ao $(file_list)

my_program2 : bo $(file_list)

대신 "$(&cat file_list)"만 지정했다면 makepp는 강제로 실행하지 않습니다.
file_list는 쉘 명령을 실행하기 전에 최신 상태여야 합니다. "$(사전 빌드)" 사용
이 문제를 해결하는 가장 좋은 방법입니다. 다음과 같은 다른 것을 시도하고 싶은 유혹을 느낄 수도 있습니다.
이:

my_program : 파일_목록 $(&cat 파일_목록)

하지만 이것은 makepp가 시도하기 전에 "$(&cat file_list)"가 평가되기 때문에 작동하지 않습니다.
"file_list"를 빌드하세요.

only_phony_targets 이름
일부 규칙의 가짜 대상인 목록의 이름만 반환합니다.
명시적 또는 패턴 규칙). 와일드카드를 지정할 수 있습니다(makepp의 특수 문자 포함).
와일드카드, "**")를 파일 이름에 추가하세요. (자세한 내용은 "$(wildcard )" 함수를 참조하세요.
이는 대상을 그룹화하는 데 사용될 수 있습니다. 예를 들면 다음과 같습니다.

$(포니 테스트): $(only_phony_targets */**/tests)

출발지 변수
변수 이름이 주어지면 해당 값의 출처를 알려줍니다.

펄코드
메이크펄 펄코드
블록의 Perlcode를 평가하고 결과를 반환합니다. 첫 번째 변형은 일반 Perl입니다.
두 번째 변형은 먼저 Make 스타일 변수를 통해 Perlcode를 전달합니다.
확장.

모든 기능과 마찬가지로 사용된 기능 구분 기호는
작은따옴표 또는 큰따옴표 문자열 외부의 Perlcode. 하지만 다음과 같이 두 배로 늘릴 수 있습니다.
마지막 예:

VAR = 1
VAR1 = ${펄($VAR + 1) * 3}
VAR2 = $(perl do { $VAR *= 3; $VAR인 경우 $VAR + 1 } 반환)
VAR3 = $(makeperl $(VAR1) * 3 + $$VAR) # Make var 하나와 Perl var 하나
VAR = $((펄 if( ... ) { ... }))

위조품
단어 목록이 실제로 가짜 대상임을 나타내고 다음 목록을 반환합니다.
목표. 다음과 같이 사용하도록 되어 있습니다.

$(가짜 모두): my_program

$(포니 클린):
&rm -f *.o my_program

또한 다음과 같은 줄을 사용하여 하나 이상의 대상을 가짜로 선언할 수도 있습니다.
귀하의 메이크파일:

.PHONY: 모두 깨끗함

인쇄 본문
텍스트를 출력하고 반환합니다. 이는 디버깅에 주로 유용합니다.
변수 대체가 왜 그런 결과를 가져오는지 이해합니다. 예를 들어,

XYZ := $(프린트 $(patsubst %.c, %o, $(SOURCE_FILES)))

"patsubst" 호출의 결과를 인쇄합니다.

XYZ := $(patsubst %.c, %o, $(인쇄 $(SOURCE_FILES)))

"patsubst" 호출에 대한 마지막 인수를 인쇄합니다.

껍질 쉘 명령
개행 문자를 공백으로 대체하여 주어진 쉘 명령의 출력을 반환합니다.

모든 기능과 마찬가지로 사용된 기능 구분 기호는
작은따옴표 또는 큰따옴표 문자열 외부의 쉘 명령. 하지만 두 배로 늘릴 수는 있어요
두 번째 예에서와 같이:

date = $(shell date) # 더 나은: $(perl scalar localtime)
VAR = ${{쉘 f() { 에코 안녕하세요; }; 에프}}

xargs 명령,인수[,접미어[,길이]]
각각 지정된 문자로 시작하는 명령의 줄바꿈으로 구분된 목록을 반환합니다.
명령을 내리고, 넘어가지 않고 가능한 많은 목록 요소로 끝납니다.
길이 (기본값 1000) 문자.

이것의 목적은 시스템의 명령 길이 제한을 초과하는 것을 방지하는 것입니다.
예를 들어, 생성된 파일이 많으면 아마도 다음을 원할 것입니다.
깨끗한 대상("makeppclean"이 더 효율적이므로 가져서는 안 됨)
다음과 같이 보세요:

$(포니 클린):
$(xargs $(RM), $(only_targets **/*))

이는 목록이 다음과 같은 경우 어떤 명령도 생성되지 않는다는 부작용도 있습니다.
비어있는 일이 발생합니다. 하지만 이 경우 내장된 &rm을 사용하는 것이 더 좋습니다.
내장 명령에 대한 인수는 Perl의 메모리에 의해서만 제한되기 때문입니다.

$(포니 클린):
&rm -f $(only_targets **/*)

세 번째 인수가 지정되면 각 명령을 접미사하는 데 사용됩니다. 이것은
리디렉터를 지정하는 데 유용합니다. 예를 들어 (여기서 다시 &echo가 도움이 되지만):

명백한:
&rm -f $@
$@ 터치(&터치)
$(xargs 에코, $(only_nontargets **/*), >> $@)

이 문서 중 일부는 GNU make 문서를 기반으로 합니다.

makefile 초기화 중에 함수가 호출되는 경우, 예를 들어
내보내기 변수를 확장하면 오류 또는 경고 메시지가 줄 번호 0을 보고합니다.

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


무료 서버 및 워크스테이션

Windows 및 Linux 앱 다운로드

Linux 명령

Ad