From b73a23153ea9d30b963f9981fc27fc8ce215acb5 Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Sun, 8 Oct 2017 23:59:18 +0200 Subject: [PATCH] Put quotes around path names that may contain whitespace Copied from alexkaratakis' PR #1295 --- cmake/prebuild.cmake | 267 +++++++++++++++---------------------------- 1 file changed, 91 insertions(+), 176 deletions(-) diff --git a/cmake/prebuild.cmake b/cmake/prebuild.cmake index cc5475630..13e66e0ce 100644 --- a/cmake/prebuild.cmake +++ b/cmake/prebuild.cmake @@ -37,208 +37,123 @@ # CPUIDEMU = ../../cpuid/table.o - if (DEFINED CPUIDEMU) set(EXFLAGS "-DCPUIDEMU -DVENDOR=99") endif () -if (BUILD_KERNEL) +if (DEFINED TARGET_CORE) # 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 () -# Cannot run getarch on target if we are cross-compiling -if (DEFINED CORE AND CMAKE_CROSSCOMPILING) - # Write to config as getarch would +# compile getarch +set(GETARCH_SRC + ${PROJECT_SOURCE_DIR}/getarch.c + ${CPUIDEMO} +) - # 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_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 () - # 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() +if ("${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") + # disable WindowsStore strict CRT checks + set(GETARCH_FLAGS ${GETARCH_FLAGS} -D_CRT_SECURE_NO_WARNINGS) +endif () - # 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} +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 ("${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) + if (NOT ${GETARCH_RESULT}) + MESSAGE(FATAL_ERROR "Compiling getarch failed ${GETARCH_LOG}") endif () +endif () +message(STATUS "Running getarch") - if ("${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") - # disable WindowsStore strict CRT checks - set(GETARCH_FLAGS ${GETARCH_FLAGS} -D_CRT_SECURE_NO_WARNINGS) +# 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}") + +# 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 + 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} + ) + + if (NOT ${GETARCH2_RESULT}) + MESSAGE(FATAL_ERROR "Compiling getarch_2nd failed ${GETARCH2_LOG}") endif () +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 () +# 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}) + +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 () + +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 () - 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}") - - # 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 - 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} - ) - - if (NOT ${GETARCH2_RESULT}) - MESSAGE(FATAL_ERROR "Compiling getarch_2nd failed ${GETARCH2_LOG}") - endif () - endif () - - # 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}) - - configure_file(${TARGET_CONF_TEMP} ${TARGET_CONF_DIR}/${TARGET_CONF} COPYONLY) - - ParseGetArchVars(${GETARCH2_MAKE_OUT}) - -endif() +endif ()