# Adapted from Arch Linux openmp PKGBUILD at: # https://github.com/archlinux/svntogit-packages/raw/packages/openmp/trunk/PKGBUILD require 'package' class Openmp < Package llvm_build_obj = Package.load_package("#{__dir__}/#{CREW_LLVM_VER}_build.rb") description 'LLVM OpenMP Runtime Library' homepage 'https://openmp.llvm.org/' version llvm_build_obj.version # When upgrading llvm_build*, be sure to upgrade llvm_lib*, llvm_dev*, libclc, and openmp in tandem. puts "#{self} version differs from llvm version #{llvm_build_obj.version}".orange if version != llvm_build_obj.version license 'Apache-2.0-with-LLVM-exceptions, UoI-NCSA, BSD, public-domain, rc, Apache-2.0 and MIT' compatibility 'all' source_url 'https://github.com/llvm/llvm-project.git' git_hashtag llvm_build_obj.git_hashtag.to_s binary_compression 'tar.zst' binary_sha256({ aarch64: 'fb5a13f992a29ca52b7fbe0722978d444f42758da61c2ed77f1ea8ce894dc800', armv7l: 'fb5a13f992a29ca52b7fbe0722978d444f42758da61c2ed77f1ea8ce894dc800', i686: '67b135fc3762a28d2d5f03c0987a3f6fec59b1b669e9a842e38a937a857e4531', x86_64: '063a7043b77519874cfbd0d561bdea8cb4953e91fd79ee20ee224eb34be36e18' }) depends_on 'gcc_lib' # R depends_on 'glibc' # R depends_on 'llvm_dev' => :build depends_on 'python3' # R no_env_options def self.preflight llvm_dev_obj = Package.load_package("#{__dir__}/#{CREW_LLVM_VER}_dev.rb") abort "Update #{CREW_LLVM_VER}_dev first.".lightred if Gem::Version.new(version.split('-').first) > Gem::Version.new(llvm_dev_obj.version.split('-').first) end def self.patch # Remove rc suffix on final release. system "sed -i 's,set(LLVM_VERSION_SUFFIX rc),,' llvm/CMakeLists.txt" # Patch for LLVM 15+ because of https://github.com/llvm/llvm-project/issues/58851 File.write 'llvm_crew_lib_prefix.patch', <<~LLVM_PATCH_EOF --- a/clang/lib/Driver/ToolChains/Linux.cpp 2022-11-30 15:50:36.777754608 -0500 +++ b/clang/lib/Driver/ToolChains/Linux.cpp 2022-11-30 15:51:57.004417484 -0500 @@ -314,6 +314,7 @@ Linux::Linux(const Driver &D, const llvm D.getVFS().exists(D.Dir + "/../lib/libc++.so")) addPathIfExists(D, D.Dir + "/../lib", Paths); + addPathIfExists(D, concat(SysRoot, "#{CREW_LIB_PREFIX}"), Paths); addPathIfExists(D, concat(SysRoot, "/lib"), Paths); addPathIfExists(D, concat(SysRoot, "/usr/lib"), Paths); } LLVM_PATCH_EOF system 'patch -Np1 -i llvm_crew_lib_prefix.patch' end def self.build @cmake_options = case ARCH when 'i686', 'x86_64' CREW_CMAKE_OPTIONS.gsub('-flto=auto', '').sub('-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=TRUE', '') else CREW_CMAKE_OPTIONS end system "cmake -B builddir -G Ninja openmp \ #{@cmake_options} \ -DCLANG_DEFAULT_LINKER=mold \ -DCMAKE_C_COMPILER=$(which clang) \ -DCMAKE_C_COMPILER_TARGET=#{CREW_TARGET} \ -DCMAKE_CXX_COMPILER=$(which clang++) \ -DCMAKE_CXX_COMPILER_AR=$(which llvm-ar) \ -DCMAKE_CXX_COMPILER_RANLIB=$(which llvm-ranlib) \ -D_CMAKE_TOOLCHAIN_PREFIX=llvm- \ -DLIBOMP_ENABLE_SHARED=ON \ -DLIBOMP_INSTALL_ALIASES=OFF \ -DLLVM_INCLUDE_BENCHMARKS=OFF \ -DOPENMP_LIBDIR_SUFFIX=#{CREW_LIB_SUFFIX} \ -DPYTHON_EXECUTABLE=$(which python3) \ -Wno-dev" system "#{CREW_NINJA} -C builddir" end def self.install system "DESTDIR=#{CREW_DEST_DIR} #{CREW_NINJA} -C builddir install" end end