我想在两个不同的环境中编译和运行我的程序。两个环境中的库安装在略有不同的位置,从而产生不同的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,同时为库使用不同的路径并包括?
答案 0 :(得分:2)
我认为您可以通过conditionally在公共文件(例如:CXXFLAGS
)中设置变量config.mk
并在您的文件中设置including该文件来解决您的问题。
例如,用于设置CXXFLAGS
变量的值可能取决于环境变量HOST
的值:
ifeq ($(HOST),A)
CXXFLAGS = ... # for machine A
else # B
CXXFLAGS = ... # for machine B
endif
然后,在config.mk
和makefileA
中包含此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。