[Q]Makefile에서 파일 이름에 따른 선택적인 실행을 할 때...

maestlo의 이미지

[Q]Makefile에서 파일 이름에 따른 선택적인 실행을 할 때...

안녕하십니까?

리눅스의 Makefile 관련 고수님들의 도움을 얻고자 아래 내용의 글을 등록합니다.


Makefile에서 파일 이름 비교해서 같으면 실행하고 틀리면 다른 것을 실행하게 할려고 합니다.

-----------------------------
ifeq($@, /usr/kkk)
mv -f $@.new.exe $@.exe
else
mv -f $@.new $@
endif
------------------------------

위에서 ifeq 부분이 자꾸 에러가 납니다.( Syntax erroe: word unexpected (expecting ")"))

위에서 ifeq 대신에

ifneq-TAB- "$@" "/usr/kkk"

이라고 해도 에러가 나는데...(ifneq not find)

/usr/kkk 은 "디렉토리 이름/파일이름"이고
$@는 파일 이름을 넣어두었던 변수입니다.

즉, /usr 디렉토리의 모든 파일중에 "/usr/kkk"와 같은
파일이 있으면 실행하고 그렇지 않으면 다른 것을 실행하는 루틴입니다.


실제 위의 루틴은
----------------------------------------------------
define do-install-program
$(make-target-directory)
$(INSTALL_PROGRAM) $< $@.new
mv -f $@.new $@
endef
----------------------------------------------------
와 같은 define의 do-install-program에 있는 부분을 제가 수정하였으며,
(
test.new.exe 파일은
"mv -f test.new.exe test.exe" 로 실행하고

나머지
fool.new 같은 파일은
"mv -f fool.new fool" 로만 실행토록
)


do-install-program부분은
----------------------------------------------------
so-versions := $(sort $(foreach so,$(install-lib.so),.so$($(so)-version)))
$(foreach v,$(so-versions),\
$(inst_slibdir)/lib$(libprefix)%$v): $(common-objpfx)lib%.so \
$(+force)
$(do-install-so)
$(foreach v,$(so-versions),\
$(inst_slibdir)/$(libprefix)%$v): $(common-objpfx)%.so $(+force)
$(do-install-so)
endif


ifdef install-bin
#echo $(install-bin)
$(addprefix $(inst_bindir)/,$(install-bin)): \
$(inst_bindir)/%: $(objpfx)% $(+force)
$(do-install-program)
endif
----------------------------------------------------
위의 ifdef install-bin 부분에서 사용되고 있습니다.

위 내용은 Makerules에 있으며 Makefile에서 Makerules를 include하고 있습니다.

위의 루틴을 어떻게 수정하여야 하는지 혹은 Makefile에서 특정 디렉토리의 특정 파일만
다르게 실행하고자 할때는 어떻게 하여야 할까요?

실제 코드 예를 들면서 설명해 주시면 감사드리겠습니다.

몇일 째 고생하고 있는데, 고수님들의 조언 부탁드립니다.

감사합니다.

codebank의 이미지

음... 재미있을것 같아서 비슷한 동작을 만들어봤는데 역시 비슷한 에러가
발생하더군요.
그래서...
조금 바꿨더니 에러가 사라지긴했는데 맞는답인지를 몰라서 제가한 방법을
써보겠습니다.
원래코드는

$(BIN3): $(OBJ3)
    ifeq ($(CXX), g++)
        @touch g++.txt
    else
        @touch gcc.txt
    endif

라고 했는데 Syntax에러를 내더군요.
그래서
$(BIN3): $(OBJ3)
ifeq ($(CXX), g++)
    @touch g++.txt
else
    @touch gcc.txt
endif

이렇게 첫라인부터 해보았더니 에러는 사라졌지만...
이게 직접적인 원인이 될 수 있을까 생각되긴해도 에러가 발생하지 않았으니
저게 맞는 답일지도 모르겠네요. :)

------------------------------
좋은 하루 되세요.

익명 사용자의 이미지

ifeq를 명령어란에 적어서 그런것으로 생각됩니다.
아직 ifeq를 명령어란에 적은걸 못봤네요..
혹시 보신분... :oops:

>이렇게 첫라인부터 해보았더니 에러는 사라졌지만
첫라인부터 적으면 명령어로 인식이 안되어서 인것같습니다.

우연히 검색중 나와서 답을 달아보는데 맞는지 확인부탁드립니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.