카테고리 없음

[makefile] 메이크 파일 디렉토리 가져 오기

행복을전해요 2021. 1. 5. 10:27

I remember I had the exact same problem. It's not possible, as far as I remember. The best bet you can have is to pass it as a variable. That is both cross platform and guaranteed to work, as you know the makefile dir at invoke time (otherwise you can't invoke it).

대안으로, 당신은 현재 경로 (gnu make에서 $ (CURDIR)로 얻을 수 있음)를 makefile의 호출 경로 (어려울 수 있고 당신의 만들기)

-------------------

'cygwin'과 'linux'의 경우 makefile의 규칙에서 직접 pwd를 호출하여이 문제를 해결했습니다.

do.%: %.cpp
  echo "Running command in " `pwd`
    somecommand $^
    
-------------------

$ (srcdir) 사용할 수 있습니다.

그런 다음 ./configure --srcdir = "/ your / path / to / the / source / directory"

-------------------

다음은 완전히 쉘에 구애받지 않는 Makefile의 디렉토리를 가져 오는 크로스 플랫폼 방법입니다.

makeFileDir := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))

이것은 현재 해석되고 있는 Makefile 의 디렉토리를 제공합니다 . 다른 문장을 사용하여 Malefile을 포함 시키면 나쁜 (또는 좋은!) 놀라움이있을 수 있습니다.

Windows 용 make의 최근 구현, 즉 Chocolatey 를 사용하는 경우 충분합니다 .

Windows 용 이전 make 관련 문제

Windows에서 사용하는 make 버전에 따라 백 슬래시 처리에 불일치가있을 수 있습니다. 다음 변형 중 하나가 필요할 수 있습니다. 예를 들어 GnuWin의 make 3.81 바이너리의 경우입니다 .

  • 경로 구분 기호를 일관성있게 만드십시오 . 사용 아래의 문은 슬래시에게 단지, 단지 스왑 전달 \하고 /반대 동작을 얻을 수 있습니다. 내 경험에 비추어 볼 때 (GnuWin의 make 사용) make include문에 이러한 변수 를 사용하거나에서 사용하려면 슬래시를 사용해야 할 수 있습니다 VPATH. 그러나 물론 DOS 셸에서 백 슬래시가 필요하므로 레시피에서 ... 두 가지 버전의 변수가 필요할 수 있지만 적어도 대체는 경로 구분자가 일관성이 있는지 확인합니다!
makeFileDir := $(subst \,/,$(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
  • abspathGnuWin make 3.81 기능이 손상되어 드라이브 문자가있는 경로를 처리하지 않습니다. 다음은 Windows 절대 경로 (드라이브 문자 포함)도 처리하는 해결 방법입니다. 그런 다음이를 사용하여 Makefile의 디렉토리를 가져올 수 있습니다 (여기서는 경로 구분 기호도 대체 됨). 자세한 내용은 설명하지 않겠지 만, 해결 방법은 이미 Windows 절대 경로 인 경우 (예 : 경로 :의 루트에있는 경우) 인수를 반환하고 abspath그렇지 않은 경우 기본 기능을 사용합니다 .
define fixabspath
$(if $(findstring :,$(firstword $(subst /, ,$(subst \,/,$(1))))),$\$
$(1),$\
$(abspath $(1)))

makeFileDir := $(subst \,/,$(dir $(call fixabspath,$(lastword $(MAKEFILE_LIST)))))

비고

  • 여기서 생략하고있는 소스가있을 수 있으며 죄송합니다. 오래 전 일입니다.
  • 에서 fixabspath정의, $\읽기 쉽도록 라인을 분할 바로 여기에 있습니다.
  • MAKEFILE_LIST변수는 해석되는 메이크 파일의 목록, 현재의 인 마지막이 포함되어 있습니다. 해당 매뉴얼 페이지를 참조하십시오 .
  • 올바르게 기억하면 macOS의 기본 make에서도 작동합니다.


출처
https://stackoverflow.com/questions/2004779