Makefile 쉘은 sed 정규 표현식 줄 끝을 무시합니다.

Makefile 쉘은 sed 정규 표현식 줄 끝을 무시합니다.

*.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'.

탈출을 시도했는데 결과는 다음 $과 같습니다.\$

`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검색 wildcard및 기능을 참조하세요 . 배포판에 따라 전체 문서를 얻으려면 먼저 패키지(또는 이와 유사한 것)를 patsubst설치해야 할 수도 있습니다 .make-docmake

관련 정보