在 CRAN 上传递一个 R 包,在 MACOS 上由于 + OpenMP 出现问题

Pass an R package on CRAN with issues on MACOS due + OpenMP

我有一个 R package Fortran 和 OpenMP 无法通过 CRAN。我收到以下消息:

Your package no longer installs on macOS with OpenMP issues.

我的 Makevars 文件是:

USE_FC_TO_LINK =
PKG_FFLAGS = $(SHLIB_OPENMP_FFLAGS)
PKG_LIBS = $(SHLIB_OPENMP_FFLAGS)

C_OBJS = init.o
FT_OBJS = e_bottomup.o e_topdown.o check_nt.o

all:
    @$(MAKE) $(SHLIB)
    @rm -f  *.o

$(SHLIB): $(FT_OBJS) $(C_OBJS)

init.o:  e_bottomup.o e_topdown.o check_nt.o

如何解决这个问题?谢谢。

编辑 1:

我尝试添加标志 cpp:

USE_FC_TO_LINK =
PKG_FFLAGS = $(SHLIB_OPENMP_FFLAGS) *-cpp*
PKG_LIBS = $(SHLIB_OPENMP_FFLAGS)

在 !omp 之前的 Fortran 代码中添加条件 #ifdef _OPENMP...

但是通过 R CMD Check 我得到了消息:

Non-portable flags in variable 'PKG_FFLAGS': -cpp

你可以看看 data.table 包是如何使用 #ifdef _OPENMP 来处理的:https://github.com/Rdatatable/data.table/blob/master/src/myomp.h 我猜它在 Fortran 中应该非常相似

#ifdef _OPENMP
  #include <omp.h>
#else
  // for machines with compilers void of openmp support
  #define omp_get_num_threads()  1
  #define omp_get_thread_num()   0
  #define omp_get_max_threads()  1
  #define omp_get_thread_limit() 1
  #define omp_get_num_procs()    1
  #define omp_set_nested(a)   // empty statement to remove the call
  #define omp_get_wtime()        0
#endif

Makevars 文件没问题。 OMP 指令必须注释 !$,包括 USE OMP。

例如,我用 Fortran 和 OMP 创建了一个 R 包来测试(并使用它)。

我包含了一个 R 函数来 return 每台机器的最大线程数:

get_threads

Fortran 代码是:

SUBROUTINE checkntf (nt) 
!$ USE OMP_LIB

IMPLICIT NONE
INTEGER nt

!$ nt = OMP_GET_MAX_THREADS()

RETURN
END

已在 Windows、Ubuntu 和 macOS 上安装,如图 here