Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
156 changes: 152 additions & 4 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@

project(Halide)
cmake_minimum_required(VERSION 3.1.3)
cmake_minimum_required(VERSION 3.2)

find_package(Threads QUIET)

Expand Down Expand Up @@ -56,9 +56,9 @@ file(TO_NATIVE_PATH "${LLVM_TOOLS_BINARY_DIR}/llvm-config${CMAKE_EXECUTABLE_SUFF

# LLVM doesn't appear to expose --system-libs via its CMake interface,
# so we must shell out to llvm-config to find this info
execute_process(COMMAND ${LLVM_CONFIG} --system-libs --link-static OUTPUT_VARIABLE HALIDE_SYSTEM_LIBS)
string(STRIP "${HALIDE_SYSTEM_LIBS}" HALIDE_SYSTEM_LIBS) # strip whitespace from start & end
string(REPLACE " " ";" HALIDE_SYSTEM_LIBS "${HALIDE_SYSTEM_LIBS}") # convert into a list
execute_process(COMMAND ${LLVM_CONFIG} --system-libs --link-static OUTPUT_VARIABLE HALIDE_SYSTEM_LIBS_RAW)
string(STRIP "${HALIDE_SYSTEM_LIBS_RAW}" HALIDE_SYSTEM_LIBS_RAW) # strip whitespace from start & end
string(REPLACE " " ";" HALIDE_SYSTEM_LIBS "${HALIDE_SYSTEM_LIBS_RAW}") # convert into a list
if("${HALIDE_SYSTEM_LIBS}" STREQUAL "")
# It's theoretically possible that this could be legitimately empty,
# but in practice that doesn't really happen, so we'll assume it means we
Expand Down Expand Up @@ -361,3 +361,151 @@ if (WITH_UTILS)
else()
message(STATUS "Building utils disabled")
endif()

# ------------------------------------------------
# 'make distrib' support

add_custom_target(build_distrib_dir)
set(DISTRIB_DIR "${CMAKE_BINARY_DIR}/distrib")

function(_make_distrib_subdir TARGET DIR)
set(NAME "_make_distrib_dir_${TARGET}")
add_custom_target("${NAME}"
COMMAND cmake -E make_directory "${DISTRIB_DIR}/${DIR}")
set_target_properties("${NAME}" PROPERTIES EXCLUDE_FROM_ALL TRUE)
add_dependencies("${TARGET}" "${NAME}" )
endfunction()

# Copy the file produced by TARGET into the distrib folder, in the subdir DIR
function(add_to_distrib TARGET DIR)
set(options )
set(oneValueArgs )
set(multiValueArgs DEPS)
cmake_parse_arguments(args "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(TARGET "${TARGET}")
set(NAME "_distrib_${TARGET}")
get_target_property(TARGET_TYPE "${TARGET}" TYPE)
if("${TARGET_TYPE}" STREQUAL "EXECUTABLE" OR
"${TARGET_TYPE}" STREQUAL "STATIC_LIBRARY" OR
"${TARGET_TYPE}" STREQUAL "SHARED_LIBRARY")
add_custom_target("${NAME}"
COMMAND cmake -E copy $<TARGET_FILE:${TARGET}> "${DISTRIB_DIR}/${DIR}"
DEPENDS "${TARGET}")
_make_distrib_subdir("${NAME}" "${DIR}")
else()
message(FATAL_ERROR "TARGET ${TARGET} has type ${TARGET_TYPE}")
endif()
set_target_properties("${NAME}" PROPERTIES EXCLUDE_FROM_ALL TRUE)
else()
get_filename_component(FNAME "${TARGET}" NAME)
set(NAME "_distrib_${DIR}_${FNAME}")
string(REPLACE "/" "_" NAME "${NAME}")
string(REPLACE "\\" "_" NAME "${NAME}")
add_custom_target("${NAME}"
COMMAND cmake -E copy "${TARGET}" "${DISTRIB_DIR}/${DIR}"
DEPENDS "${TARGET}")
_make_distrib_subdir("${NAME}" "${DIR}")
endif()
if(NOT "${args_DEPS}" STREQUAL "")
add_dependencies("${NAME}" ${args_DEPS})
endif()
add_dependencies(build_distrib_dir "${NAME}")
endfunction()

# ---- libHalide
if("${HALIDE_LIBRARY_TYPE}" STREQUAL "SHARED")
add_to_distrib(Halide bin)
else()
add_to_distrib(Halide lib)
endif()

# ---- Header files
add_to_distrib("${CMAKE_BINARY_DIR}/include/Halide.h" include
DEPS HalideIncludes)
add_to_distrib("${CMAKE_BINARY_DIR}/include/HalideBuffer.h" include)
file(GLOB FILES "${CMAKE_BINARY_DIR}/include/HalideRuntime*.h")
foreach(F ${FILES})
add_to_distrib(${F} include)
endforeach()

# ---- Tutorials
foreach(EXT cpp h sh)
set(DIR "${CMAKE_SOURCE_DIR}/tutorial")
file(GLOB FILES "${DIR}/*.${EXT}")
foreach(F ${FILES})
add_to_distrib(${F} tutorial)
endforeach()
endforeach()
foreach(EXT gif jpg mp4)
set(DIR "${CMAKE_SOURCE_DIR}/tutorial/figures")
file(GLOB FILES "${DIR}/*.${EXT}")
foreach(F ${FILES})
add_to_distrib(${F} tutorial/figures)
endforeach()
endforeach()
foreach(EXT png)
set(DIR "${CMAKE_SOURCE_DIR}/tutorial/images")
file(GLOB FILES "${DIR}/*.${EXT}")
foreach(F ${FILES})
add_to_distrib(${F} tutorial/images)
endforeach()
endforeach()

# ---- Tools
foreach(F mex_halide.m
GenGen.cpp
RunGen.cpp
RunGenStubs.cpp
halide_benchmark.h
halide_image.h
halide_image_io.h
halide_image_info.h)
add_to_distrib("${CMAKE_SOURCE_DIR}/tools/${F}" tools)
endforeach()

# ---- README
file(GLOB FILES "${CMAKE_SOURCE_DIR}/*.md")
foreach(F ${FILES})
add_to_distrib(${F} "")
endforeach()

# ---- Bazel
file(GLOB FILES "${CMAKE_SOURCE_DIR}/bazel/*")
foreach(F ${FILES})
add_to_distrib(${F} "")
endforeach()

# ---- CMake
file(GLOB FILES "${CMAKE_SOURCE_DIR}/*.cmake")
foreach(F ${FILES})
add_to_distrib(${F} "")
endforeach()

# ---- halide_config
file(GLOB FILES "${CMAKE_SOURCE_DIR}/tools/halide_config.*.tpl")
foreach(F ${FILES})
# Can't rely on sed on Windows, so just do the trivial transform we need right here.
file(READ ${F} CONTENTS)
get_filename_component(FNAME "${F}" NAME) # Extract filename
string(REGEX REPLACE "\\.tpl$" "" FNAME "${FNAME}") # Strip .tpl extension
string(REPLACE "\${LLVM_SYSTEM_LIBS}" "${HALIDE_SYSTEM_LIBS_RAW}" NEW_CONTENTS "${CONTENTS}")
file(WRITE "${CMAKE_BINARY_DIR}/${FNAME}" ${NEW_CONTENTS})
add_to_distrib("${CMAKE_BINARY_DIR}/${FNAME}" "")
endforeach()

# ---- distrib.tgz and distrib.zip
file(TO_NATIVE_PATH "${DISTRIB_DIR}" NATIVE_DISTRIB_DIR)
file(TO_NATIVE_PATH "${DISTRIB_DIR}/../" NATIVE_ARCHIVE_DIR)
if (MSVC)
# 'cmake -E tar' can create zipfiles as of v3.2+
add_custom_target(halide_archive
DEPENDS build_distrib_dir
COMMAND cmake -E tar -cf "${NATIVE_ARCHIVE_DIR}/halide.zip" --format=zip "${NATIVE_DISTRIB_DIR}")
else()
add_custom_target(halide_archive
DEPENDS build_distrib_dir
COMMAND cmake -E tar -czf "${NATIVE_ARCHIVE_DIR}/halide.tgz" "${NATIVE_DISTRIB_DIR}")
endif()

add_custom_target(distrib)
add_dependencies(distrib build_distrib_dir halide_archive)
48 changes: 26 additions & 22 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -239,9 +239,12 @@ foreach (i ${RUNTIME_HEADER_FILES})
list(APPEND INITIAL_MODULES "${INITMOD_PREFIX}${SYM_NAME}.cpp")
endforeach()

# The externally-visible header files that go into making Halide.h.
# Don't include anything here that includes llvm headers.
set(HEADER_FILES
AddImageChecks.h
AddParameterChecks.h
AlignLoads.h
AllocationBoundsInference.h
ApplySplit.h
Argument.h
Expand All @@ -254,26 +257,25 @@ set(HEADER_FILES
BoundsInference.h
BoundSmallAllocations.h
Buffer.h
CSE.h
CanonicalizeGPUVars.h
Closure.h
CodeGen_ARM.h
CodeGen_C.h
CodeGen_GPU_Dev.h
CodeGen_GPU_Host.h
CodeGen_Hexagon.h
CodeGen_LLVM.h
CodeGen_MIPS.h
CodeGen_OpenCL_Dev.h
CodeGen_Metal_Dev.h
CodeGen_OpenGL_Dev.h
CodeGen_OpenGLCompute_Dev.h
CodeGen_Posix.h
CodeGen_PowerPC.h
CodeGen_PTX_Dev.h
CodeGen_Posix.h
CodeGen_X86.h
ConciseCasts.h
CPlusPlusMangle.h
CSE.h
CanonicalizeGPUVars.h
Debug.h
DebugArguments.h
DebugToFile.h
Expand All @@ -300,29 +302,31 @@ set(HEADER_FILES
Generator.h
HexagonOffload.h
HexagonOptimize.h
IR.h
IREquality.h
IRMatch.h
IRMutator.h
IROperator.h
IRPrinter.h
IRVisitor.h
runtime/HalideRuntime.h
runtime/HalideBuffer.h
ImageParam.h
InferArguments.h
Interval.h
InjectHostDevBufferCopies.h
InjectOpenGLIntrinsics.h
Inline.h
InlineReductions.h
IntegerDivisionTable.h
Interval.h
Introspection.h
IntrusivePtr.h
IREquality.h
IR.h
IRMatch.h
IRMutator.h
IROperator.h
IRPrinter.h
IRVisitor.h
JITModule.h
LLVM_Output.h
LLVM_Runtime_Linker.h
Lambda.h
Lerp.h
LICM.h
LLVM_Output.h
LLVM_Runtime_Linker.h
LoopCarry.h
Lower.h
MainPage.h
Expand All @@ -332,20 +336,19 @@ set(HEADER_FILES
ModulusRemainder.h
Monotonic.h
ObjectInstanceRegistry.h
OutputImageParam.h
Outputs.h
OutputImageParam.h
ParallelRVar.h
Param.h
Parameter.h
Param.h
PartitionLoops.h
Pipeline.h
PrintLoopNest.h
Prefetch.h
Profiling.h
Qualify.h
RDom.h
Random.h
RealizationOrder.h
RDom.h
Reduction.h
RegionCosts.h
RemoveDeadAllocations.h
Expand Down Expand Up @@ -382,16 +385,17 @@ set(HEADER_FILES
VectorizeLoops.h
WrapCalls.h
WrapExternStages.h
runtime/HalideRuntime.h
runtime/HalideBuffer.h
)

file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include")
file(TO_NATIVE_PATH "${CMAKE_BINARY_DIR}/include/" NATIVE_INCLUDE_PATH)
add_custom_command(OUTPUT "${CMAKE_BINARY_DIR}/include/Halide.h"
COMMAND build_halide_h ${HEADER_FILES} > "${NATIVE_INCLUDE_PATH}Halide.h"
COMMAND build_halide_h ${HEADER_FILES} HalideFooter.h > "${NATIVE_INCLUDE_PATH}Halide.h"
WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}"
DEPENDS build_halide_h ${HEADER_FILES})
add_custom_target(
HalideIncludes
DEPENDS "${CMAKE_BINARY_DIR}/include/Halide.h")

foreach (i ${RUNTIME_HEADER_FILES})
configure_file(runtime/${i} "${CMAKE_BINARY_DIR}/include" COPYONLY)
Expand Down Expand Up @@ -529,7 +533,6 @@ add_library(Halide ${HALIDE_LIBRARY_TYPE}
VectorizeLoops.cpp
WrapCalls.cpp
WrapExternStages.cpp
"${CMAKE_BINARY_DIR}/include/Halide.h"
${HEADER_FILES}
${INITIAL_MODULES}
)
Expand All @@ -542,6 +545,7 @@ set_target_properties(Halide PROPERTIES VISIBILITY_INLINES_HIDDEN 1)
add_dependencies(Halide
binary2cpp
build_halide_h
HalideIncludes
)

# List of LLVM Components required
Expand Down