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
C:\Windows
디렉토리에 복사해주면 명령행에서 편하게 사용할 수 있겠죠.
ifneq ($(findstring sh.exe,$(SHELL)),) # sh.exe가 Make 환경변수인 SHELL 로 지정되어 있는 경우 Windows용 GNU Make 가 실행되었음을 알 수 있습니다. 실제로 Windows에서의 shell 은 "cmd /c" (환경에 따라 다를수도 있음) 입니다. endif
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