如何在Homebrew Formula中获取LLVM安装前缀配置编译环境
问题
我正在为一款C++20软件打包Homebrew Formula,该软件无法使用Apple默认clang编译(至少在Monterey系统下不行,Ventura尚未测试),因此需要使用Homebrew llvm Formula提供的clang(对应LLVM 14版本)进行编译。在bash中我通过以下方式设置环境变量:
export CC=$(brew --prefix llvm)/bin/clang export CXX=$(brew --prefix llvm)/bin/clang++ export LDFLAGS="-L$(brew --prefix llvm)/lib -Wl,-rpath,$(brew --prefix llvm)/lib" export CXXFLAGS="-I$(brew --prefix llvm)/include"
我知道在Formula的def install代码块中可以用ENV["variable"] = "value"设置环境变量,但这些值依赖于llvm Formula的安装前缀。由于我完全不熟悉Ruby语法,请问如何在Formula的def install块中构造这些依赖llvm安装前缀的字符串?
解决方案
在Homebrew Formula中,你可以通过Formula["llvm"].prefix获取llvm的安装前缀,以此替代bash里的$(brew --prefix llvm),用Ruby的字符串插值语法就能轻松构造所需环境变量。
步骤1:声明llvm依赖
先在Formula开头添加编译阶段的llvm依赖:
depends_on "llvm" => :build
步骤2:在def install中设置环境变量
直接用字符串插值拼接路径,代码示例如下:
def install llvm_prefix = Formula["llvm"].prefix ENV["CC"] = "#{llvm_prefix}/bin/clang" ENV["CXX"] = "#{llvm_prefix}/bin/clang++" ENV["LDFLAGS"] = "-L#{llvm_prefix}/lib -Wl,-rpath,#{llvm_prefix}/lib" ENV["CXXFLAGS"] = "-I#{llvm_prefix}/include" # 写入你的编译安装逻辑,比如: system "./configure", *std_configure_args system "make" system "make", "install" end
关键说明
#{llvm_prefix}是Ruby字符串插值语法,作用和bash的$()一致,会把变量值插入到字符串对应位置。Formula["llvm"].prefix会自动获取Homebrew安装llvm的前缀路径,和brew --prefix llvm输出结果完全相同。- 声明
:build类型依赖,是因为llvm仅在编译阶段需要,无需作为软件的运行时依赖。
内容的提问来源于stack exchange,提问作者Nicola Gigante
相关产品推荐
相关产品推荐

