make 변수에서 문자열 순서를 바꾸는 가장 간단한 방법

StackOverflow https://stackoverflow.com/questions/52674

  •  09-06-2019
  •  | 
  •  

문제

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 ...) 라인, 위).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top