2017-11-17 13 views
1

배경

저는 현재 리팩토링 중입니다. 문제 중 하나는 포함 제품에서 사용되는 일반적인 경로에 대한 문자열 리터럴 (300 개 + 인스턴스)의 대규모 남용 사방에 (즉, /opt/dev에 대한 참조 및이 위치의 하위 경로)입니다 :큰 C/C++ 프로젝트의 컴파일시 GNU m4를 사용하십시오.

  • C/C++ 소스 및 헤더 파일.
  • python 스크립트.
  • bash 스크립트.
  • systemd 스크립트.
  • 바이너리 이미지 (드라이버).

목표

우리의 코드가 분기되는 경우, 그래서 우리는 "한 번 쓰기 어디서나 사용"할 수 있습니다 나는 일반적인 매크로의 집합을 가진 파일을 정의하기 위해 GNU 을 사용하고 싶습니다

(일반적으로 신제품의 경우) 중복 된 문자열 리터럴을 찾아 며칠 동안 디버깅하는 대신 해당 파일의 매크로를 변경할 수 있습니다. 이것은 빌드 출력 경로에 소스 트리 복사본을 만들고 스크립트에서 직접 M4를 실행하기 때문에 스크립트와 같은 간단한 작업을 처리하기에 충분합니다.


문제

지금까지 유일한 단점은 나는 단지 컴파일 시간에 M4 매크로 확장/대체를 실행하려는 때문에이, C/C++ 프로젝트에 대한 엄청난 노력이 될 것처럼 보이는 것입니다. 즉, git에서 체크 아웃 한 소스 파일을 수정하지 않으려면 빌드 스크립트 (많은 Makefile)를 수정하여 원래 소스 파일 자체가 아닌 임시 코드 복사본을 만들어야합니다. 그렇지 않으면 버전 제어 소스에서 직접 M4을 실행하면 로컬 작업 복사본이 변경되고 개발자는이 M4 평가 코드 복사본을 버전 제어에 커밋하여 M4 노력을 깨뜨릴 수 있습니다.


질문

가 일부 외부 도구 또는 GCC 자체의 일부 기능을 통해 중, 이 컴파일시 매크로/확장을 평가하도록 지시 할 수 있습니까? 그렇지 않다면, 내 빌드 스크립트는 M4 매크로를 지원하기 위해 대규모 점검이 필요할 것입니다.

+3

C 및/또는 C++ 코드의'project-config.h' 헤더를 생성하려면'm4 '를 사용하십시오. 매크로 중 하나를 사용해야하는 모든 파일에서 해당 헤더를 사용하십시오. 프로그래머가 사용해야하는 것을 알고 있는지 확인하십시오. 체크인 전 또는 정기적으로 코드 검사를 시행 할 가능성이 있습니까? 해당 헤더가 변경되면 다시 컴파일하십시오. 불필요하게 변경하지 마십시오. –

+0

@JonathanLeffler 한숨 쉬우면서 우아하고 단순합니다. 어떻게 내가 이것을 간과하는지 모르겠다. 이것을 당신이 대답으로 바꾸면 받아 들일 것입니다. – DevNull

답변

3

m4을 사용하여 C 및/또는 C++ 코드의 헤더를 으로 생성하십시오. 매크로 중 하나를 사용해야하는 모든 파일에서 해당 헤더를 사용하십시오. 프로그래머가 사용해야하는 것을 알고 있는지 확인하십시오. 체크인 전에 코드 검사를 사용하거나 코드베이스를 주기적으로 검사 할 가능성이 있습니까? 해당 헤더가 변경되면 영향을받는 파일을 다시 컴파일하십시오. 불필요하게 변경하지 마십시오.

+0

M4가 스트림 편집기 (즉,sed + grep의 "fancy"버전처럼) 파일 생성 도구가 아닙니다. 틀린 정신 모델. – DevNull

+1

쉽게 실수 할 수 있습니다. AutoConf 시스템은'm4'를 사용하고 설정 파일을 생성합니다. 이것은 느슨하게 유사합니다. –