与源文件名无关的通用makefile

时间:2012-04-10 07:29:49

标签: c makefile

我想创建一个通用的makefile,它可以将源文件名编译成它,将其保存为目标文件和可执行文件。两个文件都使用原始源名称。谢谢您的帮助。

     exec: \

     compile
     ./helloworld  #I would like to input source outside the make file.




    compile: \

    helloworld.c 

    gcc -Wall helloworld.c -o helloworld #<==

    echo 'compiling'             
    touch compile


#I would like makefile to automatically save both object and exec. 
#as the source file name.

2 个答案:

答案 0 :(得分:1)

您可以使用$(MAKECMDGOALS)变量:

CFLAGS = -Wall

$(MAKECMDGOALS): $(MAKECMDGOALS).o

然后简单地调用Make这样:

make myfile

如果你有Make 3.81或更高版本,那么这可以成为:

CFLAGS = -Wall

.SECONDARY:  # Prevents intermediate files from being deleted

如果您对保存中间对象文件不感兴趣,那么您甚至不需要Makefile。你可以这样做:

make bar CFLAGS=-Wall

答案 1 :(得分:1)

Make具有内置规则,这些规则知道如何从源文件创建可执行文件(如果它们具有相同的名称)。所以你甚至根本不需要makefile!

$ ls
foobar.c

$ make foobar
cc foobar.c -o foobar

不是没有必要搞乱.SECONDARY因为make有一个直接规则来从.c构建可执行文件,而不首先编译.o(所以没有中间文件)。即使它没有,这里保留.o文件没有任何优势,所以这不值得额外的努力(IMO)。

如果你想改变编译器或标志,你可以有一个除了一些变量赋值之外什么都没有的makefile:

$ ls
foobar.c        Makefile

$ cat Makefile
CC = gcc
CFLAGS = -Wall

$ make foobar
gcc -Wall foobar.c -o foobar