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.

system.cmake 12 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. ##
  2. ## Author: Hank Anderson <hank@statease.com>
  3. ## Description: Ported from OpenBLAS/Makefile.system
  4. ##
  5. set(NETLIB_LAPACK_DIR "${CMAKE_SOURCE_DIR}/lapack-netlib")
  6. # TODO: Makefile.system detects Darwin (mac) and switches to clang here -hpa
  7. # http://stackoverflow.com/questions/714100/os-detecting-makefile
  8. # TODO: Makefile.system sets HOSTCC = $(CC) here if not already set -hpa
  9. # TARGET_CORE will override TARGET which is used in DYNAMIC_ARCH=1.
  10. if (DEFINED TARGET_CORE)
  11. set(TARGET ${TARGET_CORE})
  12. endif ()
  13. # Force fallbacks for 32bit
  14. if (DEFINED BINARY AND DEFINED TARGET AND BINARY EQUAL 32)
  15. message(STATUS "Compiling a ${BINARY}-bit binary.")
  16. set(NO_AVX 1)
  17. if (${TARGET} STREQUAL "HASWELL" OR ${TARGET} STREQUAL "SANDYBRIDGE")
  18. set(TARGET "NEHALEM")
  19. endif ()
  20. if (${TARGET} STREQUAL "BULLDOZER" OR ${TARGET} STREQUAL "PILEDRIVER")
  21. set(TARGET "BARCELONA")
  22. endif ()
  23. endif ()
  24. if (DEFINED TARGET)
  25. message(STATUS "Targetting the ${TARGET} architecture.")
  26. set(GETARCH_FLAGS "-DFORCE_${TARGET}")
  27. endif ()
  28. if (${INTERFACE64})
  29. message(STATUS "Using 64-bit integers.")
  30. set(GETARCH_FLAGS "${GETARCH_FLAGS} -DUSE64BITINT")
  31. endif ()
  32. if (NOT DEFINED GEMM_MULTITHREAD_THRESHOLD)
  33. set(GEMM_MULTITHREAD_THRESHOLD 4)
  34. endif ()
  35. message(STATUS "GEMM multithread threshold set to ${GEMM_MULTITHREAD_THRESHOLD}.")
  36. set(GETARCH_FLAGS "${GETARCH_FLAGS} -DGEMM_MULTITHREAD_THRESHOLD=${GEMM_MULTITHREAD_THRESHOLD}")
  37. if (${NO_AVX})
  38. message(STATUS "Disabling Advanced Vector Extensions (AVX).")
  39. set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX")
  40. endif ()
  41. if (${NO_AVX2})
  42. message(STATUS "Disabling Advanced Vector Extensions 2 (AVX2).")
  43. set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX2")
  44. endif ()
  45. if (CMAKE_BUILD_TYPE STREQUAL Debug)
  46. set(GETARCH_FLAGS "${GETARCH_FLAGS} -g")
  47. endif ()
  48. # TODO: let CMake handle this? -hpa
  49. #if (${QUIET_MAKE})
  50. # set(MAKE "${MAKE} -s")
  51. #endif()
  52. if (NOT DEFINED NO_PARALLEL_MAKE)
  53. set(NO_PARALLEL_MAKE 0)
  54. endif ()
  55. set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_PARALLEL_MAKE=${NO_PARALLEL_MAKE}")
  56. if (CMAKE_CXX_COMPILER STREQUAL loongcc)
  57. set(GETARCH_FLAGS "${GETARCH_FLAGS} -static")
  58. endif ()
  59. #if don't use Fortran, it will only compile CBLAS.
  60. if (ONLY_CBLAS)
  61. set(NO_LAPACK 1)
  62. else ()
  63. set(ONLY_CBLAS 0)
  64. endif ()
  65. include("${CMAKE_SOURCE_DIR}/cmake/prebuild.cmake")
  66. if (NOT DEFINED NUM_THREADS)
  67. set(NUM_THREADS ${NUM_CORES})
  68. endif ()
  69. if (${NUM_THREADS} EQUAL 1)
  70. set(USE_THREAD 0)
  71. endif ()
  72. if (DEFINED USE_THREAD)
  73. if (NOT ${USE_THREAD})
  74. unset(SMP)
  75. else ()
  76. set(SMP 1)
  77. endif ()
  78. else ()
  79. # N.B. this is NUM_THREAD in Makefile.system which is probably a bug -hpa
  80. if (${NUM_THREADS} EQUAL 1)
  81. unset(SMP)
  82. else ()
  83. set(SMP 1)
  84. endif ()
  85. endif ()
  86. if (${SMP})
  87. message(STATUS "SMP enabled.")
  88. endif ()
  89. if (NOT DEFINED NEED_PIC)
  90. set(NEED_PIC 1)
  91. endif ()
  92. # TODO: I think CMake should be handling all this stuff -hpa
  93. unset(ARFLAGS)
  94. set(CPP "${COMPILER} -E")
  95. set(AR "${CROSS_SUFFIX}ar")
  96. set(AS "${CROSS_SUFFIX}as")
  97. set(LD "${CROSS_SUFFIX}ld")
  98. set(RANLIB "${CROSS_SUFFIX}ranlib")
  99. set(NM "${CROSS_SUFFIX}nm")
  100. set(DLLWRAP "${CROSS_SUFFIX}dllwrap")
  101. set(OBJCOPY "${CROSS_SUFFIX}objcopy")
  102. set(OBJCONV "${CROSS_SUFFIX}objconv")
  103. # OS dependent settings
  104. include("${CMAKE_SOURCE_DIR}/cmake/os.cmake")
  105. # Architecture dependent settings
  106. include("${CMAKE_SOURCE_DIR}/cmake/arch.cmake")
  107. # C Compiler dependent settings
  108. include("${CMAKE_SOURCE_DIR}/cmake/cc.cmake")
  109. # Fortran Compiler dependent settings
  110. include("${CMAKE_SOURCE_DIR}/cmake/fc.cmake")
  111. if (BINARY64)
  112. if (INTERFACE64)
  113. # CCOMMON_OPT += -DUSE64BITINT
  114. endif ()
  115. endif ()
  116. if (NEED_PIC)
  117. if (${CMAKE_C_COMPILER} STREQUAL "IBM")
  118. set(CCOMMON_OPT "${CCOMMON_OPT} -qpic=large")
  119. else ()
  120. set(CCOMMON_OPT "${CCOMMON_OPT} -fPIC")
  121. endif ()
  122. if (${F_COMPILER} STREQUAL "SUN")
  123. set(FCOMMON_OPT "${FCOMMON_OPT} -pic")
  124. else ()
  125. set(FCOMMON_OPT "${FCOMMON_OPT} -fPIC")
  126. endif ()
  127. endif ()
  128. if (DYNAMIC_ARCH)
  129. set(CCOMMON_OPT "${CCOMMON_OPT} -DDYNAMIC_ARCH")
  130. endif ()
  131. if (NO_LAPACK)
  132. set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_LAPACK")
  133. #Disable LAPACK C interface
  134. set(NO_LAPACKE 1)
  135. endif ()
  136. if (NO_LAPACKE)
  137. set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_LAPACKE")
  138. endif ()
  139. if (NO_AVX)
  140. set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX")
  141. endif ()
  142. if (${ARCH} STREQUAL "x86")
  143. set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX")
  144. endif ()
  145. if (NO_AVX2)
  146. set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX2")
  147. endif ()
  148. if (SMP)
  149. set(CCOMMON_OPT "${CCOMMON_OPT} -DSMP_SERVER")
  150. if (${ARCH} STREQUAL "mips64")
  151. if (NOT ${CORE} STREQUAL "LOONGSON3B")
  152. set(USE_SIMPLE_THREADED_LEVEL3 1)
  153. endif ()
  154. endif ()
  155. if (USE_OPENMP)
  156. # USE_SIMPLE_THREADED_LEVEL3 = 1
  157. # NO_AFFINITY = 1
  158. set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_OPENMP")
  159. endif ()
  160. if (BIGNUMA)
  161. set(CCOMMON_OPT "${CCOMMON_OPT} -DBIGNUMA")
  162. endif ()
  163. endif ()
  164. if (NO_WARMUP)
  165. set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_WARMUP")
  166. endif ()
  167. if (CONSISTENT_FPCSR)
  168. set(CCOMMON_OPT "${CCOMMON_OPT} -DCONSISTENT_FPCSR")
  169. endif ()
  170. # Only for development
  171. # set(CCOMMON_OPT "${CCOMMON_OPT} -DPARAMTEST")
  172. # set(CCOMMON_OPT "${CCOMMON_OPT} -DPREFETCHTEST")
  173. # set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_SWITCHING")
  174. # set(USE_PAPI 1)
  175. if (USE_PAPI)
  176. set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_PAPI")
  177. set(EXTRALIB "${EXTRALIB} -lpapi -lperfctr")
  178. endif ()
  179. if (DYNAMIC_THREADS)
  180. set(CCOMMON_OPT "${CCOMMON_OPT} -DDYNAMIC_THREADS")
  181. endif ()
  182. set(CCOMMON_OPT "${CCOMMON_OPT} -DMAX_CPU_NUMBER=${NUM_THREADS}")
  183. if (USE_SIMPLE_THREADED_LEVEL3)
  184. set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_SIMPLE_THREADED_LEVEL3")
  185. endif ()
  186. if (DEFINED LIBNAMESUFFIX)
  187. set(LIBPREFIX "libopenblas_${LIBNAMESUFFIX}")
  188. else ()
  189. set(LIBPREFIX "libopenblas")
  190. endif ()
  191. if (NOT DEFINED SYMBOLPREFIX)
  192. set(SYMBOLPREFIX "")
  193. endif ()
  194. if (NOT DEFINED SYMBOLSUFFIX)
  195. set(SYMBOLSUFFIX "")
  196. endif ()
  197. set(KERNELDIR "${CMAKE_SOURCE_DIR}/kernel/${ARCH}")
  198. # TODO: nead to convert these Makefiles
  199. # include ${CMAKE_SOURCE_DIR}/cmake/${ARCH}.cmake
  200. if (${CORE} STREQUAL "PPC440")
  201. set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_QALLOC")
  202. endif ()
  203. if (${CORE} STREQUAL "PPC440FP2")
  204. set(STATIC_ALLOCATION 1)
  205. endif ()
  206. if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
  207. set(NO_AFFINITY 1)
  208. endif ()
  209. if (NOT ${ARCH} STREQUAL "x86_64" AND NOT ${ARCH} STREQUAL "x86" AND NOT ${CORE} STREQUAL "LOONGSON3B")
  210. set(NO_AFFINITY 1)
  211. endif ()
  212. if (NO_AFFINITY)
  213. set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AFFINITY")
  214. endif ()
  215. if (FUNCTION_PROFILE)
  216. set(CCOMMON_OPT "${CCOMMON_OPT} -DFUNCTION_PROFILE")
  217. endif ()
  218. if (HUGETLB_ALLOCATION)
  219. set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_HUGETLB")
  220. endif ()
  221. if (DEFINED HUGETLBFILE_ALLOCATION)
  222. set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_HUGETLBFILE -DHUGETLB_FILE_NAME=${HUGETLBFILE_ALLOCATION})")
  223. endif ()
  224. if (STATIC_ALLOCATION)
  225. set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_STATIC")
  226. endif ()
  227. if (DEVICEDRIVER_ALLOCATION)
  228. set(CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_DEVICEDRIVER -DDEVICEDRIVER_NAME=\"/dev/mapper\"")
  229. endif ()
  230. if (MIXED_MEMORY_ALLOCATION)
  231. set(CCOMMON_OPT "${CCOMMON_OPT} -DMIXED_MEMORY_ALLOCATION")
  232. endif ()
  233. if (${CMAKE_SYSTEM_NAME} STREQUAL "SunOS")
  234. set(TAR gtar)
  235. set(PATCH gpatch)
  236. set(GREP ggrep)
  237. else ()
  238. set(TAR tar)
  239. set(PATCH patch)
  240. set(GREP grep)
  241. endif ()
  242. if (NOT DEFINED MD5SUM)
  243. set(MD5SUM md5sum)
  244. endif ()
  245. set(AWK awk)
  246. set(REVISION "-r${OpenBLAS_VERSION}")
  247. set(MAJOR_VERSION ${OpenBLAS_MAJOR_VERSION})
  248. if (DEBUG)
  249. set(COMMON_OPT "${COMMON_OPT} -g")
  250. endif ()
  251. if (NOT DEFINED COMMON_OPT)
  252. set(COMMON_OPT "-O2")
  253. endif ()
  254. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_OPT} ${CCOMMON_OPT}")
  255. # TODO: not sure what PFLAGS is -hpa
  256. set(PFLAGS "${PFLAGS} ${COMMON_OPT} ${CCOMMON_OPT} -I${TOPDIR} -DPROFILE ${COMMON_PROF}")
  257. set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${COMMON_OPT} ${FCOMMON_OPT}")
  258. # TODO: not sure what FPFLAGS is -hpa
  259. set(FPFLAGS "${FPFLAGS} ${COMMON_OPT} ${FCOMMON_OPT} ${COMMON_PROF}")
  260. #For LAPACK Fortran codes.
  261. set(LAPACK_FFLAGS "${LAPACK_FFLAGS} ${CMAKE_Fortran_FLAGS}")
  262. set(LAPACK_FPFLAGS "${LAPACK_FPFLAGS} ${FPFLAGS}")
  263. #Disable -fopenmp for LAPACK Fortran codes on Windows.
  264. if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
  265. set(FILTER_FLAGS "-fopenmp;-mp;-openmp;-xopenmp=parralel")
  266. foreach (FILTER_FLAG ${FILTER_FLAGS})
  267. string(REPLACE ${FILTER_FLAG} "" LAPACK_FFLAGS ${LAPACK_FFLAGS})
  268. string(REPLACE ${FILTER_FLAG} "" LAPACK_FPFLAGS ${LAPACK_FPFLAGS})
  269. endforeach ()
  270. endif ()
  271. if (${F_COMPILER} STREQUAL "GFORTRAN")
  272. # lapack-netlib is rife with uninitialized warnings -hpa
  273. set(LAPACK_FFLAGS "${LAPACK_FFLAGS} -Wno-maybe-uninitialized")
  274. endif ()
  275. set(LAPACK_CFLAGS "${CMAKE_C_CFLAGS} -DHAVE_LAPACK_CONFIG_H")
  276. if (INTERFACE64)
  277. set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DLAPACK_ILP64")
  278. endif ()
  279. if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
  280. set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DOPENBLAS_OS_WINDOWS")
  281. endif ()
  282. if (${CMAKE_C_COMPILER} STREQUAL "LSB")
  283. set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DLAPACK_COMPLEX_STRUCTURE")
  284. endif ()
  285. if (NOT DEFINED SUFFIX)
  286. set(SUFFIX o)
  287. endif ()
  288. if (NOT DEFINED PSUFFIX)
  289. set(PSUFFIX po)
  290. endif ()
  291. if (NOT DEFINED LIBSUFFIX)
  292. set(LIBSUFFIX a)
  293. endif ()
  294. if (DYNAMIC_ARCH)
  295. if (DEFINED SMP)
  296. set(LIBNAME "${LIBPREFIX}p${REVISION}.${LIBSUFFIX}")
  297. set(LIBNAME_P "${LIBPREFIX}p${REVISION}_p.${LIBSUFFIX}")
  298. else ()
  299. set(LIBNAME "${LIBPREFIX}${REVISION}.${LIBSUFFIX}")
  300. set(LIBNAME_P "${LIBPREFIX}${REVISION}_p.${LIBSUFFIX}")
  301. endif ()
  302. else ()
  303. if (DEFINED SMP)
  304. set(LIBNAME "${LIBPREFIX}_${LIBCORE}p${REVISION}.${LIBSUFFIX}")
  305. set(LIBNAME_P "${LIBPREFIX}_${LIBCORE}p${REVISION}_p.${LIBSUFFIX}")
  306. else ()
  307. set(LIBNAME "${LIBPREFIX}_${LIBCORE}${REVISION}.${LIBSUFFIX}")
  308. set(LIBNAME_P "${LIBPREFIX}_${LIBCORE}${REVISION}_p.${LIBSUFFIX}")
  309. endif ()
  310. endif ()
  311. set(LIBDLLNAME "${LIBPREFIX}.dll")
  312. set(LIBSONAME "${LIBNAME}.${LIBSUFFIX}.so")
  313. set(LIBDYNNAME "${LIBNAME}.${LIBSUFFIX}.dylib")
  314. set(LIBDEFNAME "${LIBNAME}.${LIBSUFFIX}.def")
  315. set(LIBEXPNAME "${LIBNAME}.${LIBSUFFIX}.exp")
  316. set(LIBZIPNAME "${LIBNAME}.${LIBSUFFIX}.zip")
  317. set(LIBS "${CMAKE_SOURCE_DIR}/${LIBNAME}")
  318. set(LIBS_P "${CMAKE_SOURCE_DIR}/${LIBNAME_P}")
  319. set(LIB_COMPONENTS BLAS)
  320. if (NOT NO_CBLAS)
  321. set(LIB_COMPONENTS "${LIB_COMPONENTS} CBLAS")
  322. endif ()
  323. if (NOT NO_LAPACK)
  324. set(LIB_COMPONENTS "${LIB_COMPONENTS} LAPACK")
  325. if (NOT NO_LAPACKE)
  326. set(LIB_COMPONENTS "${LIB_COMPONENTS} LAPACKE")
  327. endif ()
  328. endif ()
  329. if (ONLY_CBLAS)
  330. set(LIB_COMPONENTS CBLAS)
  331. endif ()
  332. #export OSNAME
  333. #export ARCH
  334. #export CORE
  335. #export LIBCORE
  336. #export PGCPATH
  337. #export CONFIG
  338. #export CC
  339. #export FC
  340. #export BU
  341. #export FU
  342. #export NEED2UNDERSCORES
  343. #export USE_THREAD
  344. #export NUM_THREADS
  345. #export NUM_CORES
  346. #export SMP
  347. #export MAKEFILE_RULE
  348. #export NEED_PIC
  349. #export BINARY
  350. #export BINARY32
  351. #export BINARY64
  352. #export F_COMPILER
  353. #export C_COMPILER
  354. #export USE_OPENMP
  355. #export CROSS
  356. #export CROSS_SUFFIX
  357. #export NOFORTRAN
  358. #export NO_FBLAS
  359. #export EXTRALIB
  360. #export CEXTRALIB
  361. #export FEXTRALIB
  362. #export HAVE_SSE
  363. #export HAVE_SSE2
  364. #export HAVE_SSE3
  365. #export HAVE_SSSE3
  366. #export HAVE_SSE4_1
  367. #export HAVE_SSE4_2
  368. #export HAVE_SSE4A
  369. #export HAVE_SSE5
  370. #export HAVE_AVX
  371. #export HAVE_VFP
  372. #export HAVE_VFPV3
  373. #export HAVE_VFPV4
  374. #export HAVE_NEON
  375. #export KERNELDIR
  376. #export FUNCTION_PROFILE
  377. #export TARGET_CORE
  378. #
  379. #export SGEMM_UNROLL_M
  380. #export SGEMM_UNROLL_N
  381. #export DGEMM_UNROLL_M
  382. #export DGEMM_UNROLL_N
  383. #export QGEMM_UNROLL_M
  384. #export QGEMM_UNROLL_N
  385. #export CGEMM_UNROLL_M
  386. #export CGEMM_UNROLL_N
  387. #export ZGEMM_UNROLL_M
  388. #export ZGEMM_UNROLL_N
  389. #export XGEMM_UNROLL_M
  390. #export XGEMM_UNROLL_N
  391. #export CGEMM3M_UNROLL_M
  392. #export CGEMM3M_UNROLL_N
  393. #export ZGEMM3M_UNROLL_M
  394. #export ZGEMM3M_UNROLL_N
  395. #export XGEMM3M_UNROLL_M
  396. #export XGEMM3M_UNROLL_N
  397. #if (USE_CUDA)
  398. # export CUDADIR
  399. # export CUCC
  400. # export CUFLAGS
  401. # export CULIB
  402. #endif
  403. #.SUFFIXES: .$(PSUFFIX) .$(SUFFIX) .f
  404. #
  405. #.f.$(SUFFIX):
  406. # $(FC) $(FFLAGS) -c $< -o $(@F)
  407. #
  408. #.f.$(PSUFFIX):
  409. # $(FC) $(FPFLAGS) -pg -c $< -o $(@F)
  410. # these are not cross-platform
  411. #ifdef BINARY64
  412. #PATHSCALEPATH = /opt/pathscale/lib/3.1
  413. #PGIPATH = /opt/pgi/linux86-64/7.1-5/lib
  414. #else
  415. #PATHSCALEPATH = /opt/pathscale/lib/3.1/32
  416. #PGIPATH = /opt/pgi/linux86/7.1-5/lib
  417. #endif
  418. #ACMLPATH = /opt/acml/4.3.0
  419. #ifneq ($(OSNAME), Darwin)
  420. #MKLPATH = /opt/intel/mkl/10.2.2.025/lib
  421. #else
  422. #MKLPATH = /Library/Frameworks/Intel_MKL.framework/Versions/10.0.1.014/lib
  423. #endif
  424. #ATLASPATH = /opt/atlas/3.9.17/opteron
  425. #FLAMEPATH = $(HOME)/flame/lib
  426. #ifneq ($(OSNAME), SunOS)
  427. #SUNPATH = /opt/sunstudio12.1
  428. #else
  429. #SUNPATH = /opt/SUNWspro
  430. #endif