CMakeLists.txt 4.0 KB
Newer Older
J
Jinhui Yuan 已提交
1
# Minimum CMake required
W
willzhang4a58 已提交
2
cmake_minimum_required(VERSION 3.5)
J
Jinhui Yuan 已提交
3 4

# Project
W
willzhang4a58 已提交
5
project(oneflow C CXX)
W
willzhang4a58 已提交
6
enable_testing()
W
willzhang4a58 已提交
7
set(CMAKE_CXX_STANDARD 11)
W
willzhang4a58 已提交
8
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
J
jinhui yuan 已提交
9 10 11 12 13

if (WIN32)
  set(CMAKE_BUILD_TYPE Debug)
endif()

W
willzhang4a58 已提交
14 15
set(oneflow_src_dir ${PROJECT_SOURCE_DIR}/oneflow)
set(oneflow_cmake_dir ${PROJECT_SOURCE_DIR}/cmake)
J
jinhui yuan 已提交
16

17 18
if (WIN32)
else()
W
willzhang4a58 已提交
19
  list(APPEND CUDA_NVCC_FLAGS "-std=c++11 -w")
20
endif()
W
willzhang4a58 已提交
21

J
jinhui yuan 已提交
22 23 24 25 26 27 28
option(PREPARE_THIRD_PARTY "Whether include the third party codes in the solution" OFF)


set(THIRD_PARTY_DIR "${PROJECT_SOURCE_DIR}/third_party")
if (NOT EXISTS ${THIRD_PARTY_DIR})
  message(FATAL_ERROR "Please set third party directory by: -DTHIRD_PARTY_DIR=/your/third_party/path")
endif()
W
willzhang4a58 已提交
29

W
willzhang4a58 已提交
30
# Different set for different platform
J
Jinhui Yuan 已提交
31 32 33 34 35 36 37
if (MSVC)
  foreach(flag_var
      CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
      CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
      CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
    if(${flag_var} MATCHES "/MD")
      string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
W
willzhang4a58 已提交
38
    endif()
W
willzhang4a58 已提交
39
  endforeach()
J
Jinhui Yuan 已提交
40 41
endif()

W
willzhang4a58 已提交
42 43 44 45
if (UNIX)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall -Wno-sign-compare")
endif()

W
willzhang4a58 已提交
46 47 48
# Modules
list(APPEND CMAKE_MODULE_PATH ${oneflow_cmake_dir}/third_party)
list(APPEND CMAKE_MODULE_PATH ${oneflow_cmake_dir})
J
Jinhui Yuan 已提交
49 50
include(util)
include(proto2cpp)
W
willzhang4a58 已提交
51
include(third_party)
J
Jinhui Yuan 已提交
52

W
willzhang4a58 已提交
53
# main cpp
W
willzhang4a58 已提交
54
list(APPEND of_main_cc ${oneflow_src_dir}/compiler/compiler.cpp)
W
willzhang4a58 已提交
55
list(APPEND of_main_cc ${oneflow_src_dir}/runtime/elf_runner.cpp)
W
willzhang4a58 已提交
56

W
willzhang4a58 已提交
57
# source_group
J
Jinhui Yuan 已提交
58 59 60
SUBDIRLIST(subdir_list ${oneflow_src_dir})
foreach(subdir ${subdir_list})
  file(GLOB subdir_headers    "${oneflow_src_dir}/${subdir}/*.h")
W
willzhang4a58 已提交
61
  file(GLOB subdir_cuda_headers    "${oneflow_src_dir}/${subdir}/*.cuh")
W
willzhang4a58 已提交
62
  file(GLOB subdir_obj_cpps   "${oneflow_src_dir}/${subdir}/*.cpp")
W
willzhang4a58 已提交
63
  file(GLOB subdir_obj_cus   "${oneflow_src_dir}/${subdir}/*.cu")
J
Jinhui Yuan 已提交
64 65 66
  file(GLOB subdir_test_cpps  "${oneflow_src_dir}/${subdir}/*_test.cpp")
  file(GLOB subdir_protos     "${oneflow_src_dir}/${subdir}/*.proto")
  foreach(test_cpp ${subdir_test_cpps})
W
willzhang4a58 已提交
67
    list(REMOVE_ITEM subdir_obj_cpps ${test_cpp})
J
Jinhui Yuan 已提交
68
  endforeach()
W
willzhang4a58 已提交
69 70 71
  foreach(main_cpp ${of_main_cc})
    list(REMOVE_ITEM subdir_obj_cpps ${main_cpp})
  endforeach()
W
willzhang4a58 已提交
72 73
  source_group(${subdir} FILES ${subdir_headers} ${subdir_cuda_headers} ${subdir_obj_cpps} ${subdir_obj_cus} {subdir_protos})
  list(APPEND of_all_obj_cc ${subdir_headers} ${subdir_cuda_headers} ${subdir_obj_cpps} ${subdir_obj_cus})
W
willzhang4a58 已提交
74 75
  list(APPEND of_all_proto ${subdir_protos})
  list(APPEND of_all_test_cc ${subdir_test_cpps})
W
willzhang4a58 已提交
76 77
endforeach()

W
willzhang4a58 已提交
78 79
# proto obj lib
foreach(proto_name ${of_all_proto})
J
Jinhui Yuan 已提交
80 81 82 83 84 85 86 87
  file(RELATIVE_PATH proto_rel_name ${oneflow_src_dir} ${proto_name})
  list(APPEND of_all_rel_protos ${proto_rel_name})
endforeach()

RELATIVE_PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS
                               ${oneflow_src_dir}
                               ${of_all_rel_protos})

W
willzhang4a58 已提交
88
cuda_add_library(of_protoobj ${PROTO_SRCS} ${PROTO_HDRS})
W
willzhang4a58 已提交
89
target_link_libraries(of_protoobj ${oneflow_third_party_libs})
J
Jinhui Yuan 已提交
90 91

# cc obj lib
W
willzhang4a58 已提交
92
include_directories(${oneflow_src_dir})
J
Jinhui Yuan 已提交
93
include_directories(${PROJECT_BINARY_DIR})
W
willzhang4a58 已提交
94
cuda_add_library(of_ccobj ${of_all_obj_cc})
W
willzhang4a58 已提交
95
target_link_libraries(of_ccobj ${oneflow_third_party_libs})
W
willzhang4a58 已提交
96
add_dependencies(of_ccobj of_protoobj)
J
Jinhui Yuan 已提交
97

W
Wind5 已提交
98
if(APPLE)
W
willzhang4a58 已提交
99
  set(of_libs -Wl,-force_load of_ccobj of_protoobj)
100
elseif(UNIX)
W
Wind5 已提交
101
  set(of_libs -Wl,--whole-archive of_ccobj of_protoobj -Wl,--no-whole-archive)
102 103 104
elseif(WIN32)
  set(of_libs of_ccobj of_protoobj)
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /WHOLEARCHIVE:of_ccobj") 
W
Wind5 已提交
105 106
endif()

W
willzhang4a58 已提交
107 108 109
# build main
foreach(cc ${of_main_cc})
  get_filename_component(main_name ${cc} NAME_WE)
W
willzhang4a58 已提交
110 111
  cuda_add_executable(${main_name} ${cc})
  target_link_libraries(${main_name} ${of_libs} ${oneflow_third_party_libs})
W
willzhang4a58 已提交
112 113
endforeach()

W
willzhang4a58 已提交
114
# build test
W
willzhang4a58 已提交
115
foreach(cc ${of_all_test_cc})
W
willzhang4a58 已提交
116 117
  get_filename_component(test_name ${cc} NAME_WE)
  string(CONCAT test_exe_name ${test_name} exe)
W
willzhang4a58 已提交
118 119
  cuda_add_executable(${test_exe_name} ${cc})
  target_link_libraries(${test_exe_name} ${of_libs} ${oneflow_third_party_libs})
W
willzhang4a58 已提交
120 121
  add_test(NAME ${test_name} COMMAND ${test_exe_name})
endforeach()