如何使用makefile将模块保存在单独的目录中

时间:2015-11-16 12:16:01

标签: makefile fortran

我正在使用一个简单的makefile编译我自己的一些FORTRAN代码,但不喜欢让我的代码目录与* .mod和* .o文件混乱。 有没有一种简单的方法可以编辑我的makefile,以便这些编译的文件放在一个单独的目录(类似./obj/)?我在这里搜索并谷歌找到一些例子,但我不能让他们中的任何一个工作。可能因为我对makefile和fortran的经验很少(直到现在才编码C)。

以下是我当前的makefile:

LIBBASE=/my/lib/dir/

HDF5LIB=$(LIBBASE)/hdf5/lib
HDF5INCLUDE=$(LIBBASE)/hdf5/include

MYLIB_LIB=$(LIBBASE)/mylib
MYLIB_INCLUDE=$(LIBBASE)/mylib

LIBS=-L$(HDF5LIB) -lhdf5 -lhdf5_fortran -lhdf5hl_fortran \
     -L$(MYLIB_LIB) -lmylib

INC=-I./ -I$(HDF5INCLUDE) -I$(MYLIB_INCLUDE) -DINCLUDE_MYLIB

# Compiler
F90     =   ifort
CC      =   ifort

FLAGS   =   -g -O2 -openmp

# ------ No machine-specific paths/variables after this  -----

FSOURCE = my_structures my_constants my_utils my_prog MainMOD
OBJECTS = my_structures.o my_constants.o my_utils.o my_prog.o

all:    $(FSOURCE)

MainMOD: MainMOD.F90 
    $(F90) $(FLAGS) -o  $@ $(INC) MainMOD.F90 $(LIBS) $(OBJECTS)
my_structures: my_structures.F90 
    $(F90) $(FLAGS) -c $(INC) imager_structures.F90 $(LIBS) 
my_prog: my_prog.F90
    $(F90) $(FLAGS) -c $(INC) my_prog.F90 $(LIBS) 
my_constants: my_constants.F90 
    $(F90) $(FLAGS) -c $(INC) preproc_constants.F90 $(LIBS) 
utils: my_utils.F90 
    $(F90) $(FLAGS) -c $(INC) my_utils.F90 $(LIBS) 

clean:
    rm -f $(FSOURCE) $(OBJECTS)

# Compilation rules


$(OBJ_DIR)\\%.o: %.F90
    $(F90) $(FLAGS) -c $@ $<

# Rule to prevent make from identifying Fortran .mod files as Modula2 source
# files
%.o : %.mod

1 个答案:

答案 0 :(得分:1)

首先,Makefile的工作方式基于 targets sources 位于同一目录中。当然,你可以做相反的事情,但Makefile并没有考虑到那个选项,所以你必须让你的食谱有点难看。

现在,如果我真的想要将目标文件放在一个单独的目录中,并且仅仅使用cmake来限制,我会使用make,而make则假设$(OBJ_DIR)\\%.o: %.F90 源与构建文件分开。

如果您仍想使用$(OBJ_DIR)/%.o: %.F90 ,那么我认为您需要修复一件事。 从

.SUFFIXES:

public class SoundStream extends Thread {
    private int port;
    private String IP;
    private Socket socket;

    private SoundObject soundObject;

    private OpenAL openAL;
    private Source source;

    private boolean run = true;

    public SoundStream(int port, String IP, SoundObject soundObject) {
        this.soundObject = soundObject;
        this.port = port;
        this.IP = IP;
    }

    public void run() {
        try {
            this.socket = new Socket(this.IP, this.port);
            this.openAL = new OpenAL();
        } catch (Exception e) {
            e.printStackTrace();
        }
        this.mainCycleMethod();
    }

    private void mainCycleMethod() {
        while (run) {
            this.soundObject.blockAndWait();
            switch (this.soundObject.getAndResetEvent()) {
                case 0:
                    this.run = false;
                    this.close();
                    break;
                case 1:
                    this.setPitch();
                    break;
                case 2:
                    this.closeSource();
                    this.play();
                    break;
                case 3:
                    this.pause(true);
                    break;
                case 4:
                    this.pause(false);
                    break;
            }
        }
    }

    private BufferedInputStream getInputStream() throws Exception {
        return new BufferedInputStream(socket.getInputStream());
    }

    private void setPitch() {
        if(this.source != null) {
            try {
                this.source.setPitch(this.soundObject.getPitch());
            } catch (ALException e) {
                e.printStackTrace();
            }
        }
    }

    private void play() {
        try {
            AudioInputStream audioInputStream = new AudioInputStream(this.getInputStream(), this.soundObject.getAudioFormat(), AudioSystem.NOT_SPECIFIED);
//            AudioInputStream audioInputStream_tmp = AudioSystem.getAudioInputStream(this.getInputStream());
//            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(this.soundObject.getAudioFormat(), audioInputStream_tmp);
            this.source = openAL.createSource(audioInputStream);
            this.source.setGain(1f);
            this.source.play();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private void close() {
        this.closeSource();
        this.openAL.close();
        try {
            this.socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void closeSource() {
        if(this.source!=null) {
            this.source.close();
        }
    }

    private void pause(boolean pause) {
        if(this.source != null) {
            try {
                if (pause) {
                    this.source.pause();
                } else {
                    this.source.play();
                }
            } catch (ALException ex) {
                ex.printStackTrace();
            }
        }
    }
}


public class SoundObject extends AbstractEventObject {
    public AudioFormat getAudioFormat() {
        boolean signed = false;
        //true,false
        boolean bigEndian = false;
        //true,false
        return new AudioFormat(this.frequency, this.bits, this.channels, signed, bigEndian);
    }
.
.
.
.
}

此外,

  

%。o:%。mod

如果你输入

,则不需要

AudioInputStream audioInputStream_tmp = AudioSystem.getAudioInputStream(this.getInputStream());

在文件的第一行。这将关闭所有implicit rules,因为您还是不使用它们。