Skip to content

Instantly share code, notes, and snippets.

@lszinv
Created September 15, 2020 02:17
Show Gist options
  • Select an option

  • Save lszinv/ea545412923cfd9771b815a7ac5ec382 to your computer and use it in GitHub Desktop.

Select an option

Save lszinv/ea545412923cfd9771b815a7ac5ec382 to your computer and use it in GitHub Desktop.
Sample CMake
cmake_minimum_required(VERSION 3.17)
project(overiew_project)
set(CMAKE_CXX_STANDARD 17)
include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/lib/cmake/")
##################
## Dependencies
##################
enable_testing()
##
# LLVM
##
# The build artifacts will be kept in the llvm subfolder to avoid it being deleted during a clean
# So that it doesn't waste a bunch of time being recompiled all the time
# The LLVM folder properties can be set when calling cmake if llvm-project has been previously compiled
##
set(LLVM_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/llvm-project/ CACHE STRING "llvm-project root dir")
set(LLVM_BUILD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/llvm-project/build CACHE STRING "llvm-project build dir")
set(LLVM_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/llvm_install CACHE STRING "llvm-project install dir")
# Set the LLVM vars if the corresponding environment variables are set. To avoid needing to constantly pass in the
# cmake parameters if you've built LLVM out of project
if(DEFINED ENV{LLVM_ROOT_DIR})
set(LLVM_ROOT_DIR $ENV{LLVM_ROOT_DIR})
endif()
if(DEFINED ENV{LLVM_BUILD_DIR})
set(LLVM_BUILD_DIR $ENV{LLVM_BUILD_DIR})
endif()
if(DEFINED ENV{LLVM_INSTALL_DIR})
set(LLVM_INSTALL_DIR $ENV{LLVM_INSTALL_DIR})
endif()
if(DEFINED ENV{LLVM_ROOT_DIR} AND DEFINED ENV{LLVM_BUILD_DIR} AND DEFINED ENV{LLVM_INSTALL_DIR})
message("Using externally built llvm-project")
else()
file(MAKE_DIRECTORY ${LLVM_BUILD_DIR})
ExternalProject_Add(llvm-project
PREFIX llvm-project
SOURCE_DIR ${LLVM_ROOT_DIR}/llvm
BINARY_DIR ${LLVM_BUILD_DIR}
CMAKE_GENERATOR Ninja
CMAKE_ARGS
-DBUILD_SHARED_LIBS=ON
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON
-DCMAKE_INSTALL_PREFIX=${LLVM_INSTALL_DIR}
-DLLVM_BUILD_EXAMPLES=ON
-DLLVM_ENABLE_ASSERTIONS=ON
-DLLVM_ENABLE_PIC=ON
-DLLVM_ENABLE_PROJECTS=mlir
-DLLVM_ENABLE_RTTI=ON
-DLLVM_TARGETS_TO_BUILD=host
)
# Don't always build this, Make target only if the user explicitly calls it
set_target_properties(llvm-project PROPERTIES EXCLUDE_FROM_ALL TRUE)
endif()
##
# Protobuf
# Dependency for onnx-mlir. Unfortunately can't do a non-system install because onnx-mlir expects it to be system installed.
# If we set it up to add the linking and include directories to cmake, there's no explicit
# control to which one onnx-mlir will pick up vs a system installed one
##
set(PROTOBUF_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/protobuf)
set(PROTOBUF_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/protobuf_install)
ExternalProject_Add(protobuf
PREFIX protobuf
SOURCE_DIR ${PROTOBUF_ROOT_DIR}
BUILD_COMMAND make
CONFIGURE_COMMAND ${PROTOBUF_ROOT_DIR}/autogen.sh && ${PROTOBUF_ROOT_DIR}/configure
INSTALL_COMMAND make install
BUILD_IN_SOURCE 1
)
set_target_properties(protobuf PROPERTIES EXCLUDE_FROM_ALL TRUE)
##
# Onnx-MLIR
##
# ONNX_ML Definition tells ONNX includes to look for the onnx-ml protobuf headers instead of the onnx ones
add_definitions(-DONNX_ML)
set(ONNX_MLIR_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/onnx-mlir)
set(ONNX_MLIR_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/om_install) # onnx-mlir doesn't actually install any libs, so this is just its dependencies
ExternalProject_Add(onnx-mlir
PREFIX onnx-mlir
SOURCE_DIR "${ONNX_MLIR_ROOT_DIR}"
# Forcefully setting the LLVM environment variables that onnx-mlir are requiring
CMAKE_COMMAND LLVM_PROJ_SRC=${LLVM_ROOT_DIR} LLVM_PROJ_BUILD=${LLVM_BUILD_DIR} cmake
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${ONNX_MLIR_INSTALL_DIR}
-DBUILD_SHARED_LIBS=ON
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON
# Dependency on llvm-project is commented out to prevent needless builds of llvm-project.
# DEPENDS llvm-project
)
ExternalProject_Get_property(onnx-mlir BINARY_DIR INSTALL_DIR)
set(ONNX_MLIR_BUILD_DIR ${BINARY_DIR})
########################
## MyLib
########################
ExternalProject_Add(mylib
PREFIX mylib
SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src"
BUILD_ALWAYS 1
TEST_AFTER_INSTALL 1
CMAKE_GENERATOR Ninja
CMAKE_ARGS
-DCMAKE_BUILD_TYPE=Debug # Default build with debug symbols
-DLLVM_BUILD_DIR=${LLVM_BUILD_DIR}
-DLLVM_INSTALL_DIR=${LLVM_INSTALL_DIR}
-DONNX_MLIR_ROOT_DIR=${ONNX_MLIR_ROOT_DIR}
-DONNX_MLIR_BUILD_DIR=${ONNX_MLIR_BUILD_DIR}
-DONNX_MLIR_INSTALL_DIR=${ONNX_MLIR_INSTALL_DIR}
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON
DEPENDS onnx-mlir)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment