创建Makefile以在C ++的不同环境中使用

时间:2018-02-27 10:53:15

标签: c++ makefile

我想在两个不同的环境中编译和运行我的程序。两个环境中的库安装在略有不同的位置,从而产生不同的makefile行:
在makefile A:

CXXFLAGS=-I$(DIR) -flto -fopenmp -O3 -g -march=native -std=gnu++17 -c -I/opt/interp2d/include -std=c++17 -I/opt/splinter/include -I/usr/include/eigen3

在makefile B中:

CXXFLAGS=-I$(DIR) -nostindc++ -I~/local_opt/eigen/include/eigen3/ -I~/local_opt/boost/include -I~/local_opt/armadillo/include -flto -fopenmp -O3 -g -march=native -std=gnu++17 -c -I~/local_opt/interp2d/include -std=c++17 -I~/local_opt/splinterp/include -I/usr/include/eigen3

我现在的问题是我在第一台机器上使用makefile A开发程序,但也在第二台机器上部署它。部署使用git完成 每次我在第二台机器上执行git pull时,我必须修复makefile中的所有路径才能正确编译程序。尽管如此,我仍然希望在git存储库中包含makefile,以便将两个makefile保持在关于编译标志和链接库的同一级别。
因此,是否有更简单的方法仍然通过git同步makefile,同时为库使用不同的路径并包括?

3 个答案:

答案 0 :(得分:2)

我认为您可以通过conditionally在公共文件(例如:CXXFLAGS)中设置变量config.mk并在您的文件中设置including该文件来解决您的问题。

例如,用于设置CXXFLAGS变量的值可能取决于环境变量HOST的值:

ifeq ($(HOST),A)
   CXXFLAGS = ... # for machine A
else # B
   CXXFLAGS = ... # for machine B
endif

然后,在config.mkmakefileA中包含此makefileB生成文件:

include config.mk

答案 1 :(得分:2)

我喜欢this answer但是,我认为我会提到这一点是为了完整:如果你有很多不同的主机,你可以做一些事情来实现:

export DJANGO_APP=microblog.py

然后创建include HostConfig_$(HOST).mk HostConfig_A.mk设置主机特定标志(Be it目录等)。如果您正在管理具有许多不同主机特定变量的大型项目,这将非常有用。

同样,(对于较小的项目),您可以采取以下措施:

HostConfig_B.mk

答案 2 :(得分:1)

这个问题的传统答案是配置脚本(请参阅automake,广泛使用的框架的autoconf)。检查完源后运行./configure --with-eigen =〜/ local_opt / eigen / include / eigen3 /它会相应调整Makefile(通常从Makefile.in生成Makefile,只有Makefile.in在git中)

注意:正确完成后,您只需要在第一次结帐时运行configure,而不是在更新时运行configure。 make可以根据需要自动生成Makefile。