GNU make ָ�� ���룺 ���� ���߰��� ������һƪ���� GNU Make �����£���������Ӧ�û��������� make ���÷����� make ���������� Unix ����ȻҲ���� Linux ��ϵͳ�ϱ�̵��û��������յĹ��ߡ������д�ij�����û���õ� make ����˵����д�ij���ֻ�Ǹ��˵���ϰ���������κ�ʵ�õļ�ֵ��Ҳ����ô˵�е� ��ƫ������ make ʵ����Ӧ�������κ��Ծ߹�ģ�ij����еġ�ϣ�����Ŀ���Ϊ�й��� Unix ��̳�ѧ���ṩһ������õ����ϡ��й��� Linux �û�����ѧ�ᰲװ��ñ�����⣬ ʵ��Ӧ�ó���дһЩ���õij������뷨����Ҳο���
C-Scene ��Ŀ #2 ���ļ���Ŀ�� GNU Make ���� ����: ���θ��� (Goerge Foot) �����ʼ�: [email protected] Occupation: Student at Merton College, Oxford University, England ְҵ:ѧ����Ĭ����ѧԺ,ţ��Ǵ�ѧ,Ӣ���� IRC����: gfoot �ܾ���ŵ�����߶����κ���˶����κ�������ɵ�����������ӵ�л� ӵ�е�ʵ�ʵģ�����ģ���������ģ������е��������Լ������Σ��� �����ء� ����Ȩ�� �����ļ���Ŀ�������������ߵIJƲ�����Ȩ�����θ��أ��������� ���������¡����������� CScene �Ʋ�����Ȩ CScene ���������꣬�������� ��Ȩ���� CScene ���µķַ������ֻ�ȫ����Ӧ������������ CScene ������ �������������� 0) ���� ~~~~~~~~~~~~~~~ ���Ľ����Ƚ���ΪʲôҪ����ģ�Դ�������ɼ��������Ķ���������ʲôʱ ����Ҫ�֣���ô���ֵܷĺá�Ȼ������� GNU Make ����ʹ��ı������ �Ӳ����Զ������������� Make ���ߵ��û���˵����Ȼ�����������ƹ���ʱҪ ���ʵ��ĵ��������ĵ�������Ȼ�Ƿdz����õġ���������Լ��ı�̹����л� �ɣ�����ʵ�ʵ���һ�ԣ��������Ķ��û��ֲᡣ 1) ���ļ���Ŀ ~~~~~~~~~~~~~~~~~~~~~~
���ȣ����ļ���Ŀ�ĺô��������أ� ���ǿ�����������Ū�ĸ����ޱȡ���Ҫ header �ļ�����Ҫ extern ���������������Ҫ����һ���ļ�����Ҫ�ڸ�����ļ��������� ����ʵ�����к�����������֧�����ǰ�һ����Ŀ�ֽ��С�顣����� ��һ�д��룬��������Ҫȫ�����±���������һ���µĿ�ִ���ļ��� ����������Ŀ�Ƿֿ��ڼ���С�ļ������Ķ�����һ���ļ���ʱ ���Դ�ļ���Ŀ���ļ�(object files)�Ѿ����ڣ�����û��ʲô ԭ��ȥ���±������ǡ�������Ҫ����ֻ�����ֱ��뱻�Ķ������Ǹ��� ����Ȼ�������������е�Ŀ���ļ����ˡ��ڴ��͵���Ŀ�У�����ζ�� �Ӻܳ��ģ������ӵ���Сʱ�����±�������Ϊʮ������ʮ����ļ� ������ ֻҪͨ�������Ĺ滮����һ����Ŀ�ֽ�ɶ��С�ļ���ʹ��������� ���ҵ�һ�δ��롣�ܼ�����ݴ�������ð���Ĵ���ֽ��ͬ ���ļ������Ҫ��һ�δ���ʱ�������ȷ��֪�����Ǹ��ļ���ȥ Ѱ������ �Ӻܶ�Ŀ���ļ�����һ������� (Library)�ȴ�һ����һ�Ĵ�Ŀ���ļ� ����Ҫ�õĶࡣ��Ȼʵ�������Ƿ�����һ�����������������õ�ϵͳ �������ġ����ǵ�ʹ�� gcc/ld (һ�� GNU C ���룯������) ��һ���� ������ӵ�һ������ʱ�������ӵĹ����У����᳢�Բ�ȥ����û��ʹ �õ��IJ��֡�����ÿ��ֻ�ܴӳ�����а�һ��������Ŀ���ļ��ų��� �⡣��������ο�һ���������ijһ��Ŀ�굵���κ�һ�����ŵĻ��� ��ô���Ŀ���ļ��������ᱻ���ӽ�����Ҫ��һ����������dz���� �ķֽ��˵Ļ�����ô�����Ӻõ��Ŀ�ִ���ļ���ȴ�һ����Ŀ�� �ļ���ɵij�������ӵõ����ļ�С�öࡣ ����Ϊ��ij����Ǻ�ģ�黯�ģ��ļ�֮��Ĺ������ֱ��������٣��� ���кܶ�ô��������Ժ������ٵ����棬��Щģ�龭���ǿ����� ����������Ŀ��ģ�ͬʱ����Ҳ���Ը������������һ�δ����Ǹ� ʲô�ġ���Ȼ����������ĺô����� 1.2 ��ʱ�ֽ������Ŀ �����ԣ����κζ������ֽ��Dz������ġ������磬���Ǻá������� ��������Ͳ��ܷ֣���Ϊʵ��Ҳûʲô�ɷֵġ������ڲ����õ� С����ֽ�Ҳ��ûʲô��˼�ġ���һ����˵�����ֽ���Ŀ�����ڲ��֡� ��չ�����Ե�ʱ���Ҷ����ȡ�����ڴ����������£��ⶼ���� �õġ�����ν�����磬���Ǻá����� 'hello world' ��ֻ��һ���� ��һ�ֱ������ʱ���õķ���������������Ļ����ʾһ�� 'hello world' ������ij��� �������Ҫ����һ���൱�����Ŀ���ڿ�ʼǰ��Ӧ�ÿ���һ���㽫 ���ʵ�������������ɼ����ļ������ʵ������֣�������Ĵ��롣 ��Ȼ���������Ŀ�����Ĺ����У�����Խ����µ��ļ���������� ��ô���Ļ���˵������ܸı��˵������뷨����Ӧ�������Ƿ���Ҫ ������ṹҲ������Ӧ�ĵ����� �������͵���Ŀ���㵱ȻҲ���Բ����������ɣ�����Ҳ���Ծ���ô�� ʼ������Ĵ��룬�������ൽ���Թ�����ʱ���ٰ����Ƿֽ�ɲ�ͬ �ĵ����������ҵľ�����˵����ʼʱ���������γ�һ����ŵķ����� ���Ҿ�������������ڿ��������У����ų������Ҫ���ģ���ʹ�� ����ø������ס� 1.3 �����ֽ���Ŀ ��˵��������ȫ���Ҹ��˵����������ԣ�Ҳ������Ļ���ñ�� ��ʽ��������ᴥ�����йر���������⣬����Ҵ�����û��ֹͣ ������������ϵ����ۡ���������ֻ�Ǹ������Լ�ϲ����������ͬʱ Ҳ������ô����ԭ��
ii) ������ԵĻ�����ȫ�����ó���һ���� header �ļ���ָ��ͬ һ��Դ���ļ�����ʱ�����ɹ������õĺ���ԭ�ͣ����Ͷ��� �ȵȣ������ǵģ�Դ���ļ��з�������Ƿdz����õġ�ʹ��һ �� header �ļ�װ�������ţ�����һ��װ˽�˷�����ζ����� ��ı������Դ���ļ����ڲ��ṹ�������ֻ�����±������� ����Ҫ���±�����Щʹ�����Ĺ��� header �ļ���������Դ�� ���� iii) ��Ҫ�ڶ�� header �ļ����ظ�������Ϣ�� �����Ҫ�� ������һ�� header �ļ��� #include ��һ������ �Dz�Ҫ�ظ�������ͬ�� header ��Ϣ���Ρ�ԭ����������Ժ�� ���������Ϣ����ֻ��Ҫ�����ı�һ�Σ������������ı�����һ ���ظ�����Ϣ�� iv) ��ÿһ��Դ���ļ�� #include ��Щ������Դ���ļ��еķ� �ŵ����� header �ļ�������һ��������Դ���ļ��� header �ļ���ijЩ����������ì���������ԱȽ����ı����������֡�
һ�ֱ������ִ���ķ������ڹ��õķ���ǰ���ϸ�������Դ�ļ��� �ص�ǰ�����磺������ gfx.c ��ĺ���������ǰ��gfx_������� ���С�ĵķֽ���ij���ʹ��������ĺ������ƣ����Ҳ��ǹ��� ʹ��ͨ�ñ�������Ȼ������Ͳ������⡣ Ҫ��ֹһ�����������������Դ�ļ����ⱻ�������������Ķ���ǰ ���Ϲؼ��֡�static�������ֻ��һ�������ڲ�ʹ�ã����������� �������õ��ļ����Ǻ����õġ� b) ��ζ���ķ��ţ� header ���ᱻ���ֵ��滻����Դ�ļ��� #include ��λ�õġ���ˣ���� header ���� #include ��һ�����ϵ�Դ�ļ� ���� header �������еĶ���ͻ������ÿһ���йص�Դ���ļ� ����ʹ������ķ��ű�����һ�����ϣ��Ӷ��������Ӵ��� �ϣ��� ��������� ��Ҫ�� header ���ﶨ���������ֻ��Ҫ�� header ������������Ȼ�����ʵ��ģ�Դ���ļ���Ӧ�� #include �Ǹ� header �����Ǹ����ﶨ�����ǣ�һ�Σ������ڳ�ѧ����˵������������� ���������ġ������������Ǹ��߱��������������ķ���Ӧ�ô��ڣ� ����Ҫ����ָ�������͡����ǣ���������ʹ��������������ռ䡣 �������������Ҫ���������������ռ䡣����һ�������������� �����ʱ��������ǰ��һ���ؼ��֡�extern���� ���磬������һ���С�counter���ı����������������Ϊ���õģ� ������һ��Դ�����ֻ��һ�����棩�Ŀ�ʼ����������int counter;����������ص� header ��������������extern int counter;���� ����ԭ���������� extern ����˼�����Բ������������⡣ c) �ظ����壬�ظ�������ì�����ͣ� �뿼�������һ����Դ���ļ��� #include ������ a.h �� b.h�� �� a.h �� #include �� b.h ����ԭ���� b.h ��������һЩ a.h ��Ҫ�����ͣ����ᷢ��ʲô���أ���ʱ�ã�Դ���ļ� #include �� b.h ���Ρ����ÿһ���� b.h �е� #define �����������Σ�ÿһ ���������������Σ��ȵȡ������ϣ���Ϊ��������ȫһ���Ŀ����� ����Ӧ�ò�����ʲô���⣬����ʵ��Ӧ���ϣ����Dz����ϣõ�� �ģ������ڱ���ʱ���ִ��������Ǿ��档 ����ķ�����Ҫȷ��ÿһ�� header ������һ��Դ���ļ���ֻ���� ����һ�Ρ�����һ������Ԥ���������ﵽ���Ŀ�ĵġ������ǽ��� ÿһ�� header ��ʱ������Ϊ��� header �� #define һ���� ָ�ֻ���������ָ��û�б������ǰ���£����Dz�����ʹ�� �� header �������塣��ʵ��Ӧ���ϣ�����ֻҪ�İ�����һ�� �����ÿһ�� header ���Ŀ�ʼ���֣� #ifndef FILENAME_H #define FILENAME_H Ȼ�������һ���������� #endif �� header ���ĵ�������д�ģ���������� FILENAME_H���õ��� ���浵���еĵ㡣��Щ��ϲ���� #endif ����ע��������������� #endif ָ����ʲô�����磺 #endif /* #ifndef FILENAME_H */ �Ҹ���û�����ϰ�ߣ���Ϊ����ʵ�Ǻ����Եġ���Ȼ��ֻ�Ǹ��˵� ���ͬ�����˴��š� ��ֻ��Ҫ����Щ�б������� header ���м���������ɣ������� �е� header ���ж�����Ҳûʲô��ʧ���������Ǹ���ϰ�ߡ� ������������������Ǻ���Ҫ�ġ�������ʹ��Դ���ļ�������ij�� ��ʽ��Ŀ���ļ�(object files)������������У��ⲿ�ķ��Ųο��� û�б����ͻ��滻��Ȼ������ʹ����������������ЩĿ���ļ���һЩ ���ij�����ټ���ָ���ij�����������������һ����ִ�г��� ������Σ�һ��Ŀ���ļ��жԱ���ļ��еķ��ŵIJο������ͣ��� ���治�ܱ����͵IJο���һ�����Դ�����Ϣ����ʽ��������� �����IJ����Ӧ���ǣ������Դ���ļ�һ��һ���ı����Ŀ���ļ��ĸ� ʽ���������е�Ŀ���ļ�������Ҫ�ij�������ӳ�һ����ִ���ļ��� ������ô��������ı����������ġ�������ֻ���� gcc ��GNU C ���� �������й������Щ�п��ܶ���ķ� gcc ������Ҳ���á� gcc ��һ����Ŀ��Ĺ��ߡ�������Ҫ��ʱ�����������Ԫ����Ԥ���� ������������ϳ��������������������ЩԪ��������ȡ���� �����ļ������ͺ��㴫�ݸ����Ŀ��ء� һ����˵�������ֻ������Դ���ļ�������Ԥ���������룬������� ���ļ���Ȼ������õ�Ŀ���ļ����ӳ�һ����ִ���ļ���һ�����ɵ� �ļ�������Ϊ a.out �����㵱Ȼ������ô����������ƻ��ܶ����� ��һ����Ŀ�ֽ�ɶ���ļ����õ��ĺô��� ��������һ�� -c ���أ�gcc ֻ�Ѹ������ļ������Ŀ���ļ��� ��Դ���ļ����ļ���������������ɡ�.c����.cc����ɡ�.o���� ������������һ��Ŀ���ļ��� gcc ����������ӳɿ�ִ���ļ��� ȱʡ�ļ����� a.out ������Ըı�ȱʡ�����ÿ��� -o �����ָ�� ���ļ����� ��ˣ�����ı���һ��Դ���ļ�������Ҫ���±������� 'gcc -c filename.c' Ȼ���������������Ŀ�� 'gcc -o exec_filename *.o'�� �����ı���һ�� header ��������Ҫ���±������� #include �� �������Դ���ļ���������� 'gcc -c file1.c file2.c file3.c' Ȼ�����ϱ�һ�����ӡ� ��Ȼ��ô���Ǻܷ����ģ��ҿ�������Щ����ʹ��������ü� ���ĵĵڶ����־��ǽ������е�һ�����ߣ�GNU Make ���ߡ� ���üһ���ڲſ�ʼ�����¡���ѧ���������û���� ~~~~~~~~~~~~~~~~
GNU Make ����Ҫ�����Ƕ���һ���ı��ļ��� makefile ������� ������Ҫ���й���Щ�ļ�����target��Ŀ���ļ����Ǵ���Щ��� �ļ�����dependencies�������ļ����в����ģ���ʲô���������� ����������̡�������Щ��Ϣ�� make ����ŵ��ϵ��ļ������ Ŀ���ļ���ʱ��������ļ����ɻĶ�ʱ��ʱ�䣩����������һ �������ļ��ɵĻ��� make ��ִ����Ӧ������Ա����Ŀ���ļ��� ��Ŀ���ļ���һ�������Ŀ�ִ�е������������κ�һ���ļ����� makefile һ�㱻������makefile����Makefile������Ȼ����� �� make ��������ָ������ļ���������㲻�ر�ָ��������Ѱ �ҡ�makefile����Makefile�������ʹ����������������� �ġ� һ�� makefile ��Ҫ����һϵ�еĹ������£� (tab)<command> (tab)<command> . . . ���磬�������µ� makefile �� === makefile ��ʼ === myprog : foo.o bar.o gcc foo.o bar.o -o myprog foo.o : foo.c foo.h bar.h gcc -c foo.c -o foo.o bar.o : bar.c bar.h gcc -c bar.c -o bar.o === makefile ���� === ����һ���dz������� makefile ���� make �������濪ʼ������ ���һ��Ŀ�ģ���myprog������Ϊ������ҪĿ�꣨һ������Ҫ�� ֤���������µ�����Ŀ�꣩�������Ĺ���˵��ֻҪ�ļ���myprog�� ���ļ���foo.o����bar.o���е��κ�һ���ɣ���һ�е���� �ᱻִ�С� ���ǣ��ڼ���ļ� foo.o �� bar.o ��ʱ���֮ǰ���������²� ����Щ�� foo.o �� bar.o ��ΪĿ���ļ��Ĺ������ҵ��Ĺ��� foo.o �Ĺ����ļ��������ļ��� foo.c, foo.h �� bar.h �� �����������Ҳ���������Щ�����ļ��Ĺ������Ϳ�ʼ���ŵ� ����Щ�����ļ���ʱ����������Щ�ļ����κ�һ����ʱ����� foo.o ���£����� 'gcc -o foo.o foo.c' ����ִ�У��Ӷ����� �ļ� foo.o �� ���������ļ� bar.o �����Ƶļ�飬�����ļ����������ļ� bar.c �� bar.h �� ���ڣ� make �ص���myprog���Ĺ�������ղ����������е��� ��һ����ִ�У�myprog ����Ҫ�ؽ�����Ϊ����һ�� .o ���ͻ�� ��myprog���£���������������ִ�С� ϣ�����ˣ�����Կ���ʹ�� make ��������������ĺô�����ǰ һ�������з����ļ�鲽�趼�� make �������ˣ����ʱ����� ���Դ���ļ���һ���ı䶼������Ǹ��ļ������±��루�� Ϊ .o �ļ����� .c �ļ�����������ִ���ļ����������ӣ���Ϊ .o �ļ����ı��ˣ�����ʵ�����ĵ������ڵ���ı�һ�� header ����ʱ���㲻����Ҫ��ס�Ǹ�Դ���ļ�����������Ϊ���е� ���϶��� makefile � make ������ɵ��������±��������� Щ��������� header �ļ����ı��˵�Դ���ļ���������Ҫ���� �����������ӡ� ��Ȼ����Ҫȷ������ makefile ����д�Ĺ�������ȷ����ģ�ֻ �г���Щ��Դ���ļ��б� #include �� header ������ 2.2 ��д make ���� (Rules) �����Եģ�Ҳ����ģ���д����ķ�����һ��һ���IJ� ��Դ���ļ��������ǵ�Ŀ���ļ���ΪĿ�ģ�����Դ���ļ��ͱ��� #include �� header ����Ϊ�����ļ���������ҲҪ����������Щ header �� #include �� header ��Ҳ��Ϊ�����ļ���������Щ�� �������ļ����������ļ�����Ȼ����ᷢ��Ҫ��Խ��Խ����ļ� ���й�����Ȼ�����ͷ����ʼ���䣬���Ƣ����ʼ�仵������� ɫ��ɲ�ɫ��������·�Ͽ�ʼ�����߸�����ײ�������㵷����� ������ʾ����ֹͣ��̡�������û��Щ������ķ����أ� ��Ȼ�У��������Ҫ���ڱ���ÿһ��Դ���ļ���ʱ����ʵ��Ӧ ��֪��Ӧ�ð���ʲô���� header ����ʹ�� gcc ��ʱ���� -M ���أ�����Ϊÿһ��������ģ��ļ����һ������Ŀ���ļ� ��ΪĿ�ģ���������ļ�������Ӧ�ñ� #include �� header �� ������Ϊ�����ļ���ע����������������� header �ļ����� ����������(`<', `>')��˫����(`"')����Χ���ļ�����ʵ���ǿ��� �൱�϶�ϵͳ header �������� stdio.h, stdlib.h �ȵȣ����� �����Ǹ��ģ�������� -MM ������ -M ���ݸ� gcc����Щ�ý��� �Ű�Χ�� header �������ᱻ������������ʡһЩ����ʱ�䣩 �� gcc ����Ĺ��Ậ������֣�������Լ�д��������� ����ʲôҲ��д������ make ʹ�����������Ĺ��ο������ 2.4 �ڣ��� 2.3 Makefile ���� �����ᵽ makefiles ����Ҫ����һЩ�������ǰ����������Ķ� ���DZ������塣 makefile ��ı�������һ����������(environment variable)�� ��ʵ�ϣ����������� make �����б����ͳ� make �ı�������Щ �����Ǵ�Сд���еģ�һ��ʹ�ô�д��ĸ�����ǿ��ԴӼ����κ� �ط������ã�Ҳ���Ա��������ܶ����飬���磺
ii) �����ִ���ļ�������������Ŀ������һ���� gcc ��ϵ ͳ������������ʹ��һ����ͬ�ı�����������뽫�� ��ʹ�ñ������ĵط��ij����µı����������������ʹ��һ �����������������������ô��ֻ��Ҫ�ı�һ���ط����� �����еط����������Ͷ��ı��ˡ� iii) �����������ꡣ��������������еı��������һ�� ��ͬ��ѡ����� -Wall -O -g��������������ѡ��� ��һ����������ô�������������������к��б����� �ĵط���������Ҫ�ı�ѡ���ʱ����ֻ����һ���ط��� ��������������ݡ� === makefile ��ʼ === OBJS = foo.o bar.o CC = gcc CFLAGS = -Wall -O -g myprog : $(OBJS) $(CC) $(OBJS) -o myprog foo.o : foo.c foo.h bar.h $(CC) $(CFLAGS) -c foo.c -o foo.o bar.o : bar.c bar.h $(CC) $(CFLAGS) -c bar.c -o bar.o === makefile ���� === ����һЩ�趨�õ��ڲ����������Ǹ���ÿһ���������ݶ��塣���� �Ƚ����õı����� $@, $< �� $^ ����Щ��������Ҫ������ס���� $@ ��չ�ɵ�ǰ�����Ŀ���ļ����� $< ��չ�������б��еĵ� һ�������ļ����� $^ ��չ�������������б������������������� �����ļ�������������Щ���������ǿ�������� makefile д�ɣ� === makefile ��ʼ === OBJS = foo.o bar.o CC = gcc CFLAGS = -Wall -O -g myprog : $(OBJS) $(CC) $^ -o $@ foo.o : foo.c foo.h bar.h $(CC) $(CFLAGS) -c $< -o $@ bar.o : bar.c bar.h $(CC) $(CFLAGS) -c $< -o $@ === makefile ���� === ������ñ������������������飬�ر��ǵ�������Ǻͺ������ ʹ�õ�ʱ�������Ҫ����һ�����˽⣬��ο� GNU Make �ֲᡣ ('man make', 'man makefile') 2.4 �������� (Implicit Rules) ��ע�⣬�������������������� .o �ļ��������һ���ġ� ���Ǵ� .c �ļ�������ļ������ .o �ļ�������һ�����IJ� �衣��ʵ make �Ѿ�֪����ô����������һЩ��������������� �õĹ�����Щ�������������û�и���ijЩ�����ʱ��Ӧ�� ��ô�졣 ���������� foo.o �� bar.o ����������ǵĹ�����ɾ���� make �������������������Ȼ����ҵ�һ���ʵ��������������� ʹ��һЩ��������������������뷨���趨������ʹ�ñ��� CC ��Ϊ����������������ǰ������ӣ������Ҵ��ݱ��� CFLAGS ���� C ��������C++ �������� CXXFLAGS ����CPPFLAGS �� C Ԥ ��������꣩�� TARGET_ARCH �����ڲ��ÿ����������Ȼ������ ����� '-c' ����������� $< ����һ������������Ȼ������ �� '-o' ������ $@ ��Ŀ���ļ�������һ���ñ���ľ������ ���ǣ� $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@ ��Ȼ����������Լ�����Ҫ��������Щ�����������Ϊʲô�� gcc �� -M �� -MM ��������������ֱ������һ�� makefile � 2.5 ����Ŀ�� (Phony Targets) �������һ����Ŀ�����Ҫ����������ִ���ļ��������ҪĿ�� �Dz���������ִ���ļ������������ļ���������ġ������һ ���ļ���Ҫ�ؽ�������Ӱ����һ���������ʹ�á�����Ŀ�ġ��� �ﵽ����Ч����һ������Ŀ�ĸ�һ��������Ŀ�ļ�����һ���ģ� ֻ�����Ŀ���ļ��Dz����ڵġ���ˣ� make ���ǻ��������Ҫ �����ɣ��������������ļ����ºͻ�ִ�����Ĺ���������� �С� ��������ǵ� makefile ��ʼ�����룺 all : exec1 exec2 ���� exec1 �� exec2 ��������ΪĿ�ĵ�������ִ���ļ��� make ����� 'all' ��Ϊ������ҪĿ�ģ�ÿ��ִ��ʱ���᳢�� 'all' ���¡�����Ȼ���й�����û���ĸ�������������һ���� 'all' �� ʵ���ļ�����ʵ�� all �������ڴŵ���ʵ�ʲ���������������� ������ı� 'all' ��״̬���ɼ�Ȼ����ļ��������ڣ����� make �᳢�Ը��� all ������˾ͼ���������� exec1, exec2 �Ƿ���Ҫ���£������Ҫ���Ͱ����Ǹ��£��Ӷ��ﵽ���ǵ�Ŀ�ġ� ����Ŀ��Ҳ������������һ���Ԥ��Ķ��������磬����������� make �������ļ�ɾ����������� makefile ����������һ������ veryclean : rm *.o rm myprog ǰ����û�������Ĺ���������� 'veryclean' Ŀ�ģ�������Զ ���ᱻִ�С����ǣ��������ȷ��ʹ������ 'make veryclean' �� make ������Ŀ����Ϊ������ҪĿ�ִ꣬����Щ rm ��� �����Ĵŵ��ϴ���һ���� veryclean �ļ����ᷢ��ʲô�£��� ʱ��Ϊ�����������û���κ������ļ����������Ŀ���ļ�һ���� ���µ��ˣ����е������ļ����Ѿ������µ��ˣ������Լ�ʹ�û��� ȷ���� make ���²�������Ҳ�������κ����鷢������������DZ� �����еļ���Ŀ�ģ��� .PHONY��������� make ���ü������ �Ƿ�����ڴŵ��ϣ�Ҳ���ò����κ���������ֱ�Ӽ���ָ����Ŀ ����Ҫ�����¡��� makefile ������������а����������Ĺ��� .PHONY : veryclean �Ϳ����ˡ�ע�⣬����һ������� make ����make ֪�� .PHONY ��һ������Ŀ�ģ���Ȼ�������������������������õ��κμ��� Ŀ�ģ��� make ֪�����Ƕ��Ǽ���Ŀ�ġ� 2.6 ���� (Functions) makefile ��ĺ��������ı��������ơ���ʹ�õ�ʱ������һ�� $ ���Ÿ������ţ����������ո���һ���ɶ��ŷָ��IJ�������� �ù����Ž��������磬�� GNU Make ����һ���� 'wildcard' �ĺ� ��������һ��������������չ����һ�����з������������������ �������ļ����Կո������������������ʾʹ�������� SOURCES = $(wildcard *.c) ���л����һ�������� '.c' ��β���ļ����б���Ȼ�������� SOURCES ���Ȼ�㲻��Ҫһ��Ҫ�ѽ������һ�������� ��һ�����õĺ����� patsubst �� patten substitude, ƥ���� ������д������������Ҫ��������������һ����һ����Ҫƥ��� ʽ�����ڶ�����ʾ��ʲô���滻������������һ����Ҫ�������� �ɿո�ָ������С����磬�����Ǹ��������涨���ı����� OBJS = $(patsubst %.c,%.o,$(SOURCES)) ���н����������� SOURCES �����е��֣�һ���ļ�������������� ��β�� '.c' ������ '.o' �� '.c' ȡ����ע������� % ���Ž�ƥ ��һ�������ַ�������ÿ����ƥ����ִ�����һ��������(stem) �� �ڵڶ�������� % ��������õ�һ������ƥ����Ǹ����� 2.7 һ���Ƚ���Ч�� makefile ��������������ѧ�ģ����ǿ��Խ���һ���൱��Ч�� makefile �� ��� makefile ������ɴ�������Ҫ��������飬������̫�� �ĸı�Ϳ�ֱ�����ڴ��������Ŀ� ����������Ҫһ�������� makefile �������ǵij������ǿ����� ��������ǰĿ¼���ҵ�Դ���ļ������Ҽ������Ƕ����������ǵ��� Ŀ�ģ��Ž�һ���� SOURCES �ı������������Ҳ�������е� *.cc �ļ���Ҳ��������գ���ΪԴ���ļ������� C++ ��ġ� SOURCES = $(wildcard *.c *.cc) ���� patsubst �����ǿ�����Դ���ļ�������Ŀ���ļ����������� Ҫ�������ЩĿ���ļ���������ǵ�Դ���ļ����� .c �ļ���Ҳ�� .cc �ļ���������Ҫʹ����Ƕ�� patsubst �������У� OBJS = $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCES))) ������һ�� patsubst �ĺ��л�� .cc �ļ����к�����������Ľ� �������� patsubst ���д��������ж� .c �ļ���������� �������ǿ�������һ������������ִ���ļ��� myprog : $(OBJS) gcc -o myprog $(OBJS) ��һ���Ĺ���һ����Ҫ�� gcc �Ѿ�֪����ôȥ����Ŀ���ļ� (object files) ���������ǿ����趨����������Ϣ�Ĺ��� depends : $(SOURCES) gcc -M $(SOURCES) > depends ���������һ���� 'depends' ���ļ������ڣ����κ�һ��Դ���ļ� ��һ���Ѵ��ڵ� depends �ļ��£���ôһ�� depends �ļ��ᱻ�� �ɡ�depends �ļ����Ậ���� gcc �����Ĺ���Դ���ļ��Ĺ���ע �� -M ���أ�����������Ҫ�� make ����Щ������ makefile �� ��һ���֡�����ʹ�õļ��ɺ��� C �����е� #include ϵͳ������ ��Ҫ�� make ������ļ� include �� makefile ����£� include depends GNU Make ������������ 'depends' Ŀ���Ƿ�����ˣ����û�У� �������Ǹ������������²��� depends ����Ȼ����������飨�£� �������������������������Ŀ�� 'myprog' ���������й� myprog �Ĺ������������е�Ŀ���ļ��Ƿ���¡������� depends �ļ� ��Ĺ���Ȼ��Щ���������Ѿ��Ǹ��¹����ˡ� ���ϵͳ��ʵЧ�ʺܵͣ���Ϊÿ��һ��Դ���ļ����Ķ������е�Դ�� �ļ���Ҫ��Ԥ�����Բ���һ���µ� 'depends' �ļ���������Ҳ���� 100% �İ�ȫ��������Ϊ��һ�� header �����Ķ���������Ϣ������ �����¡����ͻ���������˵����Ҳ���൱���õ��ˡ� 2.8 һ�����õ� makefile ����һ����Ϊ�Ҵ������Ŀ��Ƶ� makefile ����Ӧ�ÿ��Բ���Ҫ�� �ĵ����ڴ���Ŀ�����Ҫ�������� djgpp �ϣ�����һ�� DOS ��� gcc ���������������Կ���ִ�е��������� 'alleg' ������� �� RM -F ��������ӳ����һ�㡣 === makefile ��ʼ === ###################################### # # Generic makefile # # by George Foot # email: [email protected] # # Copyright (c) 1997 George Foot # All rights reserved. # �������а�Ȩ # # No warranty, no liability; # you use this at your own risk. # û���գ������� # ��Ҫ����������Լ������� # # You are free to modify and # distribute this without giving # credit to the original author. # ����������ĺ�ɢ������ļ� # ������Ҫ��ԭ����ʲô������ # �������˼���� # ###################################### ### Customising # �û��趨 # # Adjust the following if necessary; EXECUTABLE is the target # executable's filename, and LIBS is a list of libraries to link in # (e.g. alleg, stdcx, iostr, etc). You can override these on make's # command line of course, if you prefer to do it that way. # # �����Ҫ����������Ķ����� EXECUTABLE ��Ŀ��Ŀ�ִ���ļ����� LIBS # ��һ����Ҫ���ӵij�����б������� alleg, stdcx, iostr �ȵȣ�����Ȼ�� # ������ make �������и������ǣ���Ը���û���⡣ # EXECUTABLE := mushroom.exe LIBS := alleg # Now alter any implicit rules' variables if you like, e.g.: # # �������ı��κ�����Ķ������������еı��������� CFLAGS := -g -Wall -O3 -m486 CXXFLAGS := $(CFLAGS) # The next bit checks to see whether rm is in your djgpp bin # directory; if not it uses del instead, but this can cause (harmless) # `File not found' error messages. If you are not using DOS at all, # set the variable to something which will unquestioningly remove # files. # # �����ȼ����� djgpp ����Ŀ¼����û�� rm ������û�У�����ʹ�� # del ���������棬���п��ܸ����� 'File not found' ���������Ϣ����û # ʲô������㲻���� DOS �������趨��һ��ɾ�ļ������ϻ������ # ����ʵ��һ���� UNIX ���ϵͳ���Ƕ���ģ�ֻ�Ƿ��� DOS �û��� UNIX # �û�����ɾ���⣵������� ifneq ($(wildcard $(DJDIR)/bin/rm.exe),) RM-F := rm -f else RM-F := del endif # You shouldn't need to change anything below this point. # # �����↑ʼ����Ӧ�ò���Ҫ�Ķ��κζ����������Dz�̫���ţ�̫�Σ��ˣ��� SOURCE := $(wildcard *.c) $(wildcard *.cc) OBJS := $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCE))) DEPS := $(patsubst %.o,%.d,$(OBJS)) MISSING_DEPS := $(filter-out $(wildcard $(DEPS)),$(DEPS)) MISSING_DEPS_SOURCES := $(wildcard $(patsubst %.d,%.c,$(MISSING_DEPS)) \ $(patsubst %.d,%.cc,$(MISSING_DEPS))) CPPFLAGS += -MD .PHONY : everything deps objs clean veryclean rebuild everything : $(EXECUTABLE) deps : $(DEPS) objs : $(OBJS) clean : @$(RM-F) *.o @$(RM-F) *.d veryclean: clean @$(RM-F) $(EXECUTABLE) rebuild: veryclean everything ifneq ($(MISSING_DEPS),) $(MISSING_DEPS) : @$(RM-F) $(patsubst %.d,%.o,$@) endif -include $(DEPS) $(EXECUTABLE) : $(OBJS) gcc -o $(EXECUTABLE) $(OBJS) $(addprefix -l,$(LIBS)) === makefile ���� === �м����ط�ֵ�ý���һ�µġ����ȣ����ڶ���ֱ�����ʱ��ʹ �õ��� := ������ = ���š����������������Ѷ����вο����ĺ� ���ͱ�����չ���ˡ����ʹ�� = �Ļ��������ͱ����ο��������� ��������˵�ı�һ��������ֵ�ᵼ������������ֵҲ���ı䡣�� �磺 A = foo B = $(A) # ���� B �� $(A) ���� $(A) �� 'foo' �� A = bar # ���� B ��Ȼ�� $(A) ��������ֵ�����ű�� 'bar' �ˡ� B := $(A) # ���� B ��ֵ�� 'bar' �� A = foo # B ��ֵ��Ȼ�� 'bar' �� make ������� # ���ź���ֱ����һ�н������������֡� ifneg...else...endif ϵͳ�� makefile ����ijһ�������������� ʧЧ����Ч�Ĺ��ߡ� ifeq ʹ���������������������ͬ������ֱ �� else ������ endif �����û�� else �Ļ�����һ����ӽ� makefile ������ͬ���� else �� endif ���һ������� makefile ������� else ���� ifneq ���÷��պ��෴�� 'filter-out' ����ʹ�������ÿո�ֿ����б������ѵڶ��б����� �еĴ����ڵ�һ�б��е���Ŀɾ���������������� DEPS �б������� ���Ѿ����ڵ���Ŀ��ɾ������ֻ����ȱ�ٵ���Щ�� ��ǰ��˵���� CPPFLAGS �����������������д���Ԥ��������һЩ ��ꡣ�� -MD �������� -M ���أ����Ǵ�Դ���ļ� .c �� .cc �� �γɵ��ļ�����ʹ�ú� .d �ģ���ͽ��������γ� DEPS ������ ���裩��DEPS ���ᵽ���ļ������� '-include' �ӽ��� makefile ����������������ļ������ڶ������Ĵ�����Ϣ�� ����κ������ļ������ڣ� makefile �����Ӧ�� .o �ļ��Ӵŵ� ��ɾ�����Ӷ�ʹ�� make �ؽ�������Ϊ CPPFLAGS ָ���� -MD �� ���� .d �ļ�Ҳ�����²����� ��� 'addprefix' �����ѵڶ��������б���ÿһ��ǰ�ϵ�һ ������ֵ�� ��� makefile ����ЩĿ���ǣ���ЩĿ�Ŀ��Դ��� make �������� ��ֱ��ѡ�ã��� everything:��Ԥ�裩 ������Ҫ�Ŀ�ִ�г�����Ϊÿһ�� Դ���ļ����ɻ����һ�� '.d' �ļ���һ�� '.o' �ļ��� deps: ֻ��Ϊÿһ��Դ�������������һ�� '.d' �ļ��� objs: Ϊÿһ��Դ��������ɻ���� '.d' �ļ���Ŀ���ļ��� clean: ɾ�������н飯�����ļ��� *.d �� *.o ���� veryclean: �� `clean' ��ɾ����ִ���ļ��� rebuild: ���� `veryclean' Ȼ�� `everything' ������ȫ�ؽ��� ����Ԥ��� everything ���⣬����ͷֻ�� clean �� veryclean �� �� rebuild ���û���������ġ� �һ�û�з��ֵ�����һ��Դ���ļ���Ŀ¼����� makefile ��ʧ�ܵ� ��������������ļ���Ū�ҡ��������Ū�ҵ���������ˣ�ֻҪ���� `make clean' �����е�Ŀ���ļ��������ļ��ᱻɾ���������Ӧ�� ������ˡ���Ȼ����ò�Ҫ������Ū�ҡ�����㷢����ij��������� �� makefile �ļ�����������Ĺ�����������ң��һ�������õġ� ~~~~~~~~~~~~~~~ ��ϣ����ƪ�����㹻��ϸ�Ľ����˶��ļ���Ŀ����ô�����ģ�Ҳ˵���� ������ȫ��������ʹ���������ˣ���Ӧ�ÿ������ɵ����� GNU Make �� ��������С�͵���Ŀ���������ȫ�����˺��漸�����ֵĻ�����Щ���� ����˵Ӧ��ûʲô���ѡ� GNU Make ��һ��ǿ��Ĺ��ߣ���Ȼ����Ҫ�������������������кܶ� ����ô��������Ҫ֪�������й�������ߵ�֪ʶ�����ľ䷨�������� ���������ص㣬��Ӧ�òο����IJο��ļ� (info pages, ��� GNU ����Ҳһ���������ǵ� info pages. )�� C Scene �ٷ���վ�� http://cscene.differnet.org C Scene �ٷ����ʣ� [email protected] This page is Copyright ? 1997 By C Scene. All Rights Reserved
�� |