문제
makefile 조각에 다음과 같은 변수가 있다고 가정해 보겠습니다.
MY_LIST=a b c d
그러면 해당 목록의 순서를 어떻게 바꾸나요?나는 필요하다:
$(warning MY_LIST=${MY_LIST})
보여주기 위해
MY_LIST=d c b a
편집하다:진짜 문제는 그거다
ld -r some_object.o ${MY_LIST}
생산하다 a.out
정의되지 않은 기호가 있는 항목은 MY_LIST
실제로 아카이브이지만 순서가 잘못되었습니다.순서대로라면 MY_LIST
반대로 하면 올바르게 연결될 것입니다.링크 순서를 올바르게 지정하는 더 현명한 방법을 알고 있다면 제게 힌트를 주세요.
해결책
순수 GNU make의 솔루션:
기본:모두
foo = 제 말을 반대로 해주세요
reverse = $ (if $ (1), $ (Call Reverse, $ (WordList 2, $ (Words $ (1)), $ (1))) $ (FirstWord $ (1)).
모두 :@echo $(역방향 호출,$(foo))
다음을 제공합니다:
$만들다
난 반대로 해주세요
다른 팁
맙소사!방금 쉘 스크립트를 사용할 수도 있었습니다.
(for d in ${MY_LIST}; do echo $$d; done) | tac
ld를 사용하여 검색 그룹을 정의할 수도 있습니다.
ld -r foo.o -( a.a b.a c.a -)
그룹의 어떤 객체도 해결되지 않은 새로운 기호를 만족시킬 수 없을 때까지 a.a, b.a 및 c.a를 반복합니다.
gnu ld를 사용하는 경우 다음을 수행할 수도 있습니다.
ld -r -o foo.o --whole-archive bar.a
foo.o의 해결되지 않은 기호를 만족하는지 여부에 관계없이 bar.a의 모든 객체를 포함한다는 점에서 약간 더 강력합니다.
GNU make 솔루션 개선:
reverse = $(if $(wordlist 2,2,$(1)),$( call reverse,$(wordlist 2,$(words $(1)),$(1))) $(firstword $(1) ),$(1))
- 더 나은 중지 조건, 원본은 함수 호출을 낭비하는 빈 문자열을 사용합니다.
- 원본과 달리 반전된 목록에 선행 공백을 추가하지 않습니다.
둘 다 플레이 벤 콜린스' 그리고 엘마르코의 답변, 여기에 공백을 "적절하게" 처리하는 bash에 대한 펀트가 있습니다.1
reverse = $(shell printf "%s\n" $(strip $1) | tac)
덕분에 옳은 일을 하는군요 $(shell)
공백을 자동으로 청소하고 printf
인수 목록의 각 단어 형식을 자동으로 지정합니다.
$(info [ $(call reverse, one two three four ) ] )
수익률:
[ four three two one ]
1...내 제한된 테스트 사례에 따르면(예: $(info ...)
라인, 위).