sed 정규 표현식 줄 끝을 무시하는 Makefile 쉘

sed 정규 표현식 줄 끝을 무시하는 Makefile 쉘

.라는 이름의 많은 파일이 포함된 다양한 C 코드 테스트용 폴더가 있습니다 *.c. 내 목표는 Makefile에서 다음으로 끝나는 파일 이름을 검색 .c하고 해당 파일 이름의 루트를 대상에 추가하는 것입니다.

Makefile:

TARGETS = $(shell ls *.c | sed "s/\.c$//g")
all: $(TARGETS)

문제는 쉘 명령이 sh에서 예상대로 작동한다는 것입니다.

$ sh -c 'ls *.c | sed "s/\.c$//g"'
hello

...다음과 같이 실패하는 동안 make:

$ make
sed: 1: "s/\.c/g": unterminated substitute in regular expression
make: Nothing to be done for `all'.

나는 $as 를 탈출하려고 시도했는데 \$대신 다음과 같은 결과가 나왔습니다.

`sed: 1: "s/\.c\/g": unterminated substitute pattern`

"큰따옴표( )를 작은따옴표( )로 바꾸는 경우에도 마찬가지입니다 '.

답변1

을 탈출해야 합니다 $. 에서는 make를 사용하여 이를 수행합니다 $$. 귀하의 라인은 다음과 같아야합니다 :

TARGETS = $(shell ls *.c | sed "s/\.c$$//g")

이것이 질문에 직접 답변하지만 @cas의 솔루션이 더 나은 것 같습니다.

답변2

GNU Make를 사용하는 경우:

objects := $(patsubst %.c,%.o,$(wildcard *.c))

all : $(objects)

자세한 내용은 info make또는 을 참조 하고 및 기능을 pinfo make검색하세요 . 배포판에 따라 전체 설명서를 얻으려면 먼저 패키지(또는 유사한 이름)를 설치해야 할 수도 있습니다 .wildcardpatsubstmake-docmake

관련 정보