Templight package (#8782)
* First draft of a templight recipe * Let's be explicit for now, we can be clever later on * The clang6 version does not work, drop it * Reorder FIXMEs more logically * Add patch for current templight develop branch * Create an artificial stable release of templight * Take some additional inspiration from llvm package * Added the templight supporting tools * Remove old notes from the no-url branch * Avoid unnecessary join_path
This commit is contained in:
		 Hadrien G
					Hadrien G
				
			
				
					committed by
					
						 Adam J. Stewart
						Adam J. Stewart
					
				
			
			
				
	
			
			
			 Adam J. Stewart
						Adam J. Stewart
					
				
			
						parent
						
							80741bc427
						
					
				
				
					commit
					8b718e7cd6
				
			
							
								
								
									
										37
									
								
								var/spack/repos/builtin/packages/templight-tools/package.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								var/spack/repos/builtin/packages/templight-tools/package.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| ############################################################################## | ||||
| # Copyright (c) 2013-2018, Lawrence Livermore National Security, LLC. | ||||
| # Produced at the Lawrence Livermore National Laboratory. | ||||
| # | ||||
| # This file is part of Spack. | ||||
| # Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. | ||||
| # LLNL-CODE-647188 | ||||
| # | ||||
| # For details, see https://github.com/spack/spack | ||||
| # Please also see the NOTICE and LICENSE files for our notice and the LGPL. | ||||
| # | ||||
| # This program is free software; you can redistribute it and/or modify | ||||
| # it under the terms of the GNU Lesser General Public License (as | ||||
| # published by the Free Software Foundation) version 2.1, February 1999. | ||||
| # | ||||
| # This program is distributed in the hope that it will be useful, but | ||||
| # WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and | ||||
| # conditions of the GNU Lesser General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU Lesser General Public | ||||
| # License along with this program; if not, write to the Free Software | ||||
| # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||||
| ############################################################################## | ||||
| from spack import * | ||||
|  | ||||
|  | ||||
| class TemplightTools(CMakePackage): | ||||
|     """Supporting tools for the Templight Profiler""" | ||||
|  | ||||
|     homepage = "https://github.com/mikael-s-persson/templight-tools" | ||||
|     git      = "https://github.com/mikael-s-persson/templight-tools.git" | ||||
|  | ||||
|     version('develop', branch='master') | ||||
|  | ||||
|     depends_on('cmake @2.8.7:', type='build') | ||||
|     depends_on('boost @1.48.1: +filesystem +graph +program_options +test') | ||||
| @@ -0,0 +1,44 @@ | ||||
| --- a/templight_driver.cpp	2018-07-20 17:32:51.064430826 +0200 | ||||
| +++ b/templight_driver.cpp	2018-07-20 17:33:58.476431081 +0200 | ||||
| @@ -57,6 +57,9 @@ | ||||
|  #include "llvm/Support/TargetSelect.h" | ||||
|  #include "llvm/Support/Timer.h" | ||||
|  #include "llvm/Support/raw_ostream.h" | ||||
| +#ifdef _WIN32 | ||||
| +#include "Windows/WindowsSupport.h" | ||||
| +#endif | ||||
|   | ||||
|  #include "TemplightAction.h" | ||||
|   | ||||
| @@ -475,7 +478,21 @@ | ||||
|   | ||||
|  } | ||||
|   | ||||
| - | ||||
| +// llvm::sys::Process::GetArgumentVector was renamed as of rL330216 | ||||
| +// https://reviews.llvm.org/rL330216 | ||||
| +// This aims to preserves compatibility, but the better way to do it would | ||||
| +// be to let InitLLVM do the job | ||||
| +std::error_code GetArgumentVector( | ||||
| +    SmallVectorImpl<const char *> &ArgsOut, ArrayRef<const char *> ArgsIn, | ||||
| +    SpecificBumpPtrAllocator<char> &ArgAllocator) { | ||||
| +#ifdef _WIN32 | ||||
| +  return windows::GetCommandLineArguments(ArgsOut, ArgAllocator); | ||||
| +#else | ||||
| +  ArgsOut.append(ArgsIn.begin(), ArgsIn.end()); | ||||
| +  (void)ArgAllocator; | ||||
| +  return std::error_code(); | ||||
| +#endif | ||||
| +} | ||||
|   | ||||
|  int main(int argc_, const char **argv_) { | ||||
|    llvm::sys::PrintStackTraceOnErrorSignal(argv_[0]); | ||||
| @@ -486,7 +503,7 @@ | ||||
|   | ||||
|    SmallVector<const char *, 256> argv; | ||||
|    llvm::SpecificBumpPtrAllocator<char> ArgAllocator; | ||||
| -  std::error_code EC = llvm::sys::Process::GetArgumentVector( | ||||
| +  std::error_code EC = GetArgumentVector( | ||||
|        argv, llvm::makeArrayRef(argv_, argc_), ArgAllocator); | ||||
|    if (EC) { | ||||
|      llvm::errs() << "error: couldn't get arguments: " << EC.message() << '\n'; | ||||
							
								
								
									
										166
									
								
								var/spack/repos/builtin/packages/templight/package.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								var/spack/repos/builtin/packages/templight/package.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,166 @@ | ||||
| ############################################################################## | ||||
| # Copyright (c) 2013-2018, Lawrence Livermore National Security, LLC. | ||||
| # Produced at the Lawrence Livermore National Laboratory. | ||||
| # | ||||
| # This file is part of Spack. | ||||
| # Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. | ||||
| # LLNL-CODE-647188 | ||||
| # | ||||
| # For details, see https://github.com/spack/spack | ||||
| # Please also see the NOTICE and LICENSE files for our notice and the LGPL. | ||||
| # | ||||
| # This program is free software; you can redistribute it and/or modify | ||||
| # it under the terms of the GNU Lesser General Public License (as | ||||
| # published by the Free Software Foundation) version 2.1, February 1999. | ||||
| # | ||||
| # This program is distributed in the hope that it will be useful, but | ||||
| # WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and | ||||
| # conditions of the GNU Lesser General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU Lesser General Public | ||||
| # License along with this program; if not, write to the Free Software | ||||
| # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||||
| ############################################################################## | ||||
| from spack import * | ||||
| import os | ||||
|  | ||||
|  | ||||
| class Templight(CMakePackage): | ||||
|     """Templight is a Clang-based tool to profile the time and memory | ||||
|        consumption of template instantiations and to perform interactive | ||||
|        debugging sessions to gain introspection into the template | ||||
|        instantiation process.""" | ||||
|  | ||||
|     homepage = "https://github.com/mikael-s-persson/templight" | ||||
|     git      = "https://github.com/mikael-s-persson/templight.git" | ||||
|     llvm_svn = "http://llvm.org/svn/llvm-project/{0}/trunk" | ||||
|  | ||||
|     family = 'compiler'  # Used by lmod | ||||
|  | ||||
|     # Templight is a patch to clang, so we have three versions to care about: | ||||
|     # - The one that will be used in Spack specifications | ||||
|     # - The git branch that we need to fetch from in the templight repo | ||||
|     # - The svn tag that we need to fetch from in the LLVM repos | ||||
|     version('develop', branch='master') | ||||
|     resource(name='llvm-trunk', | ||||
|              svn=llvm_svn.format('llvm'), | ||||
|              destination='.', | ||||
|              placement='llvm', | ||||
|              when='@develop') | ||||
|     resource(name='clang-trunk', | ||||
|              svn=llvm_svn.format('cfe'), | ||||
|              destination='llvm/tools', | ||||
|              placement='clang', | ||||
|              when='@develop') | ||||
|  | ||||
|     # Templight has no stable release yet, and is supposed to be built against | ||||
|     # the LLVM trunk. As this is a brittle combination, I decided to | ||||
|     # artificially create a stable release based on what works today. Please | ||||
|     # feel free to remove this version once templight has stabilized. | ||||
|     version('2018.07.20', commit='91589f95427620dd0a2346bd69ba922f374aa42a') | ||||
|     resource(name='llvm-r337566', | ||||
|              svn=llvm_svn.format('llvm'), | ||||
|              revision=337566, | ||||
|              destination='.', | ||||
|              placement='llvm', | ||||
|              when='@2018.07.20') | ||||
|     resource(name='clang-r337566', | ||||
|              svn=llvm_svn.format('cfe'), | ||||
|              revision=337566, | ||||
|              destination='llvm/tools', | ||||
|              placement='clang', | ||||
|              when='@2018.07.20') | ||||
|     patch('develop-20180720.patch', when='@2018.07.20') | ||||
|  | ||||
|     # Clang debug builds can be _huge_ (20+ GB), make sure you know what you | ||||
|     # are doing before switching to them | ||||
|     variant('build_type', default='Release', | ||||
|             description='CMake build type', | ||||
|             values=('Debug', 'Release', 'RelWithDebInfo', 'MinSizeRel')) | ||||
|  | ||||
|     # NOTE: LLVM has many configurable tweaks and optional tools/extensions. | ||||
|     #       I did not think that  propagating all of these to a debugging and | ||||
|     #       performance analysis tool was worth the maintenance burden. But | ||||
|     #       if you disagree, the llvm package can be used for inspiration. | ||||
|  | ||||
|     depends_on('cmake@3.4.3:', type='build') | ||||
|     depends_on('python') | ||||
|     depends_on('py-lit', type=('build', 'run')) | ||||
|  | ||||
|     def patch(self): | ||||
|         # We start with the templight source tree and an "llvm" subdir. | ||||
|         # But we actually need an llvm source tree with a "templight" subdir. | ||||
|         # Let's flip the directory organization around | ||||
|         templight_files = os.listdir('.') | ||||
|         templight_files.remove('llvm') | ||||
|         templight_dir = 'llvm/tools/clang/tools/templight' | ||||
|         os.mkdir(templight_dir) | ||||
|         for name in templight_files: | ||||
|             os.rename(name, os.path.join(templight_dir, name)) | ||||
|         for name in os.listdir('llvm'): | ||||
|             os.rename(os.path.join('llvm', name), name) | ||||
|         os.rmdir('llvm') | ||||
|  | ||||
|         # Tell the clang build system that it needs to build templight | ||||
|         with open("tools/clang/tools/CMakeLists.txt", "a") as cmake_lists: | ||||
|             cmake_lists.write("add_clang_subdirectory(templight)") | ||||
|  | ||||
|     def setup_environment(self, spack_env, run_env): | ||||
|         spack_env.append_flags('CXXFLAGS', self.compiler.cxx11_flag) | ||||
|         run_env.set('CC', join_path(self.spec.prefix.bin, 'templight')) | ||||
|         run_env.set('CXX', join_path(self.spec.prefix.bin, 'templight++')) | ||||
|  | ||||
|     def cmake_args(self): | ||||
|         spec = self.spec | ||||
|  | ||||
|         # Templight is a debugging tool, not a production compiler, so we only | ||||
|         # need a very bare-bones build of clang | ||||
|         # | ||||
|         # Minimal build config ideas were taken from the llvm package, with | ||||
|         # the templight-specific assumption that we will always be building | ||||
|         # for LLVM / Clang 5.0+ and can safely ignore older tricks. | ||||
|         # | ||||
|         cmake_args = [ | ||||
|             '-DLLVM_REQUIRES_RTTI:BOOL=ON', | ||||
|             '-DCLANG_DEFAULT_OPENMP_RUNTIME:STRING=libomp', | ||||
|             '-DPYTHON_EXECUTABLE:PATH={0}'.format(spec['python'].command.path), | ||||
|             '-DLLVM_EXTERNAL_POLLY_BUILD:Bool=OFF', | ||||
|             '-DLLVM_TOOL_POLLY_BUILD:Bool=OFF', | ||||
|             '-DLLVM_POLLY_BUILD:Bool=OFF', | ||||
|             '-DLLVM_POLLY_LINK_INTO_TOOLS:Bool=OFF', | ||||
|             '-DLLVM_EXTERNAL_LLDB_BUILD:Bool=OFF', | ||||
|             '-DLLVM_TOOL_LLDB_BUILD:Bool=OFF', | ||||
|             '-DLLVM_TOOL_LLD_BUILD:Bool=OFF', | ||||
|             '-DLLVM_EXTERNAL_LIBUNWIND_BUILD:Bool=OFF', | ||||
|             '-DLLVM_EXTERNAL_LIBCXX_BUILD:Bool=OFF', | ||||
|             '-DLLVM_EXTERNAL_LIBCXXABI_BUILD:Bool=OFF', | ||||
|             '-DLLVM_EXTERNAL_COMPILER_RT_BUILD:Bool=OFF', | ||||
|         ] | ||||
|  | ||||
|         targets = ['NVPTX', 'AMDGPU'] | ||||
|  | ||||
|         if 'x86' in spec.architecture.target.lower(): | ||||
|             targets.append('X86') | ||||
|         elif 'arm' in spec.architecture.target.lower(): | ||||
|             targets.append('ARM') | ||||
|         elif 'aarch64' in spec.architecture.target.lower(): | ||||
|             targets.append('AArch64') | ||||
|         elif 'sparc' in spec.architecture.target.lower(): | ||||
|             targets.append('Sparc') | ||||
|         elif ('ppc' in spec.architecture.target.lower() or | ||||
|               'power' in spec.architecture.target.lower()): | ||||
|             targets.append('PowerPC') | ||||
|  | ||||
|         cmake_args.append( | ||||
|             '-DLLVM_TARGETS_TO_BUILD:Bool=' + ';'.join(targets)) | ||||
|  | ||||
|         if spec.satisfies('platform=linux'): | ||||
|             cmake_args.append('-DCMAKE_BUILD_WITH_INSTALL_RPATH=1') | ||||
|  | ||||
|         return cmake_args | ||||
|  | ||||
|     @run_after('install') | ||||
|     def post_install(self): | ||||
|         with working_dir(self.build_directory): | ||||
|             install_tree('bin', self.prefix.libexec.llvm) | ||||
		Reference in New Issue
	
	Block a user