μ°λ¦¬κ° νλ‘ νΈμλ κ°λ°μ΄λ λ°±μλ κ°λ°μ ν λ, λΉλ λꡬλ₯Ό μ¬μ©νμ¬ κ°λ°μ νκ³€ νλ€.
μ΄λ° λΉλ λꡬ λλΆμ μ½κ² μμ‘΄μ±μ κ΄λ¦¬νκ³ λΉλλ₯Ό ν μ μλλ°, C μΈμ΄λ μ΄λ¬ν λΉλ λꡬλ₯Ό μ¬μ©ν μ μλ€.
κ·Έ λΉλ λκ΅¬κ° λ°λ‘ make μ΄λ€.
λΉλ λꡬ, make
make λ Linuxμ κ°μ μ λμ€ κ³μ΄ μ΄μ체μ μμ μ¬μ©λλ λΉλ λꡬ(Build Tool) μ΄λ€.
λΉλ λꡬλ κ°λ¨ν μ€λͺ νμλ©΄,
μμ€ μ½λλ₯Ό μ»΄νμΌ ν μ€νΈ, μ μ λΆμμ μν΄ μ€ν κ°λ₯ν μ ν리μΌμ΄μ μΌλ‘ μλ μμ±ν΄μ£Όλ νλ‘κ·Έλ¨, μΌμ’ μ μννΈμ¨μ΄λ₯Ό μλ―Ένλ€.
λνμ μΈ λΉλ λꡬλ‘λ Ant λ Maven, Gradle, NPM μ΄ μ‘΄μ¬νλ€.
μ΄λ° λΉλ λꡬλ₯Ό μ¬μ©νλ€λ©΄ μ¬λ¬ νμΌλ€λΌλ¦¬μ μμ‘΄μ±κ³Ό κ° νμΌμ νμν λͺ λ Ήμ μ μν΄μ μ½κ² μ»΄νμΌμ΄ κ°λ₯ν΄ μ§λ€.
μ°λ¦¬λ make λ₯Ό μ΄μ©ν΄μ 리λ μ€μμ μ½κ² μ ν리μΌμ΄μ μ λ§λ€ μ μλ€.
make μμλ λΉλλ₯Ό νκΈ° μν΄μ make κ΅¬μ‘°λ‘ μ§μ¬μ§ νμΌμ makeκ° ν΄μνλλ‘ λ§λ€λ©΄ λλλ°, κ·Έ λνμ μΈ κ²μ΄ λ°λ‘ Makefile μ΄λ€.
Makefile μ΄λ?
Makefile μ make λ₯Ό μ€νν΄μ λΉλνκΈ° μ μ μ»΄νμΌ κ·μΉ λ° λ§ν¬ κ·μΉμ λ§λλ λͺ μΈ νμΌ μ΄λ€.
npm μ application.json
μ΄λ gradle μ build.gradle
κ³Ό κ°μ΄ make λ μμ κ³ μ ν λΉλ λ¬Έλ² μ΄ μ‘΄μ¬νλ€.
make λ μ΄λ¬ν μ λͺ λ Ήμ 쑰건μ λ°λΌ κΈ°μ λ Makefile μ λΆμνκ³ μ€ννλ μν μ μννλ€.
Makefile μ λ¬Έλ²
Makefile μ λ€μν λΉλλ₯Ό μν΄ μ¬λ¬ λ¬Έλ²μ μ 곡νλλ°, κ°μ₯ λνμ μΈ λ¬Έλ²μΌλ‘λ λ€μκ³Ό κ°μ 3κ°μ§κ° μλ€.
TARGET []: PREREQUISITES []
RECIPE
[]
- TARGET
- μ€ν κ°λ₯ν νκ² νμΌ, object νμΌ
- PREREQUISITES
- TARGET μ λ§λ€ λ νμν μμ‘΄ κ΄κ³λ₯Ό λͺ μνλ€
- RECIPE
- TARGET μ λ§λ€κΈ° μν μ€ν νμΌ λ° λͺ λ Ήμ΄λ₯Ό λͺ μνλ€.
- νμΌλ‘ ꡬλΆνκ³ μ€νμ΄μ€λ₯Ό λ£μΌλ©΄ λμνμ§ μλλ€.
- μ£Όλ‘ ccλ 리λ μ€ λͺ λ Ήμ΄λ₯Ό μ¬μ©νλ€
make λ‘ Makefile μ λͺ μλ c μμ€ λΉλνκΈ°
ν΄λΉ μ€μ΅μ λ°λΌνκΈ° μν΄μλ μ»΄νμΌ(Compile) κ³Ό λ§νΉ(Linking) μ λν μ΄ν΄κ° μμ΄μΌ ν©λλ€. ν΄λΉ λΈλ‘κ·Έμ gcc λ‘ c μΈμ΄λ‘ μμ±λ μμ€ μ½λ μ»΄νμΌνκΈ° λ₯Ό μ°Έκ³ νμΈμ!
λ€μκ³Ό κ°μ νμΌμ΄ μ‘΄μ¬νλ€κ³ κ°μ ν΄λ³΄μ.
$ tree
.
βββ src
βββ main.c
βββ hello.h
βββ hello.c
βββ bye.h
βββ bye.c
βββ Makefile
main ν¨μμμλ hello.c
μ bye.c
μμ μ μν μΈμ¬λ§ μΆλ ₯νλ ν¨μλ₯Ό νΈμΆνκ³ , κ°κ°μ νμΌμλ λ€μκ³Ό κ°μ΄ μμ€κ° μ μλμ΄ μλ€.
ꡬννκΈ°
main ν¨μ μμ± λ° κ΅¬ννκΈ°
#include <stdio.h>
#include "hello.h"
int main() {
say_hello();
say_bye();
return 0;
}
header νμΌ μμ± λ° κ΅¬ννκΈ°
// hello.h
void say_hello():
// hello.c
#include <stdio.h>
#include "hello.h"
void say_hello() {
printf("(hello.h) => μλ
νμΈμ! \n");
}
// bye.c
#include <stdio.h>
#include "bye.h"
void say_bye() {
printf("(bye.h) => μλ
ν κ°μΈμ! \n");
}
Makefile μ μνκΈ°
μ΄μ build λ₯Ό μν Makefile μ μ μν΄λ³΄λλ‘ νμ.
κ·Έ μ μ!
gcc λ₯Ό μ΄μ©ν΄μ λΉλλ₯Ό νλ κ³Όμ μ μ μ 보μ.
κ°κ°μ c νμΌμ ν΅ν΄μ object νμΌμ λ§λ€κ³
$ gcc -c main.c # main.o νμΌ μμ±
$ gcc -c hello.c # hello.o νμΌ μμ±
$ gcc -c bye.c # bye.o νμΌ μμ±
$ gcc main.o hello.o bye.o -o Greeting # κ°κ°μ Object νμΌ λ§νΉμ ν΅ν΄ Greeting μ΄λΌλ exe νμΌ μμ±
Makefile μ μμ±νλ κ³Όμ μ μμ κ³Όμ κ³Ό μ νν λμΌνλ€.
Makefile μ΄ νλ μΌμ μμ κ°μ΄ ν°λ―Έλμμ λΉλ μ΅μ κ³Ό λ§νΉμ νλμ νμΌ μμ ν μ μλλ‘ νλ κ²μ΄λ€.
docker-compose μ λΉμ·ν λλμ΄λ€
μ΄μ μμ μλ μ»΄νμΌμ ν λλ‘ Makefile μ λ§λ€μ΄λ³΄μ.
hello.o : hello.h hello.c
gcc -c hello.c
bye.o : bye.h bye.c
gcc -c bye.c
main.o : main.c hello.h bye.h
gcc -c main.c
Greeting : hello.o bye.o main.o
gcc hello.h bye.h main.o -o Greeting
κ·Έλ¦¬κ³ make λͺ λ Ήμ΄λ₯Ό ν΅ν΄μ λΉλλ₯Ό μνν΄λ³΄μ.
$ make Greeting
gcc -c hello.c
gcc -c bye.c
gcc -c main.c
gcc hello.o bye.o main.o -o Greeting
μ΄λ κ² μλμΌλ‘ λΉλλ₯Ό μννκ² λλ€.
κ·Έλ¦¬κ³ ls λͺ λ Ήμ ν΅ν΄μ μ μ»΄νμΌμ΄ μλ£λμλμ§ νμΈνκΈ° μν΄ ls λͺ λ Ήμ μνν΄λ³΄μ
$ ls
main.c main.o hello.h hello.c hello.o bye.h bye.c bye.o Greeting
κ·ΈλΌ μ°λ¦¬κ° μμ±νκΈ°λ‘ ν Greeting νμΌμ΄ μ λ§λ€μ΄μ§ κ²μ λ³Ό μ μλ€.
μ€νμμΌλ³΄μ!
$ ./Greeting
(hello.h) => μλ
νμΈμ!
(bye.h) => μλ
ν κ°μΈμ!
λκΈ