.라는 이름의 많은 파일이 포함된 다양한 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
검색하세요 . 배포판에 따라 전체 설명서를 얻으려면 먼저 패키지(또는 유사한 이름)를 설치해야 할 수도 있습니다 .wildcard
patsubst
make-doc
make