2009-07-25 7 views
3

나는 cpp/h 파일들을 gcc가 정상적으로 처리하기 전에 - 기본적으로 여분의 전처리 단계로서 - 필터링하기 위해 펄 스크립트를 가지고있다. 이 작업을 수행하는 쉬운 방법이 있습니까? 나는 cpp 파일을 스크립트에 공급할 수 있고 gcc가 stdin에서 출력을 읽도록 할 수 있다는 것을 알지만 헤더 파일에는 도움이되지 않습니다.펄 스크립트를 통한 C++ 필터?

답변

7

이러한 프로세스를 처리하는 일반적인 방법은 소스 코드 (Perl 필터 입력)를 새로운 언어로 새 파일 접미어로 처리하는 것입니다. 그런 다음 make에게이 새 파일 유형에서 C++ 소스 파일을 컴파일하는 방법은 Perl 스크립트를 사용하는 것이라고 설명합니다. 예를 들어

:

  • 새로운 접미사 : (.cc 접미사를 가정) .ccp
  • 새로운 규칙 :

    .ccp.cc: 
         ${FILTERSCRIPT} $< 
    
  • 접미사 목록에 새 접미사를 추가 - 우선 순위가 이상 정상적인 C++ 규칙.

마지막 요령이 가장 까다 롭습니다. 목록에 .ccp 접미사를 추가하기 만하면 make.cc 파일이 존재할 때 .ccp 파일의 변경 사항에 실제로주의하지 않습니다. 중간 .cc 파일을 제거하거나 접미사 목록에 .cc 앞에 .ccp이 나타나는지 확인하십시오. (참고 : '.ccp.cc'규칙이없는 '.ccp.o'규칙을 작성하고 '.cc'중간을 정리하지 않았다면 컴파일 실패 후 다시 작성하면 make이 '.cc' 파일이므로 불편하고 혼란 스러울 수 있습니다.)

접미사를 변경할 수없는 경우 필터링을 수행하는 컴파일 스크립트를 작성하고 C++ 컴파일러를 직접 호출합니다.

2

C 및 C++ 전 처리기는 이런 종류의 지원을하지 않습니다. 이것을 처리하는 유일한 방법은 makefile (또는 무엇이든)이 컴파일러를 호출하기 전에 perl 스크립트를 통해 모든 파일을 처리하는 것입니다. 이것은 분명히 매우 어렵고 그러한 단계가 필요한 아키텍처를 설계하지 않은 이유 중 하나입니다. 그런 시설이 필요하다고 생각하는 이유는 무엇입니까? 아마 당신이 알지 못하는 더 나은 해결책이있을 것입니다.

+0

동의합니다. 저는 모든 종류의 소스 코드 전처리를 수행하는 복잡한 규칙을 가진 Makefile을 유지 관리했으며 실제로 그렇게 재미 있지는 않습니다. – JesperE

2

Perl 스크립트를 실행하고 gcc를 호출하는 gcc의 래퍼는 어떻습니까? plgcc와 비슷한 이름으로 makefile에 CC=plgcc을 설정하십시오. 스크립트가 include 지시문을 처리 할만큼 똑똑해야합니다. 스크립트가 include를 가져 오는 데 전처리기를 호출하지 않고, 해당 작업을 수행 한 다음 gcc를 호출하지 않는 한 스크립트는 똑똑해야합니다.

2

GCC를 사용하면 자신 만의 전 처리기를 사용할 수 있습니다. 스크립트를 전처리기로 설정 한 다음 cpp (일반 gcc 전 처리기)를 통해 출력을 실행할 수 있습니다. -B 및 -no-integrated-cpp 명령 행 옵션에 대한 gcc 매뉴얼을보십시오.

경고 - 나 자신을 시도한 적이 없으므로 얼마나 지저분할지 모르겠다. (C++을 비롯한 많은 언어가 ac 컴파일러의 사전 처리기로 구현되었지만 지원하지 말아야한다는 것을 명심해야한다. 너무 나쁘다).

+0

C++은 원래 전처리기로 구현 된 적이 없습니다. 원래 객체 코드 나 어셈블리 언어가 아닌 C를 방출하는 컴파일러로 구현되었습니다. –

+0

GCC 관련 옵션을 사용하면 코드가 다른 컴파일러에서 사용되는 것을 방지 할 수 있습니다. – JesperE

1

저는 과거와 같이 다음과 같이 처리했습니다.이 접근법은 처리되지 않은 소스 코드가 일종의 명명 체계 (이 경우에는 _pp으로 기본 이름 접미사)를 통해 구별 될 수 있다고 가정합니다.

# These are your source files to be preprocessed 
SRC_RAW = mysrc_pp.cpp 

# These are the source files after preprocessing 
SRC_PP = $(patsubst %_pp.cpp, %.cpp, $(SRC_RAW)) 

ALL_SRC = $(SRC) main.cpp other.cpp 

OBJ = $(patsubst %.cpp, %.o, $(ALL_SRC)) 

$(SRC): %.cpp: %_pp.cpp 
     $(PERL) $< > [email protected] 

$(OBJ): %.o: %.cpp 
     $(CXX) ... 

그러나 이것은 전처리가 필요한 헤더 파일이있는 경우를 처리하지 않습니다. 이 경우 해당 규칙을 만들 때 비슷한 규칙이 필요합니다.

+0

헤더 파일 문제가 여기에서 가장 중요한 문제라고 생각합니다. –

관련 문제