You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

prebuild.cmake 8.1 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. ##
  2. ## Author: Hank Anderson <hank@statease.com>
  3. ## Description: Ported from OpenBLAS/Makefile.prebuild
  4. ## This is triggered by system.cmake and runs before any of the code is built.
  5. ## Creates config.h and Makefile.conf by first running the c_check perl script (which creates those files).
  6. ## Next it runs f_check and appends some fortran information to the files.
  7. ## Then it runs getarch and getarch_2nd for even more environment information.
  8. ## Finally it builds gen_config_h for use at build time to generate config.h.
  9. # CMake vars set by this file:
  10. # CORE
  11. # LIBCORE
  12. # NUM_CORES
  13. # HAVE_MMX
  14. # HAVE_SSE
  15. # HAVE_SSE2
  16. # HAVE_SSE3
  17. # MAKE
  18. # SGEMM_UNROLL_M
  19. # SGEMM_UNROLL_N
  20. # DGEMM_UNROLL_M
  21. # DGEMM_UNROLL_M
  22. # QGEMM_UNROLL_N
  23. # QGEMM_UNROLL_N
  24. # CGEMM_UNROLL_M
  25. # CGEMM_UNROLL_M
  26. # ZGEMM_UNROLL_N
  27. # ZGEMM_UNROLL_N
  28. # XGEMM_UNROLL_M
  29. # XGEMM_UNROLL_N
  30. # CGEMM3M_UNROLL_M
  31. # CGEMM3M_UNROLL_N
  32. # ZGEMM3M_UNROLL_M
  33. # ZGEMM3M_UNROLL_M
  34. # XGEMM3M_UNROLL_N
  35. # XGEMM3M_UNROLL_N
  36. # CPUIDEMU = ../../cpuid/table.o
  37. if (DEFINED CPUIDEMU)
  38. set(EXFLAGS "-DCPUIDEMU -DVENDOR=99")
  39. endif ()
  40. if (BUILD_KERNEL)
  41. # set the C flags for just this file
  42. set(GETARCH2_FLAGS "-DBUILD_KERNEL")
  43. set(TARGET_CONF "config_kernel.h")
  44. set(TARGET_CONF_DIR ${PROJECT_BINARY_DIR}/kernel_config/${TARGET_CORE})
  45. else()
  46. set(TARGET_CONF "config.h")
  47. set(TARGET_CONF_DIR ${PROJECT_BINARY_DIR})
  48. endif ()
  49. set(TARGET_CONF_TEMP "${PROJECT_BINARY_DIR}/${TARGET_CONF}.tmp")
  50. # c_check
  51. set(FU "")
  52. if (APPLE OR (MSVC AND NOT ${CMAKE_C_COMPILER_ID} MATCHES "Clang"))
  53. set(FU "_")
  54. endif()
  55. set(COMPILER_ID ${CMAKE_C_COMPILER_ID})
  56. if (${COMPILER_ID} STREQUAL "GNU")
  57. set(COMPILER_ID "GCC")
  58. endif ()
  59. string(TOUPPER ${ARCH} UC_ARCH)
  60. file(WRITE ${TARGET_CONF_TEMP}
  61. "#define OS_${HOST_OS}\t1\n"
  62. "#define ARCH_${UC_ARCH}\t1\n"
  63. "#define C_${COMPILER_ID}\t1\n"
  64. "#define __${BINARY}BIT__\t1\n"
  65. "#define FUNDERSCORE\t${FU}\n")
  66. if (${HOST_OS} STREQUAL "WINDOWSSTORE")
  67. file(APPEND ${TARGET_CONF_TEMP}
  68. "#define OS_WINNT\t1\n")
  69. endif ()
  70. # f_check
  71. if (NOT NOFORTRAN)
  72. include("${PROJECT_SOURCE_DIR}/cmake/f_check.cmake")
  73. endif ()
  74. # Cannot run getarch on target if we are cross-compiling
  75. if (DEFINED CORE AND CMAKE_CROSSCOMPILING AND NOT (${HOST_OS} STREQUAL "WINDOWSSTORE"))
  76. # Write to config as getarch would
  77. # TODO: Set up defines that getarch sets up based on every other target
  78. # Perhaps this should be inside a different file as it grows larger
  79. file(APPEND ${TARGET_CONF_TEMP}
  80. "#define ${CORE}\n"
  81. "#define CHAR_CORENAME \"${CORE}\"\n")
  82. if ("${CORE}" STREQUAL "ARMV7")
  83. file(APPEND ${TARGET_CONF_TEMP}
  84. "#define L1_DATA_SIZE\t65536\n"
  85. "#define L1_DATA_LINESIZE\t32\n"
  86. "#define L2_SIZE\t512488\n"
  87. "#define L2_LINESIZE\t32\n"
  88. "#define DTB_DEFAULT_ENTRIES\t64\n"
  89. "#define DTB_SIZE\t4096\n"
  90. "#define L2_ASSOCIATIVE\t4\n"
  91. "#define HAVE_VFPV3\n"
  92. "#define HAVE_VFP\n")
  93. set(SGEMM_UNROLL_M 4)
  94. set(SGEMM_UNROLL_N 4)
  95. set(DGEMM_UNROLL_M 4)
  96. set(DGEMM_UNROLL_N 4)
  97. elseif ("${CORE}" STREQUAL "ARMV8")
  98. file(APPEND ${TARGET_CONF_TEMP}
  99. "#define L1_DATA_SIZE\t32768\n"
  100. "#define L1_DATA_LINESIZE\t64\n"
  101. "#define L2_SIZE\t262144\n"
  102. "#define L2_LINESIZE\t64\n"
  103. "#define DTB_DEFAULT_ENTRIES\t64\n"
  104. "#define DTB_SIZE\t4096\n"
  105. "#define L2_ASSOCIATIVE\t32\n")
  106. set(SGEMM_UNROLL_M 4)
  107. set(SGEMM_UNROLL_N 4)
  108. elseif ("${CORE}" STREQUAL "CORTEXA57")
  109. file(APPEND ${TARGET_CONF_TEMP}
  110. "#define L1_CODE_SIZE\t49152\n"
  111. "#define L1_CODE_LINESIZE\t64\n"
  112. "#define L1_CODE_ASSOCIATIVE\t3\n"
  113. "#define L1_DATA_SIZE\t32768\n"
  114. "#define L1_DATA_LINESIZE\t64\n"
  115. "#define L1_DATA_ASSOCIATIVE\t2\n"
  116. "#define L2_SIZE\t2097152\n"
  117. "#define L2_LINESIZE\t64\n"
  118. "#define L2_ASSOCIATIVE\t16\n"
  119. "#define DTB_DEFAULT_ENTRIES\t64\n"
  120. "#define DTB_SIZE\t4096\n"
  121. "#define HAVE_VFPV4\n"
  122. "#define HAVE_VFPV3\n"
  123. "#define HAVE_VFP\n"
  124. "#define HAVE_NEON\n")
  125. set(SGEMM_UNROLL_M 16)
  126. set(SGEMM_UNROLL_N 4)
  127. set(DGEMM_UNROLL_M 8)
  128. set(DGEMM_UNROLL_N 4)
  129. set(CGEMM_UNROLL_M 8)
  130. set(CGEMM_UNROLL_N 4)
  131. set(ZGEMM_UNROLL_M 8)
  132. set(ZGEMM_UNROLL_N 4)
  133. endif()
  134. # Or should this actually be NUM_CORES?
  135. if (${NUM_THREADS} GREATER 0)
  136. file(APPEND ${TARGET_CONF_TEMP} "#define NUM_CORES\t${NUM_THREADS}\n")
  137. endif()
  138. # GetArch_2nd
  139. foreach(float_char S;D;Q;C;Z;X)
  140. if (NOT DEFINED ${float_char}GEMM_UNROLL_M)
  141. set(${float_char}GEMM_UNROLL_M 2)
  142. endif()
  143. if (NOT DEFINED ${float_char}GEMM_UNROLL_N)
  144. set(${float_char}GEMM_UNROLL_N 2)
  145. endif()
  146. endforeach()
  147. file(APPEND ${TARGET_CONF_TEMP}
  148. "#define GEMM_MULTITHREAD_THRESHOLD\t${GEMM_MULTITHREAD_THRESHOLD}\n")
  149. # Move to where gen_config_h would place it
  150. file(RENAME ${TARGET_CONF_TEMP} "${TARGET_CONF_DIR}/${TARGET_CONF}")
  151. else(NOT CMAKE_CROSSCOMPILING)
  152. # compile getarch
  153. set(GETARCH_SRC
  154. ${PROJECT_SOURCE_DIR}/getarch.c
  155. ${CPUIDEMU}
  156. )
  157. if ("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
  158. #Use generic for MSVC now
  159. message("MSVC")
  160. set(GETARCH_FLAGS ${GETARCH_FLAGS} -DFORCE_GENERIC)
  161. else()
  162. list(APPEND GETARCH_SRC ${PROJECT_SOURCE_DIR}/cpuid.S)
  163. endif ()
  164. if ("${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore")
  165. # disable WindowsStore strict CRT checks
  166. set(GETARCH_FLAGS ${GETARCH_FLAGS} -D_CRT_SECURE_NO_WARNINGS)
  167. endif ()
  168. set(GETARCH_DIR "${PROJECT_BINARY_DIR}/getarch_build")
  169. set(GETARCH_BIN "getarch${CMAKE_EXECUTABLE_SUFFIX}")
  170. file(MAKE_DIRECTORY ${GETARCH_DIR})
  171. configure_file(${TARGET_CONF_TEMP} ${GETARCH_DIR}/${TARGET_CONF} COPYONLY)
  172. if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore")
  173. try_compile(GETARCH_RESULT ${GETARCH_DIR}
  174. SOURCES ${GETARCH_SRC}
  175. COMPILE_DEFINITIONS ${EXFLAGS} ${GETARCH_FLAGS} -I${GETARCH_DIR} -I"${PROJECT_SOURCE_DIR}" -I"${PROJECT_BINARY_DIR}"
  176. OUTPUT_VARIABLE GETARCH_LOG
  177. COPY_FILE ${PROJECT_BINARY_DIR}/${GETARCH_BIN}
  178. )
  179. if (NOT ${GETARCH_RESULT})
  180. MESSAGE(FATAL_ERROR "Compiling getarch failed ${GETARCH_LOG}")
  181. endif ()
  182. endif ()
  183. message(STATUS "Running getarch")
  184. # use the cmake binary w/ the -E param to run a shell command in a cross-platform way
  185. execute_process(COMMAND "${PROJECT_BINARY_DIR}/${GETARCH_BIN}" 0 OUTPUT_VARIABLE GETARCH_MAKE_OUT)
  186. execute_process(COMMAND "${PROJECT_BINARY_DIR}/${GETARCH_BIN}" 1 OUTPUT_VARIABLE GETARCH_CONF_OUT)
  187. message(STATUS "GETARCH results:\n${GETARCH_MAKE_OUT}")
  188. # append config data from getarch to the TARGET file and read in CMake vars
  189. file(APPEND ${TARGET_CONF_TEMP} ${GETARCH_CONF_OUT})
  190. ParseGetArchVars(${GETARCH_MAKE_OUT})
  191. set(GETARCH2_DIR "${PROJECT_BINARY_DIR}/getarch2_build")
  192. set(GETARCH2_BIN "getarch_2nd${CMAKE_EXECUTABLE_SUFFIX}")
  193. file(MAKE_DIRECTORY ${GETARCH2_DIR})
  194. configure_file(${TARGET_CONF_TEMP} ${GETARCH2_DIR}/${TARGET_CONF} COPYONLY)
  195. if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore")
  196. try_compile(GETARCH2_RESULT ${GETARCH2_DIR}
  197. SOURCES ${PROJECT_SOURCE_DIR}/getarch_2nd.c
  198. COMPILE_DEFINITIONS ${EXFLAGS} ${GETARCH_FLAGS} ${GETARCH2_FLAGS} -I${GETARCH2_DIR} -I"${PROJECT_SOURCE_DIR}" -I"${PROJECT_BINARY_DIR}"
  199. OUTPUT_VARIABLE GETARCH2_LOG
  200. COPY_FILE ${PROJECT_BINARY_DIR}/${GETARCH2_BIN}
  201. )
  202. if (NOT ${GETARCH2_RESULT})
  203. MESSAGE(FATAL_ERROR "Compiling getarch_2nd failed ${GETARCH2_LOG}")
  204. endif ()
  205. endif ()
  206. # use the cmake binary w/ the -E param to run a shell command in a cross-platform way
  207. execute_process(COMMAND "${PROJECT_BINARY_DIR}/${GETARCH2_BIN}" 0 OUTPUT_VARIABLE GETARCH2_MAKE_OUT)
  208. execute_process(COMMAND "${PROJECT_BINARY_DIR}/${GETARCH2_BIN}" 1 OUTPUT_VARIABLE GETARCH2_CONF_OUT)
  209. # append config data from getarch_2nd to the TARGET file and read in CMake vars
  210. file(APPEND ${TARGET_CONF_TEMP} ${GETARCH2_CONF_OUT})
  211. configure_file(${TARGET_CONF_TEMP} ${TARGET_CONF_DIR}/${TARGET_CONF} COPYONLY)
  212. ParseGetArchVars(${GETARCH2_MAKE_OUT})
  213. endif()