Merge pull request #3459 from rafaelcfsousa/fix_cmake

Fix issues when building OpenBLAS with cmake
This commit is contained in:
Martin Kroeker 2021-11-26 15:19:24 +01:00 committed by GitHub
commit bcfbdc81b2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 351 additions and 245 deletions

View File

@ -1,214 +1,218 @@
# helper functions for the kernel CMakeLists.txt # helper functions for the kernel CMakeLists.txt
function(SetFallback KERNEL SOURCE_PATH)
if (NOT (DEFINED ${KERNEL}))
set(${KERNEL} ${SOURCE_PATH} PARENT_SCOPE)
endif ()
endfunction()
# Set the default filenames for L1 objects. Most of these will be overridden by the appropriate KERNEL file.
macro(SetDefaultL1) macro(SetDefaultL1)
set(SAMAXKERNEL amax.S) SetFallback(SAMAXKERNEL amax.S)
set(DAMAXKERNEL amax.S) SetFallback(DAMAXKERNEL amax.S)
set(QAMAXKERNEL amax.S) SetFallback(QAMAXKERNEL amax.S)
set(CAMAXKERNEL zamax.S) SetFallback(CAMAXKERNEL zamax.S)
set(ZAMAXKERNEL zamax.S) SetFallback(ZAMAXKERNEL zamax.S)
set(XAMAXKERNEL zamax.S) SetFallback(XAMAXKERNEL zamax.S)
set(SAMINKERNEL amin.S) SetFallback(SAMINKERNEL amin.S)
set(DAMINKERNEL amin.S) SetFallback(DAMINKERNEL amin.S)
set(QAMINKERNEL amin.S) SetFallback(QAMINKERNEL amin.S)
set(CAMINKERNEL zamin.S) SetFallback(CAMINKERNEL zamin.S)
set(ZAMINKERNEL zamin.S) SetFallback(ZAMINKERNEL zamin.S)
set(XAMINKERNEL zamin.S) SetFallback(XAMINKERNEL zamin.S)
set(SMAXKERNEL max.S) SetFallback(SMAXKERNEL max.S)
set(DMAXKERNEL max.S) SetFallback(DMAXKERNEL max.S)
set(QMAXKERNEL max.S) SetFallback(QMAXKERNEL max.S)
set(SMINKERNEL min.S) SetFallback(SMINKERNEL min.S)
set(DMINKERNEL min.S) SetFallback(DMINKERNEL min.S)
set(QMINKERNEL min.S) SetFallback(QMINKERNEL min.S)
set(ISAMAXKERNEL iamax.S) SetFallback(ISAMAXKERNEL iamax.S)
set(IDAMAXKERNEL iamax.S) SetFallback(IDAMAXKERNEL iamax.S)
set(IQAMAXKERNEL iamax.S) SetFallback(IQAMAXKERNEL iamax.S)
set(ICAMAXKERNEL izamax.S) SetFallback(ICAMAXKERNEL izamax.S)
set(IZAMAXKERNEL izamax.S) SetFallback(IZAMAXKERNEL izamax.S)
set(IXAMAXKERNEL izamax.S) SetFallback(IXAMAXKERNEL izamax.S)
set(ISAMINKERNEL iamin.S) SetFallback(ISAMINKERNEL iamin.S)
set(IDAMINKERNEL iamin.S) SetFallback(IDAMINKERNEL iamin.S)
set(IQAMINKERNEL iamin.S) SetFallback(IQAMINKERNEL iamin.S)
set(ICAMINKERNEL izamin.S) SetFallback(ICAMINKERNEL izamin.S)
set(IZAMINKERNEL izamin.S) SetFallback(IZAMINKERNEL izamin.S)
set(IXAMINKERNEL izamin.S) SetFallback(IXAMINKERNEL izamin.S)
set(ISMAXKERNEL iamax.S) SetFallback(ISMAXKERNEL iamax.S)
set(IDMAXKERNEL iamax.S) SetFallback(IDMAXKERNEL iamax.S)
set(IQMAXKERNEL iamax.S) SetFallback(IQMAXKERNEL iamax.S)
set(ISMINKERNEL iamin.S) SetFallback(ISMINKERNEL iamin.S)
set(IDMINKERNEL iamin.S) SetFallback(IDMINKERNEL iamin.S)
set(IQMINKERNEL iamin.S) SetFallback(IQMINKERNEL iamin.S)
set(SASUMKERNEL asum.S) SetFallback(SASUMKERNEL asum.S)
set(DASUMKERNEL asum.S) SetFallback(DASUMKERNEL asum.S)
set(CASUMKERNEL zasum.S) SetFallback(CASUMKERNEL zasum.S)
set(ZASUMKERNEL zasum.S) SetFallback(ZASUMKERNEL zasum.S)
set(QASUMKERNEL asum.S) SetFallback(QASUMKERNEL asum.S)
set(XASUMKERNEL zasum.S) SetFallback(XASUMKERNEL zasum.S)
set(SAXPYKERNEL axpy.S) SetFallback(SAXPYKERNEL axpy.S)
set(DAXPYKERNEL axpy.S) SetFallback(DAXPYKERNEL axpy.S)
set(CAXPYKERNEL zaxpy.S) SetFallback(CAXPYKERNEL zaxpy.S)
set(ZAXPYKERNEL zaxpy.S) SetFallback(ZAXPYKERNEL zaxpy.S)
set(QAXPYKERNEL axpy.S) SetFallback(QAXPYKERNEL axpy.S)
set(XAXPYKERNEL zaxpy.S) SetFallback(XAXPYKERNEL zaxpy.S)
set(SCOPYKERNEL copy.S) SetFallback(SCOPYKERNEL copy.S)
set(DCOPYKERNEL copy.S) SetFallback(DCOPYKERNEL copy.S)
set(CCOPYKERNEL zcopy.S) SetFallback(CCOPYKERNEL zcopy.S)
set(ZCOPYKERNEL zcopy.S) SetFallback(ZCOPYKERNEL zcopy.S)
set(QCOPYKERNEL copy.S) SetFallback(QCOPYKERNEL copy.S)
set(XCOPYKERNEL zcopy.S) SetFallback(XCOPYKERNEL zcopy.S)
set(SDOTKERNEL dot.S) SetFallback(SDOTKERNEL dot.S)
set(DDOTKERNEL dot.S) SetFallback(DDOTKERNEL dot.S)
set(CDOTKERNEL zdot.S) SetFallback(CDOTKERNEL zdot.S)
set(ZDOTKERNEL zdot.S) SetFallback(ZDOTKERNEL zdot.S)
set(QDOTKERNEL dot.S) SetFallback(QDOTKERNEL dot.S)
set(XDOTKERNEL zdot.S) SetFallback(XDOTKERNEL zdot.S)
set(SNRM2KERNEL nrm2.S) SetFallback(SNRM2KERNEL nrm2.S)
set(DNRM2KERNEL nrm2.S) SetFallback(DNRM2KERNEL nrm2.S)
set(QNRM2KERNEL nrm2.S) SetFallback(QNRM2KERNEL nrm2.S)
set(CNRM2KERNEL znrm2.S) SetFallback(CNRM2KERNEL znrm2.S)
set(ZNRM2KERNEL znrm2.S) SetFallback(ZNRM2KERNEL znrm2.S)
set(XNRM2KERNEL znrm2.S) SetFallback(XNRM2KERNEL znrm2.S)
set(SROTKERNEL rot.S) SetFallback(SROTKERNEL rot.S)
set(DROTKERNEL rot.S) SetFallback(DROTKERNEL rot.S)
set(QROTKERNEL rot.S) SetFallback(QROTKERNEL rot.S)
set(CROTKERNEL zrot.S) SetFallback(CROTKERNEL zrot.S)
set(ZROTKERNEL zrot.S) SetFallback(ZROTKERNEL zrot.S)
set(XROTKERNEL zrot.S) SetFallback(XROTKERNEL zrot.S)
set(SSCALKERNEL scal.S) SetFallback(SSCALKERNEL scal.S)
set(DSCALKERNEL scal.S) SetFallback(DSCALKERNEL scal.S)
set(CSCALKERNEL zscal.S) SetFallback(CSCALKERNEL zscal.S)
set(ZSCALKERNEL zscal.S) SetFallback(ZSCALKERNEL zscal.S)
set(QSCALKERNEL scal.S) SetFallback(QSCALKERNEL scal.S)
set(XSCALKERNEL zscal.S) SetFallback(XSCALKERNEL zscal.S)
set(SSWAPKERNEL swap.S) SetFallback(SSWAPKERNEL swap.S)
set(DSWAPKERNEL swap.S) SetFallback(DSWAPKERNEL swap.S)
set(CSWAPKERNEL zswap.S) SetFallback(CSWAPKERNEL zswap.S)
set(ZSWAPKERNEL zswap.S) SetFallback(ZSWAPKERNEL zswap.S)
set(QSWAPKERNEL swap.S) SetFallback(QSWAPKERNEL swap.S)
set(XSWAPKERNEL zswap.S) SetFallback(XSWAPKERNEL zswap.S)
set(SGEMVNKERNEL gemv_n.S) SetFallback(SGEMVNKERNEL gemv_n.S)
set(SGEMVTKERNEL gemv_t.S) SetFallback(SGEMVTKERNEL gemv_t.S)
set(DGEMVNKERNEL gemv_n.S) SetFallback(DGEMVNKERNEL gemv_n.S)
set(DGEMVTKERNEL gemv_t.S) SetFallback(DGEMVTKERNEL gemv_t.S)
set(CGEMVNKERNEL zgemv_n.S) SetFallback(CGEMVNKERNEL zgemv_n.S)
set(CGEMVTKERNEL zgemv_t.S) SetFallback(CGEMVTKERNEL zgemv_t.S)
set(ZGEMVNKERNEL zgemv_n.S) SetFallback(ZGEMVNKERNEL zgemv_n.S)
set(ZGEMVTKERNEL zgemv_t.S) SetFallback(ZGEMVTKERNEL zgemv_t.S)
set(QGEMVNKERNEL gemv_n.S) SetFallback(QGEMVNKERNEL gemv_n.S)
set(QGEMVTKERNEL gemv_t.S) SetFallback(QGEMVTKERNEL gemv_t.S)
set(XGEMVNKERNEL zgemv_n.S) SetFallback(XGEMVNKERNEL zgemv_n.S)
set(XGEMVTKERNEL zgemv_t.S) SetFallback(XGEMVTKERNEL zgemv_t.S)
set(SCABS_KERNEL ../generic/cabs.c) SetFallback(SCABS_KERNEL ../generic/cabs.c)
set(DCABS_KERNEL ../generic/cabs.c) SetFallback(DCABS_KERNEL ../generic/cabs.c)
set(QCABS_KERNEL ../generic/cabs.c) SetFallback(QCABS_KERNEL ../generic/cabs.c)
set(LSAME_KERNEL ../generic/lsame.c) SetFallback(LSAME_KERNEL ../generic/lsame.c)
set(SAXPBYKERNEL ../arm/axpby.c) SetFallback(SAXPBYKERNEL ../arm/axpby.c)
set(DAXPBYKERNEL ../arm/axpby.c) SetFallback(DAXPBYKERNEL ../arm/axpby.c)
set(CAXPBYKERNEL ../arm/zaxpby.c) SetFallback(CAXPBYKERNEL ../arm/zaxpby.c)
set(ZAXPBYKERNEL ../arm/zaxpby.c) SetFallback(ZAXPBYKERNEL ../arm/zaxpby.c)
set(SSUMKERNEL sum.S) SetFallback(SSUMKERNEL sum.S)
set(DSUMKERNEL sum.S) SetFallback(DSUMKERNEL sum.S)
set(CSUMKERNEL zsum.S) SetFallback(CSUMKERNEL zsum.S)
set(ZSUMKERNEL zsum.S) SetFallback(ZSUMKERNEL zsum.S)
set(QSUMKERNEL sum.S) SetFallback(QSUMKERNEL sum.S)
set(XSUMKERNEL zsum.S) SetFallback(XSUMKERNEL zsum.S)
if (BUILD_BFLOAT16) if (BUILD_BFLOAT16)
set(SHAMINKERNEL ../arm/amin.c) SetFallback(SHAMINKERNEL ../arm/amin.c)
set(SHAMAXKERNEL ../arm/amax.c) SetFallback(SHAMAXKERNEL ../arm/amax.c)
set(SHMAXKERNEL ../arm/max.c) SetFallback(SHMAXKERNEL ../arm/max.c)
set(SHMINKERNEL ../arm/min.c) SetFallback(SHMINKERNEL ../arm/min.c)
set(ISHAMAXKERNEL ../arm/iamax.c) SetFallback(ISHAMAXKERNEL ../arm/iamax.c)
set(ISHAMINKERNEL ../arm/iamin.c) SetFallback(ISHAMINKERNEL ../arm/iamin.c)
set(ISHMAXKERNEL ../arm/imax.c) SetFallback(ISHMAXKERNEL ../arm/imax.c)
set(ISHMINKERNEL ../arm/imin.c) SetFallback(ISHMINKERNEL ../arm/imin.c)
set(SHASUMKERNEL ../arm/asum.c) SetFallback(SHASUMKERNEL ../arm/asum.c)
set(SHAXPYKERNEL ../arm/axpy.c) SetFallback(SHAXPYKERNEL ../arm/axpy.c)
set(SHAXPBYKERNEL ../arm/axpby.c) SetFallback(SHAXPBYKERNEL ../arm/axpby.c)
set(SHCOPYKERNEL ../arm/copy.c) SetFallback(SHCOPYKERNEL ../arm/copy.c)
set(SBDOTKERNEL ../x86_64/sbdot.c) SetFallback(SBDOTKERNEL ../x86_64/sbdot.c)
set(SHROTKERNEL ../arm/rot.c) SetFallback(SHROTKERNEL ../arm/rot.c)
set(SHSCALKERNEL ../arm/scal.c) SetFallback(SHSCALKERNEL ../arm/scal.c)
set(SHNRM2KERNEL ../arm/nrm2.c) SetFallback(SHNRM2KERNEL ../arm/nrm2.c)
set(SHSUMKERNEL ../arm/sum.c) SetFallback(SHSUMKERNEL ../arm/sum.c)
set(SHSWAPKERNEL ../arm/swap.c) SetFallback(SHSWAPKERNEL ../arm/swap.c)
set(TOBF16KERNEL ../x86_64/tobf16.c) SetFallback(TOBF16KERNEL ../x86_64/tobf16.c)
set(BF16TOKERNEL ../x86_64/bf16to.c) SetFallback(BF16TOKERNEL ../x86_64/bf16to.c)
set(SBGEMVNKERNEL ../x86_64/sbgemv_n.c) SetFallback(SBGEMVNKERNEL ../x86_64/sbgemv_n.c)
set(SBGEMVTKERNEL ../x86_64/sbgemv_t.c) SetFallback(SBGEMVTKERNEL ../x86_64/sbgemv_t.c)
endif () endif ()
endmacro () endmacro ()
macro(SetDefaultL2) macro(SetDefaultL2)
set(SGEMVNKERNEL ../arm/gemv_n.c) SetFallback(SGEMVNKERNEL ../arm/gemv_n.c)
set(SGEMVTKERNEL ../arm/gemv_t.c) SetFallback(SGEMVTKERNEL ../arm/gemv_t.c)
set(DGEMVNKERNEL gemv_n.S) SetFallback(DGEMVNKERNEL gemv_n.S)
set(DGEMVTKERNEL gemv_t.S) SetFallback(DGEMVTKERNEL gemv_t.S)
set(CGEMVNKERNEL zgemv_n.S) SetFallback(CGEMVNKERNEL zgemv_n.S)
set(CGEMVTKERNEL zgemv_t.S) SetFallback(CGEMVTKERNEL zgemv_t.S)
set(ZGEMVNKERNEL zgemv_n.S) SetFallback(ZGEMVNKERNEL zgemv_n.S)
set(ZGEMVTKERNEL zgemv_t.S) SetFallback(ZGEMVTKERNEL zgemv_t.S)
set(QGEMVNKERNEL gemv_n.S) SetFallback(QGEMVNKERNEL gemv_n.S)
set(QGEMVTKERNEL gemv_t.S) SetFallback(QGEMVTKERNEL gemv_t.S)
set(XGEMVNKERNEL zgemv_n.S) SetFallback(XGEMVNKERNEL zgemv_n.S)
set(XGEMVTKERNEL zgemv_t.S) SetFallback(XGEMVTKERNEL zgemv_t.S)
set(SGERKERNEL ../generic/ger.c) SetFallback(SGERKERNEL ../generic/ger.c)
set(DGERKERNEL ../generic/ger.c) SetFallback(DGERKERNEL ../generic/ger.c)
set(QGERKERNEL ../generic/ger.c) SetFallback(QGERKERNEL ../generic/ger.c)
set(CGERUKERNEL ../generic/zger.c) SetFallback(CGERUKERNEL ../generic/zger.c)
set(CGERCKERNEL ../generic/zger.c) SetFallback(CGERCKERNEL ../generic/zger.c)
set(ZGERUKERNEL ../generic/zger.c) SetFallback(ZGERUKERNEL ../generic/zger.c)
set(ZGERCKERNEL ../generic/zger.c) SetFallback(ZGERCKERNEL ../generic/zger.c)
set(XGERUKERNEL ../generic/zger.c) SetFallback(XGERUKERNEL ../generic/zger.c)
set(XGERCKERNEL ../generic/zger.c) SetFallback(XGERCKERNEL ../generic/zger.c)
set(SSYMV_U_KERNEL ../generic/symv_k.c) SetFallback(SSYMV_U_KERNEL ../generic/symv_k.c)
set(SSYMV_L_KERNEL ../generic/symv_k.c) SetFallback(SSYMV_L_KERNEL ../generic/symv_k.c)
set(DSYMV_U_KERNEL ../generic/symv_k.c) SetFallback(DSYMV_U_KERNEL ../generic/symv_k.c)
set(DSYMV_L_KERNEL ../generic/symv_k.c) SetFallback(DSYMV_L_KERNEL ../generic/symv_k.c)
set(QSYMV_U_KERNEL ../generic/symv_k.c) SetFallback(QSYMV_U_KERNEL ../generic/symv_k.c)
set(QSYMV_L_KERNEL ../generic/symv_k.c) SetFallback(QSYMV_L_KERNEL ../generic/symv_k.c)
set(CSYMV_U_KERNEL ../generic/zsymv_k.c) SetFallback(CSYMV_U_KERNEL ../generic/zsymv_k.c)
set(CSYMV_L_KERNEL ../generic/zsymv_k.c) SetFallback(CSYMV_L_KERNEL ../generic/zsymv_k.c)
set(ZSYMV_U_KERNEL ../generic/zsymv_k.c) SetFallback(ZSYMV_U_KERNEL ../generic/zsymv_k.c)
set(ZSYMV_L_KERNEL ../generic/zsymv_k.c) SetFallback(ZSYMV_L_KERNEL ../generic/zsymv_k.c)
set(XSYMV_U_KERNEL ../generic/zsymv_k.c) SetFallback(XSYMV_U_KERNEL ../generic/zsymv_k.c)
set(XSYMV_L_KERNEL ../generic/zsymv_k.c) SetFallback(XSYMV_L_KERNEL ../generic/zsymv_k.c)
set(CHEMV_U_KERNEL ../generic/zhemv_k.c) SetFallback(CHEMV_U_KERNEL ../generic/zhemv_k.c)
set(CHEMV_L_KERNEL ../generic/zhemv_k.c) SetFallback(CHEMV_L_KERNEL ../generic/zhemv_k.c)
set(CHEMV_V_KERNEL ../generic/zhemv_k.c) SetFallback(CHEMV_V_KERNEL ../generic/zhemv_k.c)
set(CHEMV_M_KERNEL ../generic/zhemv_k.c) SetFallback(CHEMV_M_KERNEL ../generic/zhemv_k.c)
set(ZHEMV_U_KERNEL ../generic/zhemv_k.c) SetFallback(ZHEMV_U_KERNEL ../generic/zhemv_k.c)
set(ZHEMV_L_KERNEL ../generic/zhemv_k.c) SetFallback(ZHEMV_L_KERNEL ../generic/zhemv_k.c)
set(ZHEMV_V_KERNEL ../generic/zhemv_k.c) SetFallback(ZHEMV_V_KERNEL ../generic/zhemv_k.c)
set(ZHEMV_M_KERNEL ../generic/zhemv_k.c) SetFallback(ZHEMV_M_KERNEL ../generic/zhemv_k.c)
set(XHEMV_U_KERNEL ../generic/zhemv_k.c) SetFallback(XHEMV_U_KERNEL ../generic/zhemv_k.c)
set(XHEMV_L_KERNEL ../generic/zhemv_k.c) SetFallback(XHEMV_L_KERNEL ../generic/zhemv_k.c)
set(XHEMV_V_KERNEL ../generic/zhemv_k.c) SetFallback(XHEMV_V_KERNEL ../generic/zhemv_k.c)
set(XHEMV_M_KERNEL ../generic/zhemv_k.c) SetFallback(XHEMV_M_KERNEL ../generic/zhemv_k.c)
if (BUILD_BFLOAT16) if (BUILD_BFLOAT16)
set(SBGEMVNKERNEL ../x86_64/sbgemv_n.c) SetFallback(SBGEMVNKERNEL ../x86_64/sbgemv_n.c)
set(SBGEMVTKERNEL ../x86_64/sbgemv_t.c) SetFallback(SBGEMVTKERNEL ../x86_64/sbgemv_t.c)
set(SHGERKERNEL ../generic/ger.c) SetFallback(SHGERKERNEL ../generic/ger.c)
endif () endif ()
endmacro () endmacro ()
macro(SetDefaultL3) macro(SetDefaultL3)
set(SGEADD_KERNEL ../generic/geadd.c) SetFallback(SGEADD_KERNEL ../generic/geadd.c)
set(DGEADD_KERNEL ../generic/geadd.c) SetFallback(DGEADD_KERNEL ../generic/geadd.c)
set(CGEADD_KERNEL ../generic/zgeadd.c) SetFallback(CGEADD_KERNEL ../generic/zgeadd.c)
set(ZGEADD_KERNEL ../generic/zgeadd.c) SetFallback(ZGEADD_KERNEL ../generic/zgeadd.c)
if (BUILD_BFLOAT16) if (BUILD_BFLOAT16)
set(SHGEADD_KERNEL ../generic/geadd.c) SetFallback(SHGEADD_KERNEL ../generic/geadd.c)
set(SBGEMMKERNEL ../generic/gemmkernel_2x2.c) SetFallback(SBGEMMKERNEL ../generic/gemmkernel_2x2.c)
set(SBGEMM_BETA ../generic/gemm_beta.c) SetFallback(SBGEMM_BETA ../generic/gemm_beta.c)
set(SBGEMMINCOPY ../generic/gemm_ncopy_2.c) SetFallback(SBGEMMINCOPY ../generic/gemm_ncopy_2.c)
set(SBGEMMITCOPY ../generic/gemm_tcopy_2.c) SetFallback(SBGEMMITCOPY ../generic/gemm_tcopy_2.c)
set(SBGEMMONCOPY ../generic/gemm_ncopy_2.c) SetFallback(SBGEMMONCOPY ../generic/gemm_ncopy_2.c)
set(SBGEMMOTCOPY ../generic/gemm_tcopy_2.c) SetFallback(SBGEMMOTCOPY ../generic/gemm_tcopy_2.c)
set(SBGEMMINCOPYOBJ sbgemm_incopy.o) SetFallback(SBGEMMINCOPYOBJ sbgemm_incopy.o)
set(SBGEMMITCOPYOBJ sbgemm_itcopy.o) SetFallback(SBGEMMITCOPYOBJ sbgemm_itcopy.o)
set(SBGEMMONCOPYOBJ sbgemm_oncopy.o) SetFallback(SBGEMMONCOPYOBJ sbgemm_oncopy.o)
set(SBGEMMOTCOPYOBJ sbgemm_otcopy.o) SetFallback(SBGEMMOTCOPYOBJ sbgemm_otcopy.o)
endif () endif ()
endmacro () endmacro ()

View File

@ -15,35 +15,83 @@ endfunction ()
# Reads a Makefile into CMake vars. # Reads a Makefile into CMake vars.
macro(ParseMakefileVars MAKEFILE_IN) macro(ParseMakefileVars MAKEFILE_IN)
message(STATUS "Reading vars from ${MAKEFILE_IN}...") message(STATUS "Reading vars from ${MAKEFILE_IN}...")
set (IfElse 0) set (C_COMPILER ${CMAKE_C_COMPILER_ID})
set (ElseSeen 0) set (IfElse 0)
set (ElseSeen 0)
set (SkipIfs 0)
set (SkipElse 0)
file(STRINGS ${MAKEFILE_IN} makefile_contents) file(STRINGS ${MAKEFILE_IN} makefile_contents)
foreach (makefile_line ${makefile_contents}) foreach (makefile_line ${makefile_contents})
#message(STATUS "parsing ${makefile_line}") #message(STATUS "parsing ${makefile_line}")
if (${IfElse} GREATER 0) # Skip the entire scope of the else statement given that the if statement that precedes it has the valid condition.
# The variable SkipIfs is used to identify which endif statement closes the scope of the else statement.
if (${SkipElse} EQUAL 1)
#message(STATUS "skipping ${makefile_line}")
string(REGEX MATCH "(ifeq|ifneq|ifdef|ifndef) .*$" line_match "${makefile_line}")
if (NOT "${line_match}" STREQUAL "")
MATH(EXPR SkipIfs "${SkipIfs}+1")
endif ()
string(REGEX MATCH "endif[ \t]*" line_match "${makefile_line}") string(REGEX MATCH "endif[ \t]*" line_match "${makefile_line}")
if (NOT "${line_match}" STREQUAL "") if (NOT "${line_match}" STREQUAL "")
# message(STATUS "ENDIF ${makefile_line}") if (${SkipIfs} EQUAL 0)
set (IfElse 0) set (SkipElse 0)
set (ElseSeen 0) else ()
MATH(EXPR SkipIfs "${SkipIfs}-1")
endif ()
endif ()
continue ()
endif ()
# The variable IfElse is greater than 0 if and only if the previously parsed line is an if statement.
if (${IfElse} GREATER 0)
# If the current scope is the one that has to be skipped, the if/endif/else statements
# along with it till the endif that closes the current scope have to be ignored as well.
string(REGEX MATCH "(ifeq|ifneq|ifdef|ifndef) .*$" line_match "${makefile_line}")
if (NOT "${line_match}" STREQUAL "")
if ((${IfElse} EQUAL 2 AND ${ElseSeen} EQUAL 0) OR (${IfElse} EQUAL 1 AND ${ElseSeen} EQUAL 1))
#message(STATUS "skipping ${makefile_line}")
MATH(EXPR SkipIfs "${SkipIfs}+1")
continue ()
endif ()
endif ()
string(REGEX MATCH "endif[ \t]*" line_match "${makefile_line}")
if (NOT "${line_match}" STREQUAL "")
if (${SkipIfs} EQUAL 0)
#message(STATUS "ENDIF ${makefile_line}")
set (IfElse 0)
set (ElseSeen 0)
else ()
#message(STATUS "skipping ${makefile_line}")
MATH(EXPR SkipIfs "${SkipIfs}-1")
endif ()
continue () continue ()
endif () endif ()
string(REGEX MATCH "else[ \t]*" line_match "${makefile_line}") string(REGEX MATCH "else[ \t]*" line_match "${makefile_line}")
if (NOT "${line_match}" STREQUAL "") if (NOT "${line_match}" STREQUAL "")
# message(STATUS "ELSE ${makefile_line}") if (${SkipIfs} EQUAL 0)
set (ElseSeen 1) #message(STATUS "ELSE ${makefile_line}")
continue () set (ElseSeen 1)
endif() else ()
if ( (${IfElse} EQUAL 2 AND ${ElseSeen} EQUAL 0) OR ( ${IfElse} EQUAL 1 AND ${ElseSeen} EQUAL 1)) #message(STATUS "skipping ${makefile_line}")
# message(STATUS "skipping ${makefile_line}") endif ()
continue () continue ()
endif()
# Skip the lines that are not part of the path that has to be taken.
if ((${IfElse} EQUAL 2 AND ${ElseSeen} EQUAL 0) OR (${IfElse} EQUAL 1 AND ${ElseSeen} EQUAL 1) OR (${SkipIfs} GREATER 0))
#message(STATUS "skipping ${makefile_line}")
continue ()
endif () endif ()
endif () endif ()
# Skip commented lines (the ones that start with '#')
string(REGEX MATCH "[ \t]*\\#.*$" line_match "${makefile_line}")
if (NOT "${line_match}" STREQUAL "")
#message(STATUS "skipping ${makefile_line}")
continue ()
endif ()
string(REGEX MATCH "([0-9_a-zA-Z]+)[ \t]*=[ \t]*(.+)$" line_match "${makefile_line}") string(REGEX MATCH "([0-9_a-zA-Z]+)[ \t]*=[ \t]*(.+)$" line_match "${makefile_line}")
if (NOT "${line_match}" STREQUAL "") if (NOT "${line_match}" STREQUAL "")
#message(STATUS "match on ${line_match}") #message(STATUS "match on ${line_match}")
set(var_name ${CMAKE_MATCH_1}) set(var_name ${CMAKE_MATCH_1})
# set(var_value ${CMAKE_MATCH_2}) #set(var_value ${CMAKE_MATCH_2})
string(STRIP ${CMAKE_MATCH_2} var_value) string(STRIP ${CMAKE_MATCH_2} var_value)
# check for Makefile variables in the string, e.g. $(TSUFFIX) # check for Makefile variables in the string, e.g. $(TSUFFIX)
string(REGEX MATCHALL "\\$\\(([0-9_a-zA-Z]+)\\)" make_var_matches ${var_value}) string(REGEX MATCHALL "\\$\\(([0-9_a-zA-Z]+)\\)" make_var_matches ${var_value})
@ -54,39 +102,93 @@ macro(ParseMakefileVars MAKEFILE_IN)
string(REPLACE "$(${make_var})" "${${make_var}}" var_value ${var_value}) string(REPLACE "$(${make_var})" "${${make_var}}" var_value ${var_value})
endforeach () endforeach ()
set(${var_name} ${var_value}) set(${var_name} ${var_value})
else () continue ()
string(REGEX MATCH "include \\$\\(KERNELDIR\\)/(.+)$" line_match "${makefile_line}") endif ()
if (NOT "${line_match}" STREQUAL "") # Include a new file to be parsed
#message(STATUS "match on include ${line_match}") string(REGEX MATCH "include \\$\\(KERNELDIR\\)/(.+)$" line_match "${makefile_line}")
ParseMakefileVars(${KERNELDIR}/${CMAKE_MATCH_1}) if (NOT "${line_match}" STREQUAL "")
else () #message(STATUS "match on include ${line_match}")
# message(STATUS "unmatched line ${line_match}") ParseMakefileVars(${KERNELDIR}/${CMAKE_MATCH_1})
string(REGEX MATCH "ifeq \\(\\$\\(([_A-Z]+)\\),[ \t]*([0-9_A-Z]+)\\)" line_match "${makefile_line}") continue ()
if (NOT "${line_match}" STREQUAL "") endif ()
# message(STATUS "IFEQ: ${line_match} first: ${CMAKE_MATCH_1} second: ${CMAKE_MATCH_2}") # The if statement that precedes this else has the path taken
if (DEFINED ${${CMAKE_MATCH_1}} AND ${${CMAKE_MATCH_1}} STREQUAL ${CMAKE_MATCH_2}) # Thus, this else statement has to be skipped.
# message (STATUS "condition is true") string(REGEX MATCH "else[ \t]*" line_match "${makefile_line}")
set (IfElse 1) if (NOT "${line_match}" STREQUAL "")
else () #message(STATUS "skipping ${makefile_line}")
set (IfElse 2) set (SkipElse 1)
endif () continue()
endif()
# Example 1: ifdef HAVE_MSA
# Example 2: ifndef ZNRM2KERNEL
string(REGEX MATCH "(ifdef|ifndef) ([0-9_A-Z]+)" line_match "${makefile_line}")
if (NOT "${line_match}" STREQUAL "")
#message(STATUS "${CMAKE_MATCH_1} first: ${CMAKE_MATCH_2}")
set (ElseSeen 0)
if (DEFINED ${CMAKE_MATCH_2})
if (${CMAKE_MATCH_1} STREQUAL "ifdef")
#message (STATUS "condition is true")
set (IfElse 1)
else () else ()
string(REGEX MATCH "ifneq \\(\\$\\(([_A-Z]+)\\),[ \t]*([0-9_A-Z]+)\\)" line_match "${makefile_line}") set (IfElse 2)
if (NOT "${line_match}" STREQUAL "") endif ()
# message(STATUS "IFNEQ: ${line_match} first: ${CMAKE_MATCH_1} second: ${CMAKE_MATCH_2}") else ()
if ( ${CMAKE_MATCH_1} STREQUAL C_COMPILER) if (${CMAKE_MATCH_1} STREQUAL "ifdef")
set (CMAKE_MATCH_1 CMAKE_C_COMPILER) set (IfElse 2)
endif () else ()
if (NOT ( ${${CMAKE_MATCH_1}} STREQUAL ${CMAKE_MATCH_2})) #message (STATUS "condition is true")
# message (STATUS "condition is true") set (IfElse 1)
set (IfElse 1)
else ()
set (IfElse 2)
endif ()
endif ()
endif () endif ()
endif () endif ()
continue ()
endif () endif ()
# Example 1: ifeq ($(SGEMM_UNROLL_M), 16)
# Example 2: ifeq ($(SGEMM_UNROLL_M)x$(SGEMM_UNROLL_N), 8x8)
# Example 3: ifeq ($(__BYTE_ORDER__)$(ELF_VERSION),__ORDER_BIG_ENDIAN__2)
# Ignore the second group since (?:...) does not work on cmake
string(REGEX MATCH "ifeq \\(\\$\\(([0-9_A-Z]+)\\)(([0-9_A-Za-z]*)\\$\\(([0-9_A-Z]+)\\))?,[ \t]*([0-9_A-Za-z]+)\\)" line_match "${makefile_line}")
if (NOT "${line_match}" STREQUAL "")
#message(STATUS "IFEQ: ${line_match} first: ${CMAKE_MATCH_1} second: ${CMAKE_MATCH_3} third: ${CMAKE_MATCH_4} fourth: ${CMAKE_MATCH_5}")
if (DEFINED ${CMAKE_MATCH_1})
if (DEFINED ${CMAKE_MATCH_4})
set (STR ${${CMAKE_MATCH_1}}${CMAKE_MATCH_3}${${CMAKE_MATCH_4}})
else ()
set (STR ${${CMAKE_MATCH_1}})
endif ()
if (${STR} STREQUAL ${CMAKE_MATCH_5})
#message (STATUS "condition is true")
set (IfElse 1)
continue ()
endif ()
endif ()
set (IfElse 2)
continue ()
endif ()
# Example 1 (Group 3): ifneq ($(SGEMM_UNROLL_M), $(SGEMM_UNROLL_N))
# Example 2 (Group 4): ifneq ($(C_COMPILER), PGI)
string(REGEX MATCH "ifneq \\(\\$\\(([0-9_A-Z]+)\\),[ \t]*(\\$\\(([0-9_A-Z]+)\\)|([0-9_A-Z]+))\\)" line_match "${makefile_line}")
if (NOT "${line_match}" STREQUAL "")
#message(STATUS "IFNEQ: ${line_match} first: ${CMAKE_MATCH_1} second: ${CMAKE_MATCH_3} third: ${CMAKE_MATCH_4}")
set (ElseSeen 0)
set (HasValidGroup 0)
if (DEFINED ${CMAKE_MATCH_3})
set (HasValidGroup 1)
set (STR ${${CMAKE_MATCH_3}})
elseif (NOT ${CMAKE_MATCH_4} STREQUAL "")
set (HasValidGroup 1)
set (STR ${CMAKE_MATCH_4})
endif ()
if (DEFINED ${CMAKE_MATCH_1} AND ${HasValidGroup} EQUAL 1)
if (NOT (${${CMAKE_MATCH_1}} STREQUAL ${STR}))
#message (STATUS "condition is true")
set (IfElse 1)
continue ()
endif ()
endif ()
set (IfElse 2)
continue ()
endif ()
#message(STATUS "unmatched line ${line_match}")
endforeach () endforeach ()
endmacro () endmacro ()

View File

@ -9,11 +9,11 @@ function (build_core TARGET_CORE KDIR TSUFFIX KERNEL_DEFINITIONS)
if (${DYNAMIC_ARCH}) if (${DYNAMIC_ARCH})
include("${PROJECT_SOURCE_DIR}/cmake/system.cmake") include("${PROJECT_SOURCE_DIR}/cmake/system.cmake")
endif () endif ()
ParseMakefileVars("${KERNELDIR}/KERNEL")
ParseMakefileVars("${KERNELDIR}/KERNEL.${TARGET_CORE}")
SetDefaultL1() SetDefaultL1()
SetDefaultL2() SetDefaultL2()
SetDefaultL3() SetDefaultL3()
ParseMakefileVars("${KERNELDIR}/KERNEL")
ParseMakefileVars("${KERNELDIR}/KERNEL.${TARGET_CORE}")
set(KERNEL_INTERFACE common_level1.h common_level2.h common_level3.h) set(KERNEL_INTERFACE common_level1.h common_level2.h common_level3.h)
if(NOT NO_LAPACK) if(NOT NO_LAPACK)