makefile 만들 때 동일한 이름의 소스코드가 여러곳에 존재하는 경우 우선순위 정하기

sangjun11316의 이미지

개인적으로 수치해석 코드를 하나 만들고 있습니다 (fortran 90 기반)

코드 구조야 다른 코드들이 다 그러하듯 공통적으로 쓰일 파일들은 Src 디랙토리 아래에 넣어놓고, 초기값을 주거나 경계조건을 주는 등 문제 고유의 성격을 정해주는 .f90 파일이나 .data 파일은 각각 문제 이름에 해당하는 디랙토리르 따로 생성하여 거기 넣어주는 식으로 정리했습니다.

예를들어, main.f90 이라는 파일은 공통으로 필요하여 Src 디랙토리에,
어떤 물리 문제를 정의하는 initial.f90 파일은 Problem1 디랙토리에 넣어놓고 Problem1 디랙토리에서 make를 하면 Src의 main.f90를 불러와서 initial.f90 와 함께 컴파일 시키는 것이죠.

여기까지야 매우 쉬운데요,

어떤 문제의 특성에 의해 main.f90를 조금 손봐야 할 경우 Src 디랙토리에 있는 main.f90를 Problem1 디랙토리에 복사해서 거기서 수정을 하는 식으로 (Src의 원본은 보존한 채로) 처리를 할 수 있게 하고 싶습니다.

그렇게 하려면
1. 필요한 파일들의 목록들을 Makefile 이 모두 알고있어야 하고
2. 현재 디렉토리에서 목록들에서 해당하는 파일들을 찾은 다음
3. 나머지를 Src에서 찾는

식으로 구성해서 main.f90 가 필요하다는걸 알고, 현재 디랙토리인 Problem1 에 main.f90 이 있을 경우 Src의 main.f90는 무시하게 만들어야 하는데, 워낙 아는게 적어 쉽지가 않네요 ㅠㅠ 혹시 조언해주실 분이 있을까 싶어 질문올렸습니다.

현재는 위와 같은 경우 Makefile을 그 때 그 때 수정하면서 주먹구구식으로 하고 있습니다.

----(Src 의 main.f90를 쓸 경우의 Problem1 디랙토리에 있는 Makefile)-----

...

SOURCE = \
initial.f90 \
../Src/main.f90 \

...

-----(Problem1 디랙토리에서 main.f90 를 수정한 경우) ------

...

SOURCE = \
initial.f90 \
main.f90 \

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

사실 필요한 파일이 엄청 많은 것도 아니고, 그 때 그 때 Makefile 수정하는게 그렇게 번거롭지도 않지만, 뭔가 자동적으로 하게 만들 수 있을 것 같은데 잘 안되니까 오기로 자동화시키고 싶은 욕구가 커져서 질문드립니다..ㅋㅋ

ktd2004의 이미지

cmake를 한번 사용해 보시면 어떨까요?
아마 신세계를 경험하시지 않을까 싶습니다.

익명 사용자의 이미지

Makefile을 가지고 온갖 삽질을 하면 생각보다 많은 일을 할 수 있긴 하지만, 공학적인 가치가 있는지 모르겠습니다.

한번 짜놓고 다시는 안 고치고 쓰기만 할 거라면 모르겠지만요.

이런 non-trivial한 작업을 할 때에는 다른 툴을 알아보는 게 도움이 되지요. 물론 진입장벽이 Make보다 다소 높다는 점은 부정할 수 없습니다.

파이썬이 익숙하시다면 scons도 알아보세요

https://scons.org/

Anti-Lock의 이미지

$ find ..
..
../common
../common/main.c
../src
../src/init.c
../src/Makefile
 
$ cat Makefile
 
vpath % ../common
 
all: init
 
init: init.o main.o
 
 
$ make -n
cc    -c -o init.o init.c
cc    -c -o main.o ../common/main.c
cc   init.o main.o   -o init
 
$ touch main.c
 
$ make -n
cc    -c -o init.o init.c
cc    -c -o main.o main.c
cc   init.o main.o   -o init

VPATH 또는 vpath 를 사용하면 될거 같습니다만...
복잡한 내용은 저도 잘 모릅니다. 이럴땐 메뉴얼을 봐야죠...

https://www.gnu.org/software/make/manual/make.html#Selective-Search

댓글 달기

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