1 ################################################################################
3 # Copyright 1993-2012 NVIDIA Corporation. All rights reserved.
7 # This source code is subject to NVIDIA ownership rights under U.S. and
8 # international Copyright laws.
10 # NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE
11 # CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR
12 # IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH
13 # REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF
14 # MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE.
15 # IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL,
16 # OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
17 # OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
18 # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
19 # OR PERFORMANCE OF THIS SOURCE CODE.
21 # U.S. Government End Users. This source code is a "commercial item" as
22 # that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of
23 # "commercial computer software" and "commercial computer software
24 # documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995)
25 # and is provided to the U.S. Government only as a commercial end item.
26 # Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through
27 # 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the
28 # source code with only those rights set forth herein.
30 ################################################################################
32 cmake_minimum_required(VERSION 2.8)
34 project(libnvvm-samples)
37 if (DEFINED ENV{CUDA_HOME})
38 set(CUDA_HOME "$ENV{CUDA_HOME}")
39 set(CUDA_HOME "$ENV{CUDA_HOME}" CACHE PATH "Path to CUDA Toolkit.")
40 elseif (NOT DEFINED CUDA_HOME)
41 # There was no CUDA_HOME explicitly given, so try to determine it from
42 # locating nvcc in PATH.
43 find_program(NVCC nvcc)
45 message(FATAL_ERROR "CUDA_HOME not set, and could not find nvcc in "
46 "your PATH. Please either set CUDA_HOME to a "
47 "installation path for the CUDA Toolkit or "
48 "add nvcc to your PATH.")
50 get_filename_component(CUDA_HOME "${NVCC}" PATH)
51 get_filename_component(CUDA_HOME "${CUDA_HOME}/.." ABSOLUTE)
52 set(CUDA_HOME "${CUDA_HOME}" CACHE PATH "Path to CUDA Toolkit.")
55 message(STATUS "Using CUDA_HOME: ${CUDA_HOME}")
58 if(NOT DEFINED ENV{LIBNVVM_HOME})
59 set(LIBNVVM_HOME "${CUDA_HOME}/nvvm" CACHE PATH "Path to NVVM.")
61 set(LIBNVVM_HOME "$ENV{LIBNVVM_HOME}" CACHE PATH "Path to NVVM.")
63 message(STATUS "Using LIBNVVM_HOME: ${LIBNVVM_HOME}")
66 if(DEFINED ENV{LLVM_HOME})
67 set(LLVM_HOME "$ENV{LLVM_HOME}")
68 set(LLVM_HOME "${LLVM_HOME}" CACHE PATH "Path to LLVM 3.2.")
70 set(LLVM_HOME "" CACHE PATH "Path to LLVM 3.2.")
72 message(STATUS "Using LLVM_HOME: ${LLVM_HOME}")
74 if (CMAKE_SIZEOF_VOID_P STREQUAL "8")
76 set (CUDA_LIB_SEARCH_PATH "${CUDA_HOME}/lib/x64")
77 set (NVVM_DLL_NAME nvvm64_20_0.dll)
79 set (CUDA_LIB_SEARCH_PATH "")
83 set (CUDA_LIB_SEARCH_PATH "${CUDA_HOME}/lib/Win32")
84 set (NVVM_DLL_NAME nvvm32_20_0.dll)
86 set (CUDA_LIB_SEARCH_PATH "")
90 ### Find CUDA libs/tools
91 find_library(CUDA_LIB cuda ${CUDA_LIB_SEARCH_PATH})
93 message(FATAL_ERROR "Unable to locate CUDA library/framework")
95 find_file(CUDA_H cuda.h PATHS "${CUDA_HOME}" "${CUDA_HOME}/include" /usr/local/cuda/include)
97 get_filename_component(CUDA_INCLUDE_DIR ${CUDA_H} PATH)
98 include_directories(${CUDA_INCLUDE_DIR})
100 message(FATAL_ERROR "Unable to locate cuda.h")
102 message(STATUS "Using cuda header: ${CUDA_H}")
104 # On Mac, we may also need the headers installed to /usr/local/cuda
106 include_directories(/usr/local/cuda/include)
109 find_program(NVCC nvcc PATHS "${CUDA_HOME}" "${CUDA_HOME}/bin")
111 message(FATAL_ERROR "Cannot find nvcc. Please set CUDA_HOME to a CUDA Toolkit directory")
113 message(STATUS "Using nvcc: ${NVCC}")
117 # The directory structure for nvvm is a bit complex.
119 # 32-bit -- nvvm/lib/Win32
120 # 64-bit -- nvvm/lib/x64
123 # 64-bit -- nvvm/lib64
125 # Universal -- nvvm/lib
126 if (CMAKE_SIZEOF_VOID_P STREQUAL "8")
128 set (LIB_ARCH_SUFFIX "/x64")
130 set (LIB_ARCH_SUFFIX "")
132 set (LIB_ARCH_SUFFIX "64")
136 set (LIB_ARCH_SUFFIX "/Win32")
138 set (LIB_ARCH_SUFFIX "")
141 find_library(NVVM_LIB nvvm PATHS "${LIBNVVM_HOME}/lib${LIB_ARCH_SUFFIX}")
142 find_file(NVVM_H nvvm.h PATHS "${LIBNVVM_HOME}/include")
143 if(NVVM_LIB AND NVVM_H)
144 get_filename_component(NVVM_INCLUDE_DIR ${NVVM_H} PATH)
146 message(FATAL_ERROR "Unable to find libNVVM")
148 include_directories(${NVVM_INCLUDE_DIR})
149 message(STATUS "Using libnvvm header path: ${NVVM_INCLUDE_DIR}")
150 message(STATUS "Using libnvvm library: ${NVVM_LIB}")
151 set(LIBNVVM_RPATH "${LIBNVVM_HOME}/lib${LIB_ARCH_SUFFIX}")
152 set(CMAKE_INSTALL_RPATH ${LIBNVVM_RPATH})
154 # On Windows, locate nvvm.dll so we can install it
156 find_file(NVVM_DLL ${NVVM_DLL_NAME} PATHS "${LIBNVVM_HOME}/bin")
158 message(FATAL_ERROR "Found nvvm .h/.lib, but not .dll")
160 install(FILES ${NVVM_DLL} DESTINATION bin)
163 add_definitions(-DLIBDEVICE_MAJOR_VERSION=1)
164 add_definitions(-DLIBDEVICE_MINOR_VERSION=0)
167 # LLVM is a bit tricky if we don't assume a CMake-based build
168 find_file(ADDLLVM_CMAKE AddLLVM.cmake PATHS "${LLVM_HOME}/share/llvm/cmake")
170 list(APPEND CMAKE_MODULE_PATH "${LLVM_HOME}/share/llvm/cmake")
172 include("${LLVM_HOME}/share/llvm/cmake/LLVMConfig.cmake")
173 include(HandleLLVMOptions)
174 include_directories("${LLVM_HOME}/include")
175 link_directories("${LLVM_HOME}/lib")
176 if (NOT LLVM_VERSION_MAJOR STREQUAL "3" OR NOT LLVM_VERSION_MINOR STREQUAL "2")
177 message(STATUS "LLVM found, but version 3.2 is required.")
178 message(STATUS "cuda-c-linking sample will not be built!")
181 message(STATUS "Using LLVM install from ${LLVM_HOME}")
184 message(STATUS "CMake-based LLVM install could not be found.")
185 message(STATUS "cuda-c-linking sample will not be built!")
189 ### Include common headers
190 include_directories("${CMAKE_CURRENT_SOURCE_DIR}/common/include")
195 add_subdirectory(cuda-c-linking)
197 add_subdirectory(ptxgen)
198 add_subdirectory(simple)