누군가가 (예를 들어 '표준'전처리 기와 같이) 문제를 해결하는 데 도움이 되었기 때문에 학문적 발췌문 이상의 autoconf (바람직하게 ac 또는 C++ 환경) 외에도 m4
의 사용법을 알고 있습니까? 해결하기가 어렵다.autoconf 외에 m4가 주목할만한 용도가 있습니까?
나는 스크립트, 선행 처리기, whitvers를 사용하여 중복을 줄이거 나 최소화하려는 C++ 프로젝트를 수행 할 방법을 생각하고 있으므로이 질문을드립니다.
누군가가 (예를 들어 '표준'전처리 기와 같이) 문제를 해결하는 데 도움이 되었기 때문에 학문적 발췌문 이상의 autoconf (바람직하게 ac 또는 C++ 환경) 외에도 m4
의 사용법을 알고 있습니까? 해결하기가 어렵다.autoconf 외에 m4가 주목할만한 용도가 있습니까?
나는 스크립트, 선행 처리기, whitvers를 사용하여 중복을 줄이거 나 최소화하려는 C++ 프로젝트를 수행 할 방법을 생각하고 있으므로이 질문을드립니다.
한 번 m4를 사용하여 간단한 버전 문자열 (MAJOR.MINOR.MICRO-STATUS)이 포함 된 텍스트 파일과 Windows Visual Studio 프로젝트의 Subversion 정보를 C++ 헤더 파일로 생성했습니다.
m4는이 특정 목표에 쉽게 포함하고 사용할 수있는 가장 작은 매크로 엔진이었습니다.
#ifndef __VERSION_H__
#define __VERSION_H__
divert(-1)
define(`CPP_DEFINE', `#define $1 $2')
define(`VERSION', include(`version.txt'))
define(`MY_SOFTWARE_MAJOR', regexp(VERSION, `\([0-9]+\)\.[0-9]+\.[0-9]+', `\1'))
define(`MY_SOFTWARE_MINOR', regexp(VERSION, `[0-9]+\.\([0-9]\)+\.[0-9]+', `\1'))
define(`MY_SOFTWARE_MICRO', regexp(VERSION, `[0-9]+\.[0-9]+\.\([0-9]\)+', `\1'))
define(`MY_SOFTWARE_STATUS', regexp(VERSION, `\(-\w+\)', `\1'))
define(`SVN_REV', `regexp(esyscmd(svnversion -n), `[0-9]+', `\&')')
ifelse(len(SVN_REV), 0, `define(`NO_SVN')')
divert
CPP_DEFINE(MY_SOFTWARE_VERSION, format(`"%s.%s.%s"', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO))
CPP_DEFINE(PRODUCT_VERSION, format(`"%s.%s.%s%s"', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO, MY_SOFTWARE_STATUS))
CPP_DEFINE(COPYRIGHT_NOTICE, `"Copyright (C) 2008 - Me"')
ifdef(`NO_SVN', `
CPP_DEFINE(ABOUT_VERSION, format(`"My Software Version %s.%s.%s%s"', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO, MY_SOFTWARE_STATUS))
CPP_DEFINE(FILE_VERSION, format(`"%s.%s.%s"', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO))
CPP_DEFINE(INFO_VERSION, format(``%s,%s,%s,0'', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO))
', `
CPP_DEFINE(ABOUT_VERSION, format(`"My Software Version %s.%s.%s.%s%s"', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO, SVN_REV, MY_SOFTWARE_STATUS))
CPP_DEFINE(FILE_VERSION, format(`"%s.%s.%s.%s"', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO, SVN_REV))
CPP_DEFINE(INFO_VERSION, format(``%s,%s,%s,%s'', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO, SVN_REV))
')
#endif /* __VERSION_H__ */
가 완벽하게 작동하지만, 이건 정말 내가 지금 바로 그 물건을 처리하기 위해 CMake의 내장 기능을 사용하여 선호 내 비주얼을 생성 주로하기 때문에, 반복하지 않았다 실험이었다
그것은이처럼 보였다 Studio 프로젝트 파일.나는 m4
을 사용했으며 그 능력에 감명을 받았으며, 이것은 C 프리 프로세서가 있어야하는 것입니다. 더 간단한 프로젝트 설명에서 GNU makefile을 생성하는 데 사용했습니다.
나는 그것을 한때 악의적 인 SQL 쿼리 조각을 생성하는 데 사용했습니다. 인쇄 된 쿼리는 거의 20 페이지 (대략 1200 라인)로 실행되었습니다. 나는 m4 없이는 할 수 없었을 것이라고 확신한다. 그리고 나는 다시는 그것을 할 필요가 없게되어서 고맙다.
IIRC을 (전에 삼십년에서), 쿼리는 원고의 보고서를 몰았다. 원고는 사건의 조합에 따라 분류되었습니다.
SQL 엔진이보기에서보기를 작성할 수없고 사용자 정의 함수를 지원하지 않았습니다. 등 파생 테이블, 부속 선택에 대한 일부 긴 표현 중 하나
어려운 부분은 프로그래밍이 아니 었습니다.
첫 번째 어려운 부분은 말하자면, 세 약간 다른 부속 선택이 바로 하나,의이었다 파악 또는 우리는 정말 세 다른 사람, 또는 우리가 정말 필요 여부 필요 여부 된 세 플러스 하나 또는 두 개의 기존 더. (나는 결국 대답이 "위의 모든 것"으로 밝혀 졌다고 생각한다.) 관련 보고서에는 동일한 하위 선택이 필요했다. m4 +는 그들이 동일하다는 것을 보장합니다.
두 번째 어려운 부분은 다양한 다양한 복잡한 원고 기록에 직면하여 쿼리가 올바르게 작동하고 있음을 보여주는 테스트 데이터를 작성하는 것이 었습니다. 조 셀로 (Joe Celko)는 보잉 사가 당시 사용하고 있던 상용 소프트웨어에 조종 해 주었다고 생각합니다. 사용자 정의 기준을 사용하여 모든 가능한 조합 또는 순열에 대해 테스트 장치 및 스텁을 생성했습니다.나는 그 이름을 기억하지 못한다.
공포! 단순한 필사자의 단어로 요약 될 수있는 질문이 무엇입니까? ;-) –
@underscore_d : 댓글에 없지만 답변을 확대했습니다. –
무슨 이야기인가! 내가 할 수 있다면 다시 +1 하겠어. 감사! 나는 미래에'm4'와'make'를 더 고려해야 할 것입니다; 나는 스프레드 시트 테이블과 수식을 사용하여 배치 파일, SQL 스크립트, C++의 반복적 인 단편 (자체 매크로가 청구서에 잘 맞지 않는 곳)을 생성하는 등 여러 가지 경우에 걸었다. 더 좋아. 그래도 IMO가 스프레드 시트를 사용하는 유일한 용도 중 하나입니다. –
Sendmail은 구성 파일을 생성하기위한 M4 기반 인프라를 제공합니다. 대부분의 sendmail 설치는 sendmail 구성의 권장 방법으로 이것을 제공합니다.
나는 M4를 사용하여 SQL 테이블을 정의하는 DDL 스크립트, 액세스하기위한 C++ 코드 및 헤더 및이를 테스트하는 드라이버를 자동으로 생성했습니다. 우리는 또한 스크립트를 업데이트하여 동시에 테이블을 백업하고 다시 채울 것으로 생각합니다. 그러나이 작업을 한 지 15 년이 넘었습니다.
GNU Bison은 내부적으로이를 사용하여 C 또는 C++ 파서 파일을 생성합니다.
파일에서 토큰을 바꾸고 다른 대상 플랫폼에 맞는 패키지 파일을 생성하는 데 cpp와 m4를 모두 사용했습니다. 이제 루비 엘브를 사용하여 이것을 할 것입니다. 태양에서 나는 헤더 파일을 전처리하기 위해 m4를 사용했다.
m4를 사용하여 구조체 선언 목록을 포함하는 C/C++ 파일을 생성했다. 구조체가 얼마나 추악한 지에 따라, 올바르게 작성하면 m4 파일은 C/C++ 파일보다 읽고 편집하기가 더 쉬울 수 있습니다.
GTK + 용 공식 C++ 바인딩 라이브러리 인 gtkmm (최신 C++을 통해 GTK + GUI에 액세스하여 GTK + GUI에 액세스 할 수있는 탁월한 프로젝트)는 코드를 쉽게 생성 할 수있는 도구 모음의 일부로 m4
을 사용합니다.
(나는 어떤 G * 프로젝트와도 제휴 관계가 없다. 나는 gtkmm
을 많이 좋아하고, 분명히 할 수있는 것처럼 잘 알려지지 않았다고 느낀다. 특히, 확실한 대안 대신 대다수는 m4
이었다. K & R이 문제를 연구 할 때까지!)
sendmail 구성 파일에 사용 된 적이 있습니다. 아마도 M4와 sendmail 모두에 대한 논쟁 일 것입니다. –