bash# cc -O2 -Wall -Werror -fomit-frame-pointer -c -o test.o test.c bash# ls test.c test.o bash# ld -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o test /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o test.o bash# ./test Hello world ! bash# _
<Target>: <Depend> ?... [[;] <Command>] <탭문자><Command>
test: test.o
ld -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 \
-o test \
/usr/lib/crt1.o \
/usr/lib/crti.o \
/usr/lib/crtn.o \
test.o
test.o: test.c
cc -O2 -Wall -Werror -fomit-frame-pointer -c -o test.o test.c
bash# make test cc -O2 -Wall -Werror -fomit-frame-pointer -c -o test.o test.c ld -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o test /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o test.o bash# _
bash# make test make: `test'는 이미 갱신되었습니다. bash# _
bash# touch test.c bash# make test cc -O2 -Wall -Werror -fomit-frame-pointer -c -o test.o test.c ld -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o test /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o test.o bash# _
<Macro name> = <Macro 내용>
CC = cc
LD = ld
CFLAGS = -O2 -Wall -Werror -fomit-frame-pointer -c
LDFLAGS = -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2
STARTUP = /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o
test: test.o
$(LD) $(LDFLAGS) -o test $(STARTUP) test.o
test.o: test.c
$(CC) $(CFLAGS) -o test.o test.c
.c.o:
$(CC) $(CFLAGS) -o $@ $<
CC = cc
LD = ld
CFLAGS = -O2 -Wall -Werror -fomit-frame-pointer -c
LDFLAGS = -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2
STARTUP = /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o
test: test.o
$(LD) $(LDFLAGS) -o $@ $(STARTUP) $^
.c.o:
$(CC) $(CFLAGS) -o $@ $<
CC = cc
LD = ld
RM = rm -f
CFLAGS = -O2 -Wall -Werror -fomit-frame-pointer -c
LDFLAGS = -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2
STARTUP = /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o
clean:
$(RM) test.o test
test: test.o
$(LD) $(LDFLAGS) -o $@ $(STARTUP) $^
.c.o:
$(CC) $(CFLAGS) -o $@ $<
CC = cc
LD = ld
RM = rm -f
CFLAGS = -O2 -Wall -Werror -fomit-frame-pointer -c
LDFLAGS = -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2
STARTUP = /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o
.PHONY: all clean
all: test
clean:
-$(RM) test.o test
test: test.o
$(LD) $(LDFLAGS) -o $@ $(STARTUP) $^
.c.o:
$(CC) $(CFLAGS) -o $@ $<
#include <stdio.h>
void HelloWorld(void)
{
fprintf(stdout, "Hello world.\n");
}
#include <stdio.h>
#include "hello.h"
int main(void)
{
HelloWorld();
return(0);
}
extern void HelloWorld(void);
CC = cc LD = ld RM = rm -f CFLAGS = -O2 -Wall -Werror -fomit-frame-pointer -v -c LDFLAGS = -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 STARTUP = /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o BUILD = test OBJS = test.o hello.o .PHONY: all clean all: $(BUILD) clean: ; $(RM) *.o $(BUILD) test: $(OBJS) ; $(LD) $(LDFLAGS) -o $@ $(STARTUP) $^ # 의존관계 성립 hello.o: $($@:.o=.c) $($@:.o=.h) Makefile test.o: $($@:.o=.c) hello.h Makefile # 확장자 규칙 (컴파일 공통 규칙) .c.o: ; $(CC) $(CFLAGS) -o $@ $<
CC = cc LD = ld RM = rm -f CFLAGS = -O2 -Wall -Werror -fomit-frame-pointer -v -c LDFLAGS = -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 STARTUP = /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o BUILD = test OBJS = test.o hello.o .PHONY: all clean all: $(BUILD) clean: ; $(RM) *.o $(BUILD) test: $(OBJS) ; $(LD) $(LDFLAGS) -o $@ $(STARTUP) $^ # 의존관계 성립 $(OBJS): $($@:.o=.c) hello.h Makefile # test.o hello.o: $($@:.o=.c) hello.h Makefile # 확장자 규칙 (컴파일 공통 규칙) .c.o: ; $(CC) $(CFLAGS) -o $@ $<
include <Makefile-names...>
EXT_MAKEFILE:=build.mk -include *.mk $(EXT_MAKEFILE)
$(subst <from>,<to>,<text>)
$(subst A,B,ABC)
$(patsubst <pattern>,<replacement>,<text>)
$(<var>:<suffix>=<replacement>)
$(patsubst %.c,%.o,A.c B.c C.c)
$(strip <string>)
$(strip A B C )
$(findstring <find>,<text>)
$(findstring linux,android windows macos androideabi linux unix)
$(filter <pattern>,<text>)
$(filter %.c %.s, A.c B.c C.s D.h)
$(filter-out <pattern>,<text>)
$(filter-out %.c %.s, A.c B.c C.s D.h)
$(sort <list>)
$(sort C B A A B C)
$(abspath <pathname>[...])
$(abspath ./Makefile)
$(dir <pathname>[...])
$(dir /bin/bash)
$(notdir <pathname>[...])
$(notdir /bin/bash)
$(call <name>[,<args>[...]])
$(call mymacro,arg1,arg2,arg3)
$(foreach <var>,<words>,<text>)
$(foreach s_this,boy girl tiger,i am $(s_this):)
$(wildcard <pattern>[...])
$(wildcard /bin/sh)
$(wildcard /etc/*)
$(shell <cmdline>)
$(shell uname -m)
$(shell hostname)
$(shell whoami)
SHELL
ifneq ($(wildcard /bin/bash),) SHELL=/bin/bash# default bash shell endif ifeq ($(SHELL),) SHELL=/bin/sh# default unix shell endif
MAKE
$(MAKE)" 처럼 변수를 이용하여 사용하는게 좋습니다.
MAKE_VERSION
# check for minimal make version (NOTE: this check will break at make 10.x !) DEF_HWPORT_REQUIRE_MINIMUM_MAKE_VERSION:=3.81# ifneq ($(firstword $(sort $(MAKE_VERSION) $(DEF_HWPORT_REQUIRE_MINIMUM_MAKE_VERSION))),$(DEF_HWPORT_REQUIRE_MINIMUM_MAKE_VERSION)) $(error you have make "$(MAKE_VERSION)". GNU make >= $(DEF_HWPORT_REQUIRE_MINIMUM_MAKE_VERSION) is required !) endif
MAKEFLAGS
MAKEFILES
MAKELEVEL
MAKECMDGOALS
CURDIR
VPATH
SUFFIXES
Windows용 GNU Make v3.81 다운로드 (105.89 KB) : 이 실행파일을 다운로드 받아서 적절한 위치에 복사후 PATH환경변수를 잡아주고 사용하면 됩니다. 통상적으로 C:\Windows 디렉토리에 복사해주면 명령행에서 편하게 사용할 수 있겠죠.
ifneq ($(findstring sh.exe,$(SHELL)),) # sh.exe가 Make 환경변수인 SHELL 로 지정되어 있는 경우 Windows용 GNU Make 가 실행되었음을 알 수 있습니다. 실제로 Windows에서의 shell 은 "cmd /c" (환경에 따라 다를수도 있음) 입니다. endif
http://gnuwin32.sourceforge.net/
또는
http://gnuwin64.sourceforge.net/
에서 이미 빌드된 실행파일 형태로 다운로드 받아 사용할 수 있습니다.
ifneq ($(findstring sh.exe,$(SHELL)),) # Windows GNU Make's echo command ECHO:=echo# QUOTE:=# else # Unix GNU Make's echo command ECHO:=echo# QUOTE:=$(subst \,,\")# endif .PHONY: all all: ; $(ECHO) $(QUOTE)Hello world !$(QUOTE)
SOURCE:=a.c b.c c.c d.d test.c example.c# OBJECT:=$(SOURCE:%.c=%.o)#
SOURCE:=a.c b.c c.c d.d test.c example.c# OBJECT:=$(patsubst %.c,%.o,$(SOURCE))#
### ### Copyright (C) MINZKN.COM ### All rights reserved. ### Author: JAEHYUK CHO <mailto:minzkn@minzkn.com> ### SUBDIRS :=alpha beta gamma MySource# .PHONY: all % all: ;@$(foreach s_sub_directory,$(SUBDIRS),$(MAKE) $(@) --no-print-directory --directory="$(s_sub_directory)";) %: ;@$(foreach s_sub_directory,$(SUBDIRS),$(MAKE) $(@) --no-print-directory --directory="$(s_sub_directory)";) # End of makefile
# check for minimal make version (NOTE: this check will break at make 10.x !) DEF_HWPORT_REQUIRE_MINIMUM_MAKE_VERSION:=3.81# ifneq ($(firstword $(sort $(MAKE_VERSION) $(DEF_HWPORT_REQUIRE_MINIMUM_MAKE_VERSION))),$(DEF_HWPORT_REQUIRE_MINIMUM_MAKE_VERSION)) $(error you have make "$(MAKE_VERSION)". GNU make >= $(DEF_HWPORT_REQUIRE_MINIMUM_MAKE_VERSION) is required !) endif
http://korea.gnu.org/manual/
: Make 에 대하여 깊히 알고 싶다면 꼭! 이 문서를 읽어보시길 강력히 추천합니다.
http://korea.gnu.org/manual/release/automake/