Adjust Makefiles to support cross-compilation

未关闭
#1,004 15 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
4/5
预计耗时
3-5 天
新手友好度
42/100
Issue 类型
功能
描述清晰度
描述清楚
活跃度
停滞
技术栈
cpp
领域
build-system

调研方向

从 stan/lib/stan_math/make/compiler_flags 和 stan/lib/stan_math/make/libraries 开始,然后检查 build/ 下引用的 TBB Makefiles。使用与主机不同的 TARGET_OS 调用现有的 Make 目标,并验证平台特定的后缀、标志以及 TBB 构建使用目标操作系统。

由索引模型根据 Issue 内容生成。

描述

Summary:

Allow setting a new variable, TARGET_OS, which is used instead of OS when it determines a property of the compiled files.

Description:

The existing codebase assumes that the current OS is the same as the OS that will be running the compiled program. This is not always the case. In my case I am running macOS but running my Stan programs on Linux.

I'm including the patch I've come up with here, in case it's helpful to others.

diff --git a/stan/lib/stan_math/make/compiler_flags b/stan/lib/stan_math/make/compiler_flags
index 8106f58b..4cf67576 100644
--- a/stan/lib/stan_math/make/compiler_flags
+++ b/stan/lib/stan_math/make/compiler_flags
@@ -15,16 +15,19 @@ ifneq ($(OS),Windows_NT)
   OS := $(shell uname -s)
 endif
 
+## Allow cross compiling to another target operating system
+TARGET_OS ?= $(OS)
+
 ## Set OS specific library filename extensions
-ifeq ($(OS),Windows_NT)
+ifeq ($(TARGET_OS),Windows_NT)
   LIBRARY_SUFFIX ?= .dll
 endif
 
-ifeq ($(OS),Darwin)
+ifeq ($(TARGET_OS),Darwin)
   LIBRARY_SUFFIX ?= .dylib
 endif
 
-ifeq ($(OS),Linux)
+ifeq ($(TARGET_OS),Linux)
   LIBRARY_SUFFIX ?= .so
 endif
 
@@ -145,7 +148,7 @@ CXXFLAGS_SUNDIALS ?= -pipe $(CXXFLAGS_OPTIM_SUNDIALS) $(CPPFLAGS_FLTO_SUNDIALS)
 ################################################################################
 # Update compiler flags with operating system specific modifications
 ##
-ifeq ($(OS),Windows_NT)
+ifeq ($(TARGET_OS),Windows_NT)
   CXXFLAGS_WARNINGS ?= -Wall -Wno-unused-function -Wno-uninitialized -Wno-unused-but-set-variable -Wno-unused-variable -Wno-sign-compare -Wno-unused-local-typedefs -Wno-int-in-bool-context -Wno-attributes
   CPPFLAGS_GTEST ?= -DGTEST_HAS_PTHREAD=0
   CPPFLAGS_OS ?= -D_USE_MATH_DEFINES
@@ -166,13 +169,13 @@ ifeq ($(OS),Windows_NT)
   EXE := .exe
 endif
 
-ifeq ($(OS),Darwin)
+ifeq ($(TARGET_OS),Darwin)
   ifeq (clang,$(CXX_TYPE))
     CXXFLAGS_OS ?= -Wno-unknown-warning-option -Wno-tautological-compare -Wno-sign-compare
   endif
 endif
 
-ifeq ($(OS),Linux)
+ifeq ($(TARGET_OS),Linux)
   CPPFLAGS_GTEST ?= -DGTEST_HAS_PTHREAD=0
   CXXFLAGS_WARNINGS ?= -Wno-sign-compare
   ifeq (gcc,$(CXX_TYPE))
@@ -252,13 +255,13 @@ LDLIBS_TBB ?=
 
 else
 
-ifeq ($(OS),Windows_NT)
+ifeq ($(TARGET_OS),Windows_NT)
   TBB_TARGETS ?= $(addprefix $(TBB_BIN)/,$(addsuffix $(LIBRARY_SUFFIX),$(TBB_LIBRARIES)))
 endif
-ifeq ($(OS),Darwin)
+ifeq ($(TARGET_OS),Darwin)
   TBB_TARGETS ?= $(addprefix $(TBB_BIN)/lib,$(addsuffix $(LIBRARY_SUFFIX), $(TBB_LIBRARIES)))
 endif
-ifeq ($(OS),Linux)
+ifeq ($(TARGET_OS),Linux)
   # Update the suffix with the internal TBB source code!
   # The new version of TBB library is 12+ (e.g., libtbb.so.12.1 not libtbb.so.2)
   TBB_TARGETS ?= $(addprefix $(TBB_BIN)/lib,$(addsuffix $(LIBRARY_SUFFIX).2,$(TBB_LIBRARIES)))
diff --git a/stan/lib/stan_math/make/libraries b/stan/lib/stan_math/make/libraries
index fcababa0..325ab05c 100644
--- a/stan/lib/stan_math/make/libraries
+++ b/stan/lib/stan_math/make/libraries
@@ -119,6 +119,8 @@ ifeq ($(CXX_TYPE),other)
 endif
 TBB_CXX_TYPE ?= $(CXX_TYPE)
 
+TBB_OS ?= $(shell echo $(TARGET_OS) | tr '[:upper:]' '[:lower:]')
+
 # Set c compiler used for the TBB
 ifeq (clang,$(CXX_TYPE))
   TBB_CC ?= $(subst clang++,clang,$(CXX))
@@ -166,11 +168,11 @@ endif
 $(TBB_BIN)/tbb.def: $(TBB_BIN)/tbb-make-check $(TBB_BIN)/tbbmalloc.def
 	@mkdir -p $(TBB_BIN)
 	touch $(TBB_BIN)/version_$(notdir $(TBB))
-	tbb_root="$(TBB_RELATIVE_PATH)" CXX="$(CXX)" CC="$(TBB_CC)" LDFLAGS='$(LDFLAGS_TBB)' '$(MAKE)' -C "$(TBB_BIN)" -r -f "$(TBB_ABSOLUTE_PATH)/build/Makefile.tbb" compiler=$(TBB_CXX_TYPE) cfg=release stdver=c++1y  CXXFLAGS="$(TBB_CXXFLAGS)"
+	tbb_root="$(TBB_RELATIVE_PATH)" CXX="$(CXX)" CC="$(TBB_CC)" LDFLAGS='$(LDFLAGS_TBB)' '$(MAKE)' -C "$(TBB_BIN)" -r -f "$(TBB_ABSOLUTE_PATH)/build/Makefile.tbb" compiler=$(TBB_CXX_TYPE) tbb_os=$(TBB_OS) cfg=release stdver=c++1y  CXXFLAGS="$(TBB_CXXFLAGS)"
 
 $(TBB_BIN)/tbbmalloc.def: $(TBB_BIN)/tbb-make-check
 	@mkdir -p $(TBB_BIN)
-	tbb_root="$(TBB_RELATIVE_PATH)" CXX="$(CXX)" CC="$(TBB_CC)" LDFLAGS='$(LDFLAGS_TBB)' '$(MAKE)' -C "$(TBB_BIN)" -r -f "$(TBB_ABSOLUTE_PATH)/build/Makefile.tbbmalloc" compiler=$(TBB_CXX_TYPE) cfg=release stdver=c++1y malloc CXXFLAGS="$(TBB_CXXFLAGS)"
+	tbb_root="$(TBB_RELATIVE_PATH)" CXX="$(CXX)" CC="$(TBB_CC)" LDFLAGS='$(LDFLAGS_TBB)' '$(MAKE)' -C "$(TBB_BIN)" -r -f "$(TBB_ABSOLUTE_PATH)/build/Makefile.tbbmalloc" compiler=$(TBB_CXX_TYPE) tbb_os=$(TBB_OS) cfg=release stdver=c++1y malloc CXXFLAGS="$(TBB_CXXFLAGS)"
 
 $(TBB_BIN)/libtbb.dylib: $(TBB_BIN)/tbb.def
 $(TBB_BIN)/libtbbmalloc.dylib: $(TBB_BIN)/tbbmalloc.def

Note that this patch assumes that you have also set a number of other environment variables to reasonable values. In my case that has meant setting:

  • CXX
  • CXXFLAGS_PROGRAM
  • CXXFLAGS_LANG
  • CXXFLAGS
  • CXXFLAGS_OPTIM_TBB
  • LDFLAGS_TBB
Current Version:

v2.26.1

主要语言
C++
星标
240
派生
105
PR 合并指标
30 天内没有已合并 PR

环境准备

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

stan-dev/cmdstan 的其他 Issue

查看 stan-dev/cmdstan 的全部 Issue

相似的 Issue

更多 C++ Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。