[완료]GNU make에서 argument값 얻기

solikang의 이미지

안녕하세요.

makefile을 만들어서 GNU make을 쓰려고 하는데 궁금한 점이 있어서 질문을 드립니다. 크게 두가진데 하나는 명령창의 arguments와 관련된 것이고, 나머지는 문자열 처리하는 것입니다.

1. 보통 C-console 프로그램을 만들때 command 입력시 arguments를 추가해서 입력했을때, 프로그램 내부에서 그 arguments를 받아서 연산을 한다던가 하는데, makefile에서도 그런식으로 할수 있는지 궁금합니다. 예를 들어, 명령창에 "make aaa"이라고 입력했을 때, 'aaa'라는 값을 받아올 수 있습니까? 그 값을 ifeq같은걸로 비교하고 싶어서 그렇습니다.

2. 특정 target에서 문자열 수정하는 방법이 알고 싶습니다. 예를 들어, 특정 target일때만 debug정보를 추가해서 build하고 싶어서 그때만 "CPPFLAGS += -g" 이런식의 처리를 하고 싶어서요. 명령어를 어떤식으로 써야 할지 모르겠습니다. manual같은데서 보면 override뭐 이런 함수를 쓰면 된다고해서 $(override $(CPPFLAGS) += -g) 이런식으로해도 차이가 없네요.

cinsk의 이미지

$ make TARGET... VAR=VALUE...

꼴로 실행합니다. 예를 들어 변수 CFLAGS의 값을 바꾸고 싶다면 다음과 같이 호출 하면 됩니다.

$ make CFLAGS='-Wall -O3'       # default target
$ make all CFLAGS='-Wall -O3'   # target="all"

사용자가 command-line에서 변경한 변수의 값을 내부에서 바꾸고 싶다면, override directive를 쓰면 됩니다. 예를 들어 무조건 '-g'를 추가하고 싶다면:

override CFLAGS += -g

라고 하면 되겠죠. 빼고 싶다면 $(subst ...) 함수를 쓰면 될 것 같군요.


--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

solikang의 이미지

우선 답변해주셔서 감사드립니다. 답변에 대한 추가 질문을 좀 드리겠습니다.

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

사용자가 command-line에서 변경한 변수의 값을 내부에서 바꾸고 싶다면, override directive를 쓰면 됩니다. 예를 들어 무조건 '-g'를 추가하고 싶다면:

override CFLAGS += -g

라고 하면 되겠죠. 빼고 싶다면 $(subst ...) 함수를 쓰면 될 것 같군요.
---------------------------------------------------------------

이부분에서 override로 처리가 가능하다고 하셨는데, 특정 target안에서 사용하려고 하니 override가 command가 아니라고 error가 납니다. 예를 들어 아래와 같은 상황입니다.

dbug :
(tab) @echo $(CPPFLAGS)
(tab) override $(CPPFLAGS) += -g
(tab) @echo $(CPPFLAGS)
(tab) make

여기서 dbug target안에서 CPPFLAGS값을 바꾸기 위해 override를 사용하다보니 command로 인식을 해버리는 것 같습니다. 그렇다고 앞의 tab을 뺄수도 없는 노릇이구요.
$(override $(CPPFLAGS) += -g) 이런식으로 표시하면 변수값이 바뀌지도 않고 그냥 지나가버립니다.

solikang의 이미지

dbug :
(tab) make all CPPFLAGS="$(CPPFLAGS) -g"

이런 방식으로 원하는 건 처리했습니다.

다만, 위에 질문드렸던 것처럼 저런 상황에서 override 같은걸 어떻게 쓰는지는 궁금합니다. 혹시 아시는 분 계시면 답글 부탁드립니다.

cinsk의 이미지

override는 지시어이기 때문에 rule을 지정하는 곳, 즉 command를 쓸 곳에 쓰는 것이 아닙니다. rule 지정 밖에서 해 보세요.

override CPPFLAGS += -g
 
dbug:
<TAB>gcc -c $(CPPFLAGS) ...

--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

krisna의 이미지

MAKECMDGOALS 라는 변수가 있습니다.

아래와 같은 코드를 추가할 수 있겠습니다.

ifeq ($(MAKECMDGOALS),dbug)
CXXFLAGS += -g
endif

자세한 내용은 아래를 참조하세요.

http://www.gnu.org/software/make/manual/make.html#Goals

solikang의 이미지

감사합니다

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.