여기서는 중요하지 않은 이유로 파일별로 자동으로 처리하고 처리된 소스 파일의 이름을 체계적으로 바꾸는 소스 코드가 있습니다. 예를 들어, 다음과 같은 파일로 시작합니다.
fun1.c fun2.c
그리고 드디어 파일을 받아
fun1_a.c fun2_a.c
또한 Makefile이 자동으로 조정되기를 원합니다. Makefile의 기본 버전은 다음과 같습니다.
SRC= fun1.c fun2.c
%.o: $.c
$(CC) $(CFLAGS) -c $< -o $@
OBJ= $(SRC:.c=.o)
fun2.o: fun1.o
소스 파일과 종속성 정의의 모든 항목이 필요에 따라 변경되지만 패턴 규칙은 동일하게 유지되도록 파일을 가장 잘 처리하려면 어떻게 해야 합니까? 즉, 나에게 필요한 것은 다음과 같습니다.
SRC= fun1_a.c fun2_a.c
%.o: $.c
$(CC) $(CFLAGS) -c $< -o $@
OBJ= $(SRC:.c=.o)
fun2_a.o: fun1_a.o
나는 그것이 사소하다고 생각하지만 내 스크립팅 능력은 특히 sed
제한적 perl
입니다.
편집하다:실제로 모든 파일이 정수로 호출되는 것은 아니므 funx.c
로 x
모든 파일 이름에 대해 작동하는 솔루션을 찾고 있습니다.
답변1
전체 소스 트리의 복사본을 만든 다음 이름을 바꾸지 않고 복사 디렉터리에 있는 파일을 수정하는 것이 좋습니다. 이렇게 하면 makefile을 수정할 필요가 없습니다. 보너스로, 카탈로그를 비교하는 것만으로도 변경 사항에 대한 개요를 얻을 수 있습니다.
이것 대신에
project
fun1.c
fun1_mod.c
fun2.c
fun2_mod.c
Makefile
Makefile_mod
당신은 이것을 가지고 있습니다
project
fun1.c
fun2.c
Makefile
project_mod
fun1.c
fun2.c
Makefile
정교한
예제처럼 makefile이 매우 간단한 경우 sed를 사용하여 makefile의 파일 이름을 수정할 수 있습니다. 그러나 makefile은 신비한 짐승입니다. 다수의 암시적 규칙과 다단계 변수 확장이 특징입니다.
간단한 메이크파일에서도 파일 이름을 수정하는 것이 일반적입니다. 메이크파일에도 파일 이름이 일부 수정되었습니다( OBJ= $(SRC:.c=.o)
). 이것할 수 있는sed를 사용하여 무언가를 변경하면 예상치 못한 결과를 얻을 수 있습니다.
이와 같은 일반적인 와일드카드를 사용하면 *.c
예상보다 더 많은 파일을 수집하게 되기 쉽습니다 . 접미사를 제외하거나 포함하기 위해 와일드카드를 작성하는 것은 고양이를 모으는 것과 같습니다.
원본 소스 파일과 수정된 소스 파일이 동일한 디렉터리에 있는 경우 원본 소스 파일이 수정된 makefile에 의해 실수로 컴파일되었는지 또는 그 반대인지 확신할 수 없습니다.
그리고 제 느낌에는 단 한 번의 수정만으로는 충분하지 않을 것 같습니다. 당신은 많은 것을 가질 것입니다. 그래서 그것은 단지 fun1_mod.c
" fun2_mod.c
그러나" _mod1
_mod2
_mod3
_mod3butpartmod1
등이 아닙니다 .
어떤 모드셋에서 어떤 바이너리가 컴파일되었는지 알아내느라 영원히 골치 아픈 일을 겪게 될 것입니다.
따라서 각 수정마다 전체 소스 코드 트리의 복사본이 생성됩니다. 각 디렉터리의 소스 코드를 수정합니다. 파일 이름을 동일하게 유지하십시오. makefile을 동일하게 유지하십시오.
이렇게 하면 디렉토리로 이동하여 컴파일할 수 있습니다. 다른 디렉토리로 이동하여 컴파일하십시오. 항상 동일한 메이크파일입니다. 그리고 항상 어떤 파일을 컴파일할지 결정하세요. (메이크파일이 상위 및 형제 디렉토리에서 소스 파일을 가져오지 않는 한 이는 일반적인 관행이 아니며 메이크파일 커뮤니티에서는 눈살을 찌푸리게 합니다.)
보너스:
즐겨 사용하는 디렉토리 비교 도구를 사용하면 하나의 모드 세트와 다른 모드 세트의 차이점을 쉽게 확인할 수 있습니다.
git과 같은 소스 제어에서 수정 사항을 유지할 수 있습니다. 모듈당 하나의 분기. 마스터 브랜치에서 변경 사항을 적용하고 이를 다른 브랜치에 전파할 수 있습니다. 주변의 변형을 선택하고 선택할 수 있습니다. 동료를 밀고 당길 수 있습니다.
답변2
원본 파일 이름이 정적이라고 가정하면 이름 바꾸기 작업의 결과만 예측할 수 없습니다. 파일 이름을 바꾸면 원래 파일 이름과 새 이름의 매핑이 포함된 추가 파일이 생성됩니다. 예:
fun1.c=fun1_a.c
fun2.c=fun2_a.c
생성된 매핑 파일의 이름이 이라고 가정하면 다음과 같은 방법으로 수정할 rename.mk
수 있습니다 .Makefile
include rename.mk
SRC= $(fun1.c) $(fun2.c)
%.o: $.c
$(CC) $(CFLAGS) -c $< -o $@
OBJ= $(SRC:.c=.o)
$(fun2.c:.c=.o): $(fun1.c:.c=.o)
파일명은 변수명이 되어 를 통해 사용됩니다 rename.mk
.