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) ���ļ���Ŀ
~~~~~~~~~~~~~~~~~~~~~~
    1.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 �����ֽ���Ŀ

    ��˵��������ȫ���Ҹ��˵����������ԣ�Ҳ������Ļ᣿���ñ�� ��ʽ��������ᴥ�����йر���������⣬����Ҵ�����û��ֹͣ ������������ϵ����ۡ���������ֻ�Ǹ������Լ�ϲ����������ͬʱ Ҳ������ô����ԭ�򣩣�
      i) ��Ҫ��һ�� header �ļ�ָ����Դ���ļ������⣺����� �� header �ļ�������һ�� header����һ��Դ���ļ��ķ�ʽ �����Ч��Ҳ�����ײ�Ѱ������ı�һ��Դ�ļ��Ľṹ������ ���� header �ļ����ͱ������±���ü����ļ���

      ii) ������ԵĻ�����ȫ�����ó���һ���� header �ļ���ָ��ͬ һ��Դ���ļ�����ʱ�����ɹ������õĺ���ԭ�ͣ����Ͷ��� �ȵȣ������ǵģ�Դ���ļ��з�������Ƿdz����õġ�ʹ��һ �� header �ļ�װ�������ţ�����һ��װ˽�˷�����ζ����� ��ı������Դ���ļ����ڲ��ṹ�������ֻ�����±������� ����Ҫ���±�����Щʹ�����Ĺ��� header �ļ���������Դ�� ����

      iii) ��Ҫ�ڶ�� header �ļ����ظ�������Ϣ�� �����Ҫ�� ������һ�� header �ļ��� #include ��һ������ �Dz�Ҫ�ظ�������ͬ�� header ��Ϣ���Ρ�ԭ����������Ժ�� ���������Ϣ����ֻ��Ҫ�����ı�һ�Σ������������ı�����һ ���ظ�����Ϣ��

      iv) ��ÿһ��Դ���ļ�� #include ��Щ������Դ���ļ��еķ� �ŵ����� header �ļ�������һ��������Դ���ļ��� header �ļ���ijЩ����������ì���������ԱȽ����׵ı����������֡�

    1.4 ���ڳ��������ע��

      a) ����� (Identifier) ��Դ���ļ��е�ì�ܣ��ڣ�������ͺ�����ȱ ʡ״̬�ǹ��õġ���ˣ��κΣ�Դ�뵵�����������ô���������Դ �뵵�е�ͨ�� (global) ������ͨ�ñ�������ʹ�������û���Ǹ��� ��������������ԭ�͡��������뱣֤�ڲ�ͬ�����������ﲻ�� ��ͬһ���������ƣ�����������Ӵ�������ڱ���ʱ���о��档

      һ�ֱ������ִ���ķ������ڹ��õķ���ǰ���ϸ�������Դ�ļ��� �ص�ǰ׺�����磺������ 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 ���ж�����Ҳûʲô��ʧ���������Ǹ���ϰ�ߡ�

    1.5 ���±���һ�����ļ���Ŀ

    ������������������Ǻ���Ҫ�ġ�������ʹ��Դ���ļ�������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 ���ߡ�

    ���üһ���ڲſ�ʼ�����¡���ѧ���������û����

2) GNU Make ����
~~~~~~~~~~~~~~~~
    2.1 ���� makefile �ṹ

    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 �ı�������Щ �����Ǵ�Сд���еģ�һ��ʹ�ô�д��ĸ�����ǿ��ԴӼ����κ� �ط������ã�Ҳ���Ա��������ܶ����飬���磺
      i) ����һ���ļ����б������������������ɿ�ִ���ļ��� �������һЩĿ���ļ�����Ϊ���������������������� ��ͬ������Щ�ļ������͸� gcc ��Ϊ���������������� ��ʹ��һ���������������е�Ŀ���ļ����������µ�Ŀ�� �ļ����ļ򵥶��ҽϲ��׳�����

      ii) �����ִ���ļ�������������Ŀ������һ���� gcc ��ϵ ͳ������������ʹ��һ����ͬ�ı�����������뽫�� ��ʹ�ñ������ĵط��ij����µı����������������ʹ��һ �����������������������ô��ֻ��Ҫ�ı�һ���ط����� �����еط����������Ͷ��ı��ˡ�

      iii) �����������ꡣ��������������еı��������һ�� ��ͬ��ѡ����� -Wall -O -g��������������ѡ��� ��һ����������ô����԰���������������к��б����� �ĵط���������Ҫ�ı�ѡ���ʱ����ֻ����һ���ط��� ��������������ݡ�
    Ҫ�趨һ����������ֻҪ��һ�еĿ�ʼд��������������֣��� ���һ�� = �ţ��������Ҫ�趨�����������ֵ���Ժ���Ҫ���� ���������дһ�� $ ���ţ�������Χ��������ı������������� ���棬���ǰ�ǰ��� makefile ���ñ�����дһ�飺

    === 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 �ļ�����������Ĺ�����������ң��һ�������õġ�

3 �ܽ�
~~~~~~~~~~~~~~~

��ϣ����ƪ�����㹻��ϸ�Ľ����˶��ļ���Ŀ����ô�����ģ�Ҳ˵���� ������ȫ��������ʹ���������ˣ���Ӧ�ÿ������ɵ����� 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

 

��