GNU Make 파일에는 어떤 쉘을 사용해야 합니까?

GNU Make 파일에는 어떤 쉘을 사용해야 합니까?

나는 makefile 규칙에서 echo, mv, , if와 같은 것을 보았습니다. for일종의 쉘 명령이 인식되는 것 같습니다. 이게 카니발인가요? 어떤 셸이 사용되고 있는지와 사용 가능한 키워드의 전체 목록을 어떻게 알 수 있나요?

답변1

그것은sh:

그런 다음 실행 라인은 인수로 전달된 것처럼 쉘에 의해 실행됩니다.체계()상호 작용

system()sh다음 키워드를 사용할 수 있습니다 .POSIX 쉘 명령 언어, 호스트 플랫폼에서 사용할 수 있기를 원하는 키워드가 아닌 명령.

sh실제로는 시스템의 다른 셸(예 bash: )에 대한 또 다른 이름일 수 있으며, 이 경우 더 많은 옵션을 사용할 수 있습니다. 그러나 이 makefile은 이식 가능하지 않습니다.

GNU make에 대해 구체적으로 질문할 때 나는 또한 GNU make를 통해 다음을 수행할 수 있다는 점을 언급했습니다.다른 쉘 지정makefile에서 사용되지만, makefile은 makePOSIX 규정에 따라 sh기본적으로 사용됩니다.

답변2

여러분도 꼭 살펴보세요PolyGlot 생성 파일, 특정 makefile 대상에 대한 쉘 선택에 대한 간략한 설명입니다.

여기서 bash라는 대상에 대해 bash가 선택되었습니다.

.ONESHELL:
bash: SHELL := bash
bash:
    # note: the double dollar-sign is required because Make substitues $variables
    export greeting="¡hola"
    echo "$${greeting}, bash!"

이것은 단지 자랑하기 위한 것입니다:

.ONESHELL:
python: SHELL := python3
python:
    greeting = "hello"
    print(f"{greeting}, python!")

그런 make python다음 "Hello, python!"을 인쇄합니다.

답변3

@Michael(+1)이 모든 것을 말했고 세부 사항에 대한 지침을 제공했습니다. 그럼에도 불구하고, 나는 두 가지 세부 사항을 강조하고 싶습니다(수정해 주십시오):

  1. 액션을 생성하려면 "sh"를 사용하세요

  2. gnumake에 유용하다면 쉘을 재정의할 수 있습니다.

    쉘 = 배쉬

그리고 bash 트릭을 사용하십시오.

  1. (UNIX 기반 환경에서) -- mvecho명령(모든 쉘에서 사용할 수 있음) if이며 forsh/bash 종속성입니다.

  2. 쉘은 인용(그리고 glob 및 var 확장...)과 관련하여 다른 동작을 가지며 make몇 가지 특별한 동작도 있습니다.

  3. Windows 등에서는 gnumake 명령과 함께 일종의 Unix 생존 도구 키트(sh/bash, 일부 필터, fileutils 및 일반적으로 make 작업에 사용되는 명령)를 설치하는 것이 유용할 수 있습니다.

관련 정보