From 62ab5636418715d90c1f548bc72e53d6d2f65ae9 Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Mon, 9 Oct 2017 09:27:31 +0200 Subject: [PATCH] Put quotes around path names that may contain whitespace --- cmake/prebuild.cmake | 243 +++++++++++++++++++++++++++++-------------- 1 file changed, 164 insertions(+), 79 deletions(-) diff --git a/cmake/prebuild.cmake b/cmake/prebuild.cmake index 13e66e0ce..b783ef90d 100644 --- a/cmake/prebuild.cmake +++ b/cmake/prebuild.cmake @@ -37,123 +37,208 @@ # CPUIDEMU = ../../cpuid/table.o + if (DEFINED CPUIDEMU) set(EXFLAGS "-DCPUIDEMU -DVENDOR=99") endif () -if (DEFINED TARGET_CORE) +if (BUILD_KERNEL) # set the C flags for just this file set(GETARCH2_FLAGS "-DBUILD_KERNEL") - set(TARGET_MAKE "Makefile_kernel.conf") set(TARGET_CONF "config_kernel.h") set(TARGET_CONF_DIR ${PROJECT_BINARY_DIR}/kernel_config/${TARGET_CORE}) else() - set(TARGET_MAKE "Makefile.conf") set(TARGET_CONF "config.h") set(TARGET_CONF_DIR ${PROJECT_BINARY_DIR}) endif () set(TARGET_CONF_TEMP "${PROJECT_BINARY_DIR}/${TARGET_CONF}.tmp") -include("${PROJECT_SOURCE_DIR}/cmake/c_check.cmake") +# c_check +set(FU "") +if (APPLE OR (MSVC AND NOT ${CMAKE_C_COMPILER_ID} MATCHES "Clang")) + set(FU "_") +endif() + +set(COMPILER_ID ${CMAKE_C_COMPILER_ID}) +if (${COMPILER_ID} STREQUAL "GNU") + set(COMPILER_ID "GCC") +endif () + +string(TOUPPER ${ARCH} UC_ARCH) + +file(WRITE ${TARGET_CONF_TEMP} + "#define OS_${HOST_OS}\t1\n" + "#define ARCH_${UC_ARCH}\t1\n" + "#define C_${COMPILER_ID}\t1\n" + "#define __${BINARY}BIT__\t1\n" + "#define FUNDERSCORE\t${FU}\n") + +if (${HOST_OS} STREQUAL "WINDOWSSTORE") + file(APPEND ${TARGET_CONF_TEMP} + "#define OS_WINNT\t1\n") +endif () + +# f_check if (NOT NOFORTRAN) include("${PROJECT_SOURCE_DIR}/cmake/f_check.cmake") endif () -# compile getarch -set(GETARCH_SRC - ${PROJECT_SOURCE_DIR}/getarch.c - ${CPUIDEMO} -) +# Cannot run getarch on target if we are cross-compiling +if (DEFINED CORE AND CMAKE_CROSSCOMPILING) + # Write to config as getarch would -if ("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") - #Use generic for MSVC now - message("MSVC") - set(GETARCH_FLAGS ${GETARCH_FLAGS} -DFORCE_GENERIC) -else() - list(APPEND GETARCH_SRC ${PROJECT_SOURCE_DIR}/cpuid.S) -endif () + # TODO: Set up defines that getarch sets up based on every other target + # Perhaps this should be inside a different file as it grows larger + file(APPEND ${TARGET_CONF_TEMP} + "#define ${CORE}\n" + "#define CHAR_CORENAME \"${CORE}\"\n") + if ("${CORE}" STREQUAL "ARMV7") + file(APPEND ${TARGET_CONF_TEMP} + "#define L1_DATA_SIZE\t65536\n" + "#define L1_DATA_LINESIZE\t32\n" + "#define L2_SIZE\t512488\n" + "#define L2_LINESIZE\t32\n" + "#define DTB_DEFAULT_ENTRIES\t64\n" + "#define DTB_SIZE\t4096\n" + "#define L2_ASSOCIATIVE\t4\n" + "#define HAVE_VFPV3\n" + "#define HAVE_VFP\n") + set(SGEMM_UNROLL_M 4) + set(SGEMM_UNROLL_N 4) + set(DGEMM_UNROLL_M 4) + set(DGEMM_UNROLL_N 4) + elseif ("${CORE}" STREQUAL "ARMV8") + file(APPEND ${TARGET_CONF_TEMP} + "#define L1_DATA_SIZE\t32768\n" + "#define L1_DATA_LINESIZE\t64\n" + "#define L2_SIZE\t262144\n" + "#define L2_LINESIZE\t64\n" + "#define DTB_DEFAULT_ENTRIES\t64\n" + "#define DTB_SIZE\t4096\n" + "#define L2_ASSOCIATIVE\t32\n") + set(SGEMM_UNROLL_M 4) + set(SGEMM_UNROLL_N 4) + elseif ("${CORE}" STREQUAL "CORTEXA57") + file(APPEND ${TARGET_CONF_TEMP} + "#define L1_CODE_SIZE\t49152\n" + "#define L1_CODE_LINESIZE\t64\n" + "#define L1_CODE_ASSOCIATIVE\t3\n" + "#define L1_DATA_SIZE\t32768\n" + "#define L1_DATA_LINESIZE\t64\n" + "#define L1_DATA_ASSOCIATIVE\t2\n" + "#define L2_SIZE\t2097152\n" + "#define L2_LINESIZE\t64\n" + "#define L2_ASSOCIATIVE\t16\n" + "#define DTB_DEFAULT_ENTRIES\t64\n" + "#define DTB_SIZE\t4096\n" + "#define HAVE_VFPV4\n" + "#define HAVE_VFPV3\n" + "#define HAVE_VFP\n" + "#define HAVE_NEON\n") + set(SGEMM_UNROLL_M 16) + set(SGEMM_UNROLL_N 4) + set(DGEMM_UNROLL_M 8) + set(DGEMM_UNROLL_N 4) + set(CGEMM_UNROLL_M 8) + set(CGEMM_UNROLL_N 4) + set(ZGEMM_UNROLL_M 8) + set(ZGEMM_UNROLL_N 4) + endif() -if ("${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") - # disable WindowsStore strict CRT checks - set(GETARCH_FLAGS ${GETARCH_FLAGS} -D_CRT_SECURE_NO_WARNINGS) -endif () + # Or should this actually be NUM_CORES? + if (${NUM_THREADS} GREATER 0) + file(APPEND ${TARGET_CONF_TEMP} "#define NUM_CORES\t${NUM_THREADS}\n") + endif() -set(GETARCH_DIR "${PROJECT_BINARY_DIR}/getarch_build") -set(GETARCH_BIN "getarch${CMAKE_EXECUTABLE_SUFFIX}") -file(MAKE_DIRECTORY ${GETARCH_DIR}) -configure_file(${TARGET_CONF_TEMP} ${GETARCH_DIR}/${TARGET_CONF} COPYONLY) -if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") - try_compile(GETARCH_RESULT ${GETARCH_DIR} - SOURCES ${GETARCH_SRC} - COMPILE_DEFINITIONS ${EXFLAGS} ${GETARCH_FLAGS} -I${GETARCH_DIR} -I"${PROJECT_SOURCE_DIR}" -I"${PROJECT_BINARY_DIR}" - OUTPUT_VARIABLE GETARCH_LOG - COPY_FILE ${PROJECT_BINARY_DIR}/${GETARCH_BIN} + # GetArch_2nd + foreach(float_char S;D;Q;C;Z;X) + if (NOT DEFINED ${float_char}GEMM_UNROLL_M) + set(${float_char}GEMM_UNROLL_M 2) + endif() + if (NOT DEFINED ${float_char}GEMM_UNROLL_N) + set(${float_char}GEMM_UNROLL_N 2) + endif() + endforeach() + file(APPEND ${TARGET_CONF_TEMP} + "#define GEMM_MULTITHREAD_THRESHOLD\t${GEMM_MULTITHREAD_THRESHOLD}\n") + # Move to where gen_config_h would place it + file(RENAME ${TARGET_CONF_TEMP} "${TARGET_CONF_DIR}/${TARGET_CONF}") + +else(NOT CMAKE_CROSSCOMPILING) + # compile getarch + set(GETARCH_SRC + ${PROJECT_SOURCE_DIR}/getarch.c + ${CPUIDEMU} ) - if (NOT ${GETARCH_RESULT}) - MESSAGE(FATAL_ERROR "Compiling getarch failed ${GETARCH_LOG}") + if ("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") + #Use generic for MSVC now + message("MSVC") + set(GETARCH_FLAGS ${GETARCH_FLAGS} -DFORCE_GENERIC) + else() + list(APPEND GETARCH_SRC ${PROJECT_SOURCE_DIR}/cpuid.S) endif () -endif () -message(STATUS "Running getarch") -# use the cmake binary w/ the -E param to run a shell command in a cross-platform way + if ("${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") + # disable WindowsStore strict CRT checks + set(GETARCH_FLAGS ${GETARCH_FLAGS} -D_CRT_SECURE_NO_WARNINGS) + endif () + + set(GETARCH_DIR "${PROJECT_BINARY_DIR}/getarch_build") + set(GETARCH_BIN "getarch${CMAKE_EXECUTABLE_SUFFIX}") + file(MAKE_DIRECTORY ${GETARCH_DIR}) + configure_file(${TARGET_CONF_TEMP} ${GETARCH_DIR}/${TARGET_CONF} COPYONLY) + if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") + try_compile(GETARCH_RESULT ${GETARCH_DIR} + SOURCES ${GETARCH_SRC} + COMPILE_DEFINITIONS ${EXFLAGS} ${GETARCH_FLAGS} -I${GETARCH_DIR} -I"${PROJECT_SOURCE_DIR}" -I"${PROJECT_BINARY_DIR}" + OUTPUT_VARIABLE GETARCH_LOG + COPY_FILE ${PROJECT_BINARY_DIR}/${GETARCH_BIN} + ) + + if (NOT ${GETARCH_RESULT}) + MESSAGE(FATAL_ERROR "Compiling getarch failed ${GETARCH_LOG}") + endif () + endif () + message(STATUS "Running getarch") + + # use the cmake binary w/ the -E param to run a shell command in a cross-platform way execute_process(COMMAND "${PROJECT_BINARY_DIR}/${GETARCH_BIN}" 0 OUTPUT_VARIABLE GETARCH_MAKE_OUT) execute_process(COMMAND "${PROJECT_BINARY_DIR}/${GETARCH_BIN}" 1 OUTPUT_VARIABLE GETARCH_CONF_OUT) -message(STATUS "GETARCH results:\n${GETARCH_MAKE_OUT}") + message(STATUS "GETARCH results:\n${GETARCH_MAKE_OUT}") -# append config data from getarch to the TARGET file and read in CMake vars -file(APPEND ${TARGET_CONF_TEMP} ${GETARCH_CONF_OUT}) -ParseGetArchVars(${GETARCH_MAKE_OUT}) + # append config data from getarch to the TARGET file and read in CMake vars + file(APPEND ${TARGET_CONF_TEMP} ${GETARCH_CONF_OUT}) + ParseGetArchVars(${GETARCH_MAKE_OUT}) -set(GETARCH2_DIR "${PROJECT_BINARY_DIR}/getarch2_build") -set(GETARCH2_BIN "getarch_2nd${CMAKE_EXECUTABLE_SUFFIX}") -file(MAKE_DIRECTORY ${GETARCH2_DIR}) -configure_file(${TARGET_CONF_TEMP} ${GETARCH2_DIR}/${TARGET_CONF} COPYONLY) -if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") - try_compile(GETARCH2_RESULT ${GETARCH2_DIR} - SOURCES ${PROJECT_SOURCE_DIR}/getarch_2nd.c + set(GETARCH2_DIR "${PROJECT_BINARY_DIR}/getarch2_build") + set(GETARCH2_BIN "getarch_2nd${CMAKE_EXECUTABLE_SUFFIX}") + file(MAKE_DIRECTORY ${GETARCH2_DIR}) + configure_file(${TARGET_CONF_TEMP} ${GETARCH2_DIR}/${TARGET_CONF} COPYONLY) + if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") + try_compile(GETARCH2_RESULT ${GETARCH2_DIR} + SOURCES ${PROJECT_SOURCE_DIR}/getarch_2nd.c COMPILE_DEFINITIONS ${EXFLAGS} ${GETARCH_FLAGS} ${GETARCH2_FLAGS} -I${GETARCH2_DIR} -I"${PROJECT_SOURCE_DIR}" -I"${PROJECT_BINARY_DIR}" - OUTPUT_VARIABLE GETARCH2_LOG - COPY_FILE ${PROJECT_BINARY_DIR}/${GETARCH2_BIN} - ) + OUTPUT_VARIABLE GETARCH2_LOG + COPY_FILE ${PROJECT_BINARY_DIR}/${GETARCH2_BIN} + ) - if (NOT ${GETARCH2_RESULT}) - MESSAGE(FATAL_ERROR "Compiling getarch_2nd failed ${GETARCH2_LOG}") + if (NOT ${GETARCH2_RESULT}) + MESSAGE(FATAL_ERROR "Compiling getarch_2nd failed ${GETARCH2_LOG}") + endif () endif () -endif () -# use the cmake binary w/ the -E param to run a shell command in a cross-platform way + # use the cmake binary w/ the -E param to run a shell command in a cross-platform way execute_process(COMMAND "${PROJECT_BINARY_DIR}/${GETARCH2_BIN}" 0 OUTPUT_VARIABLE GETARCH2_MAKE_OUT) execute_process(COMMAND "${PROJECT_BINARY_DIR}/${GETARCH2_BIN}" 1 OUTPUT_VARIABLE GETARCH2_CONF_OUT) -# append config data from getarch_2nd to the TARGET file and read in CMake vars -file(APPEND ${TARGET_CONF_TEMP} ${GETARCH2_CONF_OUT}) + # append config data from getarch_2nd to the TARGET file and read in CMake vars + file(APPEND ${TARGET_CONF_TEMP} ${GETARCH2_CONF_OUT}) -if (${BUILD_KERNEL}) - configure_file(${TARGET_CONF_TEMP} ${PROJECT_BINARY_DIR}/kernel_config/${TARGET_CORE}/${TARGET_CONF} COPYONLY) -else () - configure_file(${TARGET_CONF_TEMP} ${PROJECT_BINARY_DIR}/${TARGET_CONF} COPYONLY) -endif () + configure_file(${TARGET_CONF_TEMP} ${TARGET_CONF_DIR}/${TARGET_CONF} COPYONLY) -ParseGetArchVars(${GETARCH2_MAKE_OUT}) + ParseGetArchVars(${GETARCH2_MAKE_OUT}) -# compile get_config_h -set(GEN_CONFIG_H_DIR "${PROJECT_BINARY_DIR}/genconfig_h_build") -set(GEN_CONFIG_H_BIN "gen_config_h${CMAKE_EXECUTABLE_SUFFIX}") -set(GEN_CONFIG_H_FLAGS "-DVERSION=\"${OpenBLAS_VERSION}\"") -file(MAKE_DIRECTORY ${GEN_CONFIG_H_DIR}) - -if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") - try_compile(GEN_CONFIG_H_RESULT ${GEN_CONFIG_H_DIR} - SOURCES ${PROJECT_SOURCE_DIR}/gen_config_h.c - COMPILE_DEFINITIONS ${EXFLAGS} ${GETARCH_FLAGS} ${GEN_CONFIG_H_FLAGS} -I"${PROJECT_SOURCE_DIR}" - OUTPUT_VARIABLE GEN_CONFIG_H_LOG - COPY_FILE ${PROJECT_BINARY_DIR}/${GEN_CONFIG_H_BIN} - ) - - if (NOT ${GEN_CONFIG_H_RESULT}) - MESSAGE(FATAL_ERROR "Compiling gen_config_h failed ${GEN_CONFIG_H_LOG}") - endif () -endif () +endif()