From fb0b4b57c142daecc4ce709bf4b0b5fdf1629f75 Mon Sep 17 00:00:00 2001 From: Kiran Varaganti Date: Thu, 13 Aug 2020 00:21:10 +0530 Subject: [PATCH] Fixed missing changes Corrections in bli_gemm_front.c, taken the corrections from both public repo and 2.2.1 branch [CPUPL-1067] Change-Id: I4887ece6aa20bdfb87d97e7acebbe04cb9feea02 --- attic/windows/Makefile | 341 ----------------- attic/windows/build/bli_kernel.h | 37 -- attic/windows/build/config.mk.in | 98 ----- attic/windows/build/defs.mk | 240 ------------ attic/windows/build/gather-src-for-windows.py | 351 ----------------- attic/windows/build/gen-check-rev-file.py | 252 ------------ attic/windows/build/gen-config-file.py | 360 ------------------ attic/windows/build/ignore_list | 7 - attic/windows/build/ignore_list.windows | 1 - attic/windows/build/leaf_list | 1 - attic/windows/build/nmake-help.cmd | 72 ---- attic/windows/configure.cmd | 87 ----- attic/windows/gendll.cmd | 128 ------- attic/windows/linkargs.txt | 11 - attic/windows/linkargs64.txt | 11 - attic/windows/revision | 1 - attic/windows/vc110.pdb | Bin 249856 -> 0 bytes build/templates/license.sh | 1 + config/haswell/bli_family_haswell.h | 8 - frame/3/bli_l3_oapi.c | 13 - frame/3/bli_l3_sup_int.c | 2 +- frame/3/bli_l3_sup_int.h | 2 +- frame/3/bli_l3_sup_ref.c | 2 +- frame/3/gemm/bli_gemm_front.c | 14 - frame/thread/bli_thread.c | 21 +- 25 files changed, 15 insertions(+), 2046 deletions(-) delete mode 100644 attic/windows/Makefile delete mode 100644 attic/windows/build/bli_kernel.h delete mode 100644 attic/windows/build/config.mk.in delete mode 100644 attic/windows/build/defs.mk delete mode 100644 attic/windows/build/gather-src-for-windows.py delete mode 100644 attic/windows/build/gen-check-rev-file.py delete mode 100644 attic/windows/build/gen-config-file.py delete mode 100644 attic/windows/build/ignore_list delete mode 100644 attic/windows/build/ignore_list.windows delete mode 100644 attic/windows/build/leaf_list delete mode 100644 attic/windows/build/nmake-help.cmd delete mode 100644 attic/windows/configure.cmd delete mode 100644 attic/windows/gendll.cmd delete mode 100644 attic/windows/linkargs.txt delete mode 100644 attic/windows/linkargs64.txt delete mode 100644 attic/windows/revision delete mode 100644 attic/windows/vc110.pdb diff --git a/attic/windows/Makefile b/attic/windows/Makefile deleted file mode 100644 index f015fe14f..000000000 --- a/attic/windows/Makefile +++ /dev/null @@ -1,341 +0,0 @@ -# -# -# BLIS -# An object-based framework for developing high-performance BLAS-like -# libraries. -# -# Copyright (C) 2014, The University of Texas at Austin -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# - Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# - Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# - Neither the name(s) of the copyright holder(s) nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# - - - -# -# --- Include variables determined at configure-time -------------------------- -# -CONFIGURE_DEFS = config\config.mk - -!if exist ( $(CONFIGURE_DEFS) ) -!include $(CONFIGURE_DEFS) -!else -!error nmake: $(CONFIGURE_DEFS) does not exist! Run configure.cmd first. -!endif - - - -# -# --- Include environment- and build-specific definitions ---------------------- -# - -MAKE_DEFS = build\defs.mk - -# Include build definitions -!if exist ( $(MAKE_DEFS) ) -!include $(MAKE_DEFS) -!else -!error nmake: $(MAKE_DEFS) does not exist! Your libblis distribution may be incomplete. -!endif - - - -# -# --- Variable modifications --------------------------------------------------- -# - - - -# -# --- High-level rules --------------------------------------------------------- -# - -all: libblis - -libblis: libblis-lib - -libblis-objs: $(BLIS_OBJS) - -libblis-lib: $(LIB_LIBBLIS_DIRPATH)\$(LIBBLIS_LIB) - -libblis-dll: $(DLL_LIBBLIS_DIRPATH)\$(LIBBLIS_DLL) - -lib: libblis-lib - -dll: libblis-dll - -install: install-lib install-headers - -install-lib: $(INSTALL_PREFIX_LIB)\$(LIBBLIS).lib - -install-dll: $(INSTALL_PREFIX_DLL)\$(LIBBLIS).dll \ - $(INSTALL_PREFIX_DLL)\$(LIBBLIS).lib \ - $(INSTALL_PREFIX_DLL)\$(LIBBLIS).exp - -install-headers: $(INSTALL_PREFIX_INC)\$(BLIS_H) - -clean: clean-build clean-log - -distclean: clean-config clean-build clean-log - - - -# -# --- Source code (inference) rules -------------------------------------------- -# - -# --- C source files in flamec directory --- -{$(SRC_BLI_DIRPATH)}.c{$(OBJ_BLI_DIRPATH)}.obj: -!ifdef VERBOSE - if not exist $(OBJ_BLI_DIRPATH) \ - ( $(MKDIR) $(OBJ_BLI_DIRPATH) ) - $(CC) $(CFLAGS) /c $< /Fo$@ -!else - @if not exist $(OBJ_BLI_DIRPATH) \ - ( ( $(ECHO) nmake: Creating $(OBJ_BLI_DIRPATH) directory ) & \ - ( $(MKDIR) $(OBJ_BLI_DIRPATH) ) ) - @$(ECHO) nmake: Compiling $< - @$(CC) $(CFLAGS) /c $< /Fo$@ >> $(CC_LOG_FILE) -!endif - - - -# -# --- Library generation rules ------------------------------------------------- -# - -# --- Static library --- -$(LIB_LIBBLIS_DIRPATH)\$(LIBBLIS_LIB): libblis-objs -!ifdef VERBOSE - if not exist $(LIB_LIBBLIS_DIRPATH) \ - ( $(MKDIR) $(LIB_LIBBLIS_DIRPATH) ) - $(COPY) $(OBJ_BLI_DIRPATH)\*.obj $(LIB_LIBBLIS_DIRPATH) - $(CD) $(LIB_LIBBLIS_DIRPATH) - $(LIB) $(LIB_OPTIONS) $(LIB_BLI_OUTPUT_ARG) $(LIB_BLI_INPUT_ARGS) - $(DEL) *.obj - $(CD) $(TOP_BUILD_DIR_ABS) -!else - @if not exist $(LIB_LIBBLIS_DIRPATH) \ - ( ( $(ECHO) nmake: Creating $(LIB_LIBBLIS_DIRPATH) directory ) & \ - ( $(MKDIR) $(LIB_LIBBLIS_DIRPATH) ) ) - @$(ECHO) nmake: Creating static library $@ - @$(COPY) $(OBJ_BLI_DIRPATH)\*.obj $(LIB_LIBBLIS_DIRPATH) >> $(COPY_LOG_FILE) - @$(CD) $(LIB_LIBBLIS_DIRPATH) - @$(LIB) /VERBOSE $(LIB_OPTIONS) $(LIB_BLI_OUTPUT_ARG) $(LIB_BLI_INPUT_ARGS) - @$(DEL) *.obj - @$(CD) $(TOP_BUILD_DIR_ABS) -!endif - -# --- Dynamic library (object code file, import library, and export file) --- -$(DLL_LIBBLIS_DIRPATH)\$(LIBBLIS_DLL): libblis-objs -!ifdef VERBOSE - if not exist $(DLL_LIBBLIS_DIRPATH) \ - ( $(MKDIR) $(DLL_LIBBLIS_DIRPATH) ) - $(COPY) $(OBJ_BLI_DIRPATH)\*.obj $(DLL_LIBBLIS_DIRPATH) >> $(COPY_LOG_FILE) - $(CD) $(DLL_LIBBLIS_DIRPATH) - $(DIR) /B *.obj > $(OBJ_LIST_FILE) - $(GENDLL) $(LIBBLIS) $(LIBBLIS) $(CC) $(LINKARGS_FILEPATH) $(SYM_DEF_FILEPATH) /objlist $(OBJ_LIST_FILE) - $(DEL) $(OBJ_LIST_FILE) - $(DEL) *.obj - $(CD) $(TOP_BUILD_DIR_ABS) -!else - @if not exist $(DLL_LIBBLIS_DIRPATH) \ - ( ( $(ECHO) nmake: Creating $(DLL_LIBBLIS_DIRPATH) directory ) & \ - ( $(MKDIR) $(DLL_LIBBLIS_DIRPATH) ) ) - @$(ECHO) nmake: Creating dynamic library $@ - @$(COPY) $(OBJ_BLI_DIRPATH)\*.obj $(DLL_LIBBLIS_DIRPATH) >> $(COPY_LOG_FILE) - @$(CD) $(DLL_LIBBLIS_DIRPATH) - @$(DIR) /B *.obj > $(OBJ_LIST_FILE) - @$(GENDLL) $(LIBBLIS) $(LIBBLIS) $(CC) $(LINKARGS_FILEPATH) $(SYM_DEF_FILEPATH) /objlist $(OBJ_LIST_FILE) - @$(DEL) $(OBJ_LIST_FILE) - @$(DEL) *.obj - @$(CD) $(TOP_BUILD_DIR_ABS) -!endif - - - -# -# --- Install rules ------------------------------------------------------------ -# - -# --- Header files --- -$(INSTALL_PREFIX_INC)\$(BLIS_H): $(INC_BLI_DIRPATH)\$(BLIS_H) \ - $(BUILD_DIRNAME)\$(BLI_CONFIG_H) -!ifdef VERBOSE - if not exist $(INSTALL_PREFIX_INC) \ - ( $(MKDIR) $(INSTALL_PREFIX_INC) ) - $(COPY) $(BUILD_DIRNAME)\$(BLI_CONFIG_H) $(INSTALL_PREFIX_INC) >> $(COPY_LOG_FILE) - $(COPY) $(INC_BLI_DIRPATH)\*.h $(INSTALL_PREFIX_INC) >> $(COPY_LOG_FILE) -!else - @if not exist $(INSTALL_PREFIX_INC) \ - ( $(MKDIR) $(INSTALL_PREFIX_INC) ) - @$(ECHO) nmake: Installing libblis header files to $(INSTALL_PREFIX_INC) - @$(COPY) $(BUILD_DIRNAME)\$(BLI_CONFIG_H) $(INSTALL_PREFIX_INC) >> $(COPY_LOG_FILE) - @$(COPY) $(INC_BLI_DIRPATH)\*.h $(INSTALL_PREFIX_INC) >> $(COPY_LOG_FILE) -!endif - -# --- Static library --- -$(INSTALL_PREFIX_LIB)\$(LIBBLIS).lib: $(LIB_LIBBLIS_DIRPATH)\$(LIBBLIS).lib -!ifdef VERBOSE - if not exist $(INSTALL_PREFIX_LIB) ( $(MKDIR) $(INSTALL_PREFIX_LIB) ) - if exist $(LIB_LIBBLIS_DIRPATH)\$(LIBBLIS).lib \ - ( $(COPY) $(LIB_LIBBLIS_DIRPATH)\$(LIBBLIS).lib $(INSTALL_PREFIX_LIB) >> $(COPY_LOG_FILE) ) -!else - @if not exist $(INSTALL_PREFIX_LIB) ( $(MKDIR) $(INSTALL_PREFIX_LIB) ) - @if exist $(LIB_LIBBLIS_DIRPATH)\$(LIBBLIS).lib \ - ( ( $(ECHO) nmake: Installing $(LIB_LIBBLIS_DIRPATH)\$(LIBBLIS).lib to $(INSTALL_PREFIX_LIB) ) & \ - ( $(COPY) $(LIB_LIBBLIS_DIRPATH)\$(LIBBLIS).lib $(INSTALL_PREFIX_LIB) >> $(COPY_LOG_FILE) ) ) -!endif - -# --- Dynamic library (object code) --- -$(INSTALL_PREFIX_DLL)\$(LIBBLIS).dll: $(DLL_LIBBLIS_DIRPATH)\$(LIBBLIS).dll -!ifdef VERBOSE - if not exist $(INSTALL_PREFIX_DLL) ( $(MKDIR) $(INSTALL_PREFIX_DLL) ) - if exist $(DLL_LIBBLIS_DIRPATH)\$(LIBBLIS).dll \ - ( $(COPY) $(DLL_LIBBLIS_DIRPATH)\$(LIBBLIS).dll $(INSTALL_PREFIX_DLL) >> $(COPY_LOG_FILE) ) -!else - @if not exist $(INSTALL_PREFIX_DLL) ( $(MKDIR) $(INSTALL_PREFIX_DLL) ) - @if exist $(DLL_LIBBLIS_DIRPATH)\$(LIBBLIS).dll \ - ( ( $(ECHO) nmake: Installing $(DLL_LIBBLIS_DIRPATH)\$(LIBBLIS).dll to $(INSTALL_PREFIX_DLL) ) & \ - ( $(COPY) $(DLL_LIBBLIS_DIRPATH)\$(LIBBLIS).dll $(INSTALL_PREFIX_DLL) >> $(COPY_LOG_FILE) ) ) -!endif - -# --- Dynamic library (import library) --- -$(INSTALL_PREFIX_DLL)\$(LIBBLIS).lib: $(DLL_LIBBLIS_DIRPATH)\$(LIBBLIS).lib -!ifdef VERBOSE - if not exist $(INSTALL_PREFIX_DLL) ( $(MKDIR) $(INSTALL_PREFIX_DLL) ) - if exist $(DLL_LIBBLIS_DIRPATH)\$(LIBBLIS).lib \ - ( $(COPY) $(DLL_LIBBLIS_DIRPATH)\$(LIBBLIS).lib $(INSTALL_PREFIX_DLL) >> $(COPY_LOG_FILE) ) -!else - @if not exist $(INSTALL_PREFIX_DLL) ( $(MKDIR) $(INSTALL_PREFIX_DLL) ) - @if exist $(DLL_LIBBLIS_DIRPATH)\$(LIBBLIS).lib \ - ( ( $(ECHO) nmake: Installing $(DLL_LIBBLIS_DIRPATH)\$(LIBBLIS).lib to $(INSTALL_PREFIX_DLL) ) & \ - ( $(COPY) $(DLL_LIBBLIS_DIRPATH)\$(LIBBLIS).lib $(INSTALL_PREFIX_DLL) >> $(COPY_LOG_FILE) ) ) -!endif - -# --- Dynamic library (export file) --- -$(INSTALL_PREFIX_DLL)\$(LIBBLIS).exp: $(DLL_LIBBLIS_DIRPATH)\$(LIBBLIS).exp -!ifdef VERBOSE - if not exist $(INSTALL_PREFIX_DLL) ( $(MKDIR) $(INSTALL_PREFIX_DLL) ) - if exist $(DLL_LIBBLIS_DIRPATH)\$(LIBBLIS).exp \ - ( $(COPY) $(DLL_LIBBLIS_DIRPATH)\$(LIBBLIS).exp $(INSTALL_PREFIX_DLL) >> $(COPY_LOG_FILE) ) -!else - @if not exist $(INSTALL_PREFIX_DLL) ( $(MKDIR) $(INSTALL_PREFIX_DLL) ) - @if exist $(DLL_LIBBLIS_DIRPATH)\$(LIBBLIS).exp \ - ( ( $(ECHO) nmake: Installing $(DLL_LIBBLIS_DIRPATH)\$(LIBBLIS).exp to $(INSTALL_PREFIX_DLL) ) & \ - ( $(COPY) $(DLL_LIBBLIS_DIRPATH)\$(LIBBLIS).exp $(INSTALL_PREFIX_DLL) >> $(COPY_LOG_FILE) ) ) -!endif - - - -# -# --- Clean rules -------------------------------------------------------------- -# - -clean-log: -!ifdef VERBOSE - if exist $(CC_LOG_FILE) \ - ( $(DEL) $(CC_LOG_FILE) ) - if exist $(FC_LOG_FILE) \ - ( $(DEL) $(FC_LOG_FILE) ) - if exist $(COPY_LOG_FILE) \ - ( $(DEL) $(COPY_LOG_FILE) ) -!else - @if exist $(CC_LOG_FILE) \ - ( ( $(ECHO) nmake: Deleting $(CC_LOG_FILE) ) & \ - ( $(DEL) $(CC_LOG_FILE) ) ) - @if exist $(FC_LOG_FILE) \ - ( ( $(ECHO) nmake: Deleting $(FC_LOG_FILE) ) & \ - ( $(DEL) $(FC_LOG_FILE) ) ) - @if exist $(COPY_LOG_FILE) \ - ( ( $(ECHO) nmake: Deleting $(COPY_LOG_FILE) ) & \ - ( $(DEL) $(COPY_LOG_FILE) ) ) -!endif - -clean-config: -!ifdef VERBOSE - if exist $(CNF_DIRNAME) \ - ( $(RMDIR) $(CNF_DIRNAME) ) - if exist $(INC_DIRNAME) \ - ( $(RMDIR) $(INC_DIRNAME) ) - if exist $(SRC_DIRNAME) \ - ( $(RMDIR) $(SRC_DIRNAME) ) -!else - @if exist $(CNF_DIRNAME) \ - ( ( $(ECHO) nmake: Deleting $(CNF_DIRNAME) directory ) & \ - ( $(RMDIR) $(CNF_DIRNAME) ) ) - @if exist $(INC_DIRNAME) \ - ( ( $(ECHO) nmake: Deleting $(INC_DIRNAME) directory ) & \ - ( $(RMDIR) $(INC_DIRNAME) ) ) - @if exist $(SRC_DIRNAME) \ - ( ( $(ECHO) nmake: Deleting $(SRC_DIRNAME) directory ) & \ - ( $(RMDIR) $(SRC_DIRNAME) ) ) -!endif - -clean-build: -!ifdef VERBOSE - if exist $(OBJ_DIRNAME) \ - ( $(RMDIR) $(OBJ_DIRNAME) ) - if exist $(LIB_DIRNAME) \ - ( $(RMDIR) $(LIB_DIRNAME) ) - if exist $(DLL_DIRNAME) \ - ( $(RMDIR) $(DLL_DIRNAME) ) -!else - @if exist $(OBJ_DIRNAME) \ - ( ( $(ECHO) nmake: Deleting $(OBJ_DIRNAME) directory ) & \ - ( $(RMDIR) $(OBJ_DIRNAME) ) ) - @if exist $(LIB_DIRNAME) \ - ( ( $(ECHO) nmake: Deleting $(LIB_DIRNAME) directory ) & \ - ( $(RMDIR) $(LIB_DIRNAME) ) ) - @if exist $(DLL_DIRNAME) \ - ( ( $(ECHO) nmake: Deleting $(DLL_DIRNAME) directory ) & \ - ( $(RMDIR) $(DLL_DIRNAME) ) ) -!endif - -# Useful for developing when all we want to do is remove the library products. -clean-lib: -!ifdef VERBOSE - if exist $(LIB_DIRNAME) \ - ( $(RMDIR) $(LIB_DIRNAME) ) - if exist $(DLL_DIRNAME) \ - ( $(RMDIR) $(DLL_DIRNAME) ) -!else - @if exist $(LIB_DIRNAME) \ - ( ( $(ECHO) nmake: Deleting $(LIB_DIRNAME) directory ) & \ - ( $(RMDIR) $(LIB_DIRNAME) ) ) - @if exist $(DLL_DIRNAME) \ - ( ( $(ECHO) nmake: Deleting $(DLL_DIRNAME) directory ) & \ - ( $(RMDIR) $(DLL_DIRNAME) ) ) -!endif - - - -# -# --- Help target -------------------------------------------------------------- -# - -help: - @$(NMAKE_HELP) - diff --git a/attic/windows/build/bli_kernel.h b/attic/windows/build/bli_kernel.h deleted file mode 100644 index a5934312a..000000000 --- a/attic/windows/build/bli_kernel.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - - BLIS - An object-based framework for developing high-performance BLAS-like - libraries. - - Copyright (C) 2014, The University of Texas at Austin - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name(s) of the copyright holder(s) nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -GEMM_UKR_PROT( double, d, gemm_armsve256_asm_8x8 ) - -PACKM_KER_PROT( double, d, packm_armsve256_asm_8xk ) diff --git a/attic/windows/build/config.mk.in b/attic/windows/build/config.mk.in deleted file mode 100644 index 6752dde29..000000000 --- a/attic/windows/build/config.mk.in +++ /dev/null @@ -1,98 +0,0 @@ -# -# -# BLIS -# An object-based framework for developing high-performance BLAS-like -# libraries. -# -# Copyright (C) 2014, The University of Texas at Austin -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# - Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# - Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# - Neither the name(s) of the copyright holder(s) nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# - - -# Declare the name of the current configuration and add it to the -# running list of configurations included by common.mk. -THIS_CONFIG := haswell -#CONFIGS_INCL += $(THIS_CONFIG) - -# -# --- Determine the C compiler and related flags --- -# - -# NOTE: The build system will append these variables with various -# general-purpose/configuration-agnostic flags in common.mk. You -# may specify additional flags here as needed. -CPPROCFLAGS := -CMISCFLAGS := -CPICFLAGS := -CWARNFLAGS := - -ifneq ($(DEBUG_TYPE),off) -CDBGFLAGS := -g -endif - -ifeq ($(DEBUG_TYPE),noopt) -COPTFLAGS := -O0 -else -COPTFLAGS := -O3 -endif - -# Flags specific to optimized kernels. -CKOPTFLAGS := $(COPTFLAGS) -ifeq ($(CC_VENDOR),gcc) -CKVECFLAGS := -mavx2 -mfma -mfpmath=sse -march=haswell -ifeq ($(GCC_OT_4_9_0),yes) -# If gcc is older than 4.9.0, we must use a different label for -march. -CKVECFLAGS := -mavx2 -mfma -mfpmath=sse -march=core-avx2 -endif -else -ifeq ($(CC_VENDOR),icc) -CKVECFLAGS := -xCORE-AVX2 -else -ifeq ($(CC_VENDOR),clang) -CKVECFLAGS := -mavx2 -mfma -mfpmath=sse -march=haswell -else -$(error gcc, icc, or clang is required for this configuration.) -endif -endif -endif - -# Flags specific to reference kernels. -CROPTFLAGS := $(CKOPTFLAGS) -ifeq ($(CC_VENDOR),gcc) -CRVECFLAGS := $(CKVECFLAGS) -funsafe-math-optimizations -ffp-contract=fast -else -ifeq ($(CC_VENDOR),clang) -CRVECFLAGS := $(CKVECFLAGS) -funsafe-math-optimizations -ffp-contract=fast -else -CRVECFLAGS := $(CKVECFLAGS) -endif -endif - -# Store all of the variables here to new variables containing the -# configuration name. -$(eval $(call store-make-defs,$(THIS_CONFIG))) - diff --git a/attic/windows/build/defs.mk b/attic/windows/build/defs.mk deleted file mode 100644 index 84b52b9ae..000000000 --- a/attic/windows/build/defs.mk +++ /dev/null @@ -1,240 +0,0 @@ -# -# -# BLIS -# An object-based framework for developing high-performance BLAS-like -# libraries. -# -# Copyright (C) 2014, The University of Texas at Austin -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# - Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# - Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# - Neither the name(s) of the copyright holder(s) nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# - - -# -# --- General build system options -------------------------------------------- -# - -# Uncomment this for verbose output from nmake. -# VERBOSE = 1 - -# Assign this varible to be the full path to the directory to which you would -# like the BLIS build products to be installed upon running "nmake install". -# The nmake install target will create the install directory and all requisite -# subdirectories if they do not already exist (in which case the user must have -# permission to create these directories). -INSTALL_PREFIX = c:\field\lib - - -# -# --- Important build system filenames ---------------------------------------- -# - -# DLL link arguments. The contents of this file should be customized when -# building a dynamically-linked library. The lines of the file should contain -# linker options, library names, and library paths. Note that the library -# paths must be declared in the following form: -# -# /link /LIBPATH: -# /link /LIBPATH: -# /link /LIBPATH: -# -# where , , and are library paths to add to the list -# of paths to search when the linker attempts to locate other libraries -# listed in the file. -LINKARGS_FILENAME = linkargs.txt -LINKARGS_FILEPATH = $(PWD)\$(LINKARGS_FILENAME) - -# Various log file names that capture standard output when VERBOSE is undefined. -CC_LOG_FILE = nmake-cc.log -FC_LOG_FILE = nmake-fc.log -COPY_LOG_FILE = nmake-copy.log - - -# -# --- General name and directory definitions ----------------------------------- -# - -# The relative and absolute locations of the top-level Windows build directory. -# This is the directory in which nmake is run (not the directory named "build"). -TOP_BUILD_DIR_REL = . -TOP_BUILD_DIR_ABS = $(PWD) - -# The revision string. -REV_STR = r$(REVISION) - -# The names of the libraries. -LIBBLIS_NAME_ONLY = libblis -LIBBLIS = $(LIBBLIS_NAME_ONLY)-$(ARCH_STR)-$(REV_STR) - -# Directories that reside within the top-level Windows directory. -CNF_DIRNAME = config -INC_DIRNAME = include -SRC_DIRNAME = frame -OBJ_DIRNAME = obj -LIB_DIRNAME = lib -DLL_DIRNAME = dll - -# Leaves of interest for Windows. - -# Relative directory paths to each of the above subdirectories. -INC_DIRPATH = $(TOP_BUILD_DIR_REL)\$(INC_DIRNAME) -SRC_DIRPATH = $(TOP_BUILD_DIR_REL)\$(SRC_DIRNAME) -OBJ_DIRPATH = $(TOP_BUILD_DIR_REL)\$(OBJ_DIRNAME) -LIB_DIRPATH = $(TOP_BUILD_DIR_REL)\$(LIB_DIRNAME) -DLL_DIRPATH = $(TOP_BUILD_DIR_REL)\$(DLL_DIRNAME) - -# We only have header files for flamec leaves. -INC_BLI_DIRPATH = $(INC_DIRPATH) - -# We have source code for flamec and lapack2flamec leaves. -SRC_BLI_DIRPATH = $(SRC_DIRPATH) - - -# And we have object file paths corresponding to those source leaves defined -# above. -OBJ_BLI_DIRPATH = $(OBJ_DIRPATH)\$(ARCH_STR)\$(BUILD_STR) - -# Separate directories into which we'll move object files when we create the -# static libraries. -LIB_LIBBLIS_DIRPATH = $(LIB_DIRPATH)\$(ARCH_STR)\$(BUILD_STR) - -# Separate directories into which we'll move object files when we create the -# dynamic libraries. -DLL_LIBBLIS_DIRPATH = $(DLL_DIRPATH)\$(ARCH_STR)\$(BUILD_STR) - -# The install subdirectories. -INSTALL_PREFIX_LIB = $(INSTALL_PREFIX)\libblis\lib -INSTALL_PREFIX_DLL = $(INSTALL_PREFIX)\libblis\dll -INSTALL_PREFIX_INC = $(INSTALL_PREFIX)\libblis\include-$(ARCH_STR)-$(REV_STR) - -# Definitions for important header files used in the install-headers rule. -BUILD_DIRNAME = build -BLIS_H = blis.h - - -# -# --- General shell definitions ------------------------------------------------ -# - -CD = cd -DIR = dir -COPY = copy -DEL = del /F /Q -MKDIR = mkdir -RMDIR = rd /S /Q -ECHO = echo - - -# -# --- Helper scripts ----------------------------------------------------------- -# - -NMAKE_HELP = .\build\nmake-help.cmd - - - -# -# --- Compiler-related definitions --------------------------------------------- -# - -#!include $(VERSION_FILE) - -# --- C compiler definitions --- - -WINDOWS_BUILD = BLIS_ENABLE_WINDOWS_BUILD -VERS_STR = 0.0.9 -VERSION = BLIS_VERSION_STRING=\"$(VERS_STR)\" - -!if "$(CCOMPILER_STR)"=="icl" - -!if "$(BUILD_STR)"=="debug" -CDEBUG = /Zi -COPTIM = /Od -!elseif "$(BUILD_STR)"=="release" -CDEBUG = -COPTIM = /Ox -!endif - -CC = icl.exe -CMISCFLAGS = /nologo -CLANGFLAGS = -CPPROCFLAGS = /I.\build /I$(INC_BLI_DIRPATH) /D$(WINDOWS_BUILD) /D$(VERSION) -CWARNFLAGS = /w -CDBGFLAGS = $(CDEBUG) -COPTFLAGS = $(COPTIM) -CRTIMEFLAGS = /MT -CMTHREADFLAGS = /Qopenmp -CFLAGS = $(CMISCFLAGS) $(CLANGFLAGS) $(CPPROCFLAGS) $(CWARNFLAGS) \ - $(CDBGFLAGS) $(COPTFLAGS) $(CRTIMEFLAGS) $(CMTHREADFLAGS) - -!elseif "$(CCOMPILER_STR)"=="cl" - -!if "$(BUILD_STR)"=="debug" -CDEBUG = /Zi -COPTIM = /Od -!elseif "$(BUILD_STR)"=="release" -CDEBUG = -COPTIM = /Ox -!endif - -CC = cl.exe -CMISCFLAGS = /nologo -CLANGFLAGS = -CPPROCFLAGS = /I.\build /I$(INC_BLI_DIRPATH) /D$(WINDOWS_BUILD) /D$(VERSION) -CWARNFLAGS = /w -CDBGFLAGS = $(CDEBUG) -COPTFLAGS = $(COPTIM) -CRTIMEFLAGS = /MT -CMTHREADFLAGS = /openmp -CFLAGS = $(CMISCFLAGS) $(CLANGFLAGS) $(CPPROCFLAGS) $(CWARNFLAGS) \ - $(CDBGFLAGS) $(COPTFLAGS) $(CRTIMEFLAGS) $(CMTHREADFLAGS) - -!endif - - - -# -# --- Library-related definitions ---------------------------------------------- -# - -# --- Static library definitions --- - -LIBBLIS_LIB = $(LIBBLIS).lib - -LIB = lib -LIB_OPTIONS = /nologo -LIB_BLI_OUTPUT_ARG = /out:$(LIBBLIS_LIB) -LIB_BLI_INPUT_ARGS = *.obj - -# --- Dynamic library definitions --- - -LIBBLIS_DLL = $(LIBBLIS).dll - -GENDLL = $(TOP_BUILD_DIR_ABS)\gendll.cmd -OBJ_LIST_FILE = libblis-objects.txt - -SYM_DEF_FILEPATH = $(TOP_BUILD_DIR_ABS)\$(BUILD_DIRNAME)\libblis-symbols.def - diff --git a/attic/windows/build/gather-src-for-windows.py b/attic/windows/build/gather-src-for-windows.py deleted file mode 100644 index e3b589b5b..000000000 --- a/attic/windows/build/gather-src-for-windows.py +++ /dev/null @@ -1,351 +0,0 @@ -#! /usr/bin/env python -# -# BLIS -# An object-based framework for developing high-performance BLAS-like -# libraries. -# -# Copyright (C) 2014, The University of Texas at Austin -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# - Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# - Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# - Neither the name(s) of the copyright holder(s) nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# - -# ------------------------------------------------------------------------------ - -# Import modules -import sys -import os -import os.path -import getopt -import shutil -import string - -# Global variables for command line options, with default settings. -script_name = "" -dry_run_flag = False -verbose_flag = False - -# Global constants -flat_config_dirname = "config" -flat_header_dirname = "include" -flat_source_dirname = "frame" -leaf_list_path = "build/leaf_list" -ignore_list_path = "build/ignore_list" -ignore_list_win_path = "build/ignore_list.windows" - -# ------------------------------------------------------------------------------ - -def print_usage(): - - # Print help information. - print " " - print " %s" % script_name - print " " - print " Field G. Van Zee" - print " " - print " Walk the BLIS source tree and copy all sources necessary for" - print " building BLIS under Windows into a single flat directory with" - print " no subdirectory hierarchy." - print " " - print " Usage:" - print " %s [options] tree_dir flat_dir" % script_name - print " " - print " The following options are accepted:" - print " " - print " -d dry-run" - print " Go through all the motions, but don't actually copy any" - print " files." - print " -v verbose" - print " Be verbose about actions (one line of output her action)." - print " " - - # Exit the script. - sys.exit() - -# ------------------------------------------------------------------------------ - -def main(): - - # Extern our global veriables. - global script_name - global dry_run_flag - global verbose_flag - - # Get the script name so we can use it in our output. - ( script_dir, script_name ) = os.path.split( sys.argv[0] ) - - try: - - # Get the command line options. - options, args = getopt.getopt( sys.argv[1:], "dv") - - except getopt.GetoptError, err: - - # print help information and exit: - print str( err ) # will print something like "option -a not recognized" - print_usage() - - # Parse our expected command line options. - print 'checking options' - for o, a in options: - - if o == "-d": - print 'found dry run' - dry_run_flag = True - elif o == "-v": - verbose_flag = True - else: - assert False, "unhandled option" - - # Check the number of arguments after command line option processing. - n_args = len( args ) - if n_args != 2: - print_usage() - - # Acquire the non-optional arguments. - tree_dir = args[0] - flat_dir = args[1] - - # Acquire the list of directories we will ignore. - ignore_list = read_ignore_list() - - # Acquire the list of leaf-type directories we will descend into. - leaf_list = read_leaf_list() - - # Create strings for each of the base subdirectories in the flat - # destination directory. - flat_config_base_dirpath = os.path.join( flat_dir, flat_config_dirname ) - flat_header_base_dirpath = os.path.join( flat_dir, flat_header_dirname ) - flat_source_base_dirpath = os.path.join( flat_dir, flat_source_dirname ) - - # Start a list of directories to create. - dirs_to_create = [] - - # Append the config directory. We do this outside of the for loop because - # we don't need subdirectories for each leaf type. - dirs_to_create.append( flat_config_base_dirpath ) - - # For each of the leaf specifications, make the full pathnames of the - # subdirectories that will reside within the root destination directory. - for leaf_spec in leaf_list: - - # Unpack the leaf_spec tuple. - src_exts, hdr_exts = leaf_spec - - # Append the directory path name to our list. - dirs_to_create.append( flat_header_base_dirpath ) - dirs_to_create.append( flat_source_base_dirpath ) - - # Iterate over the directory list we just created. - for dirpath in dirs_to_create: - - # Make the subdirectories within the root destination directory, but - # only if they are not existing directories. - if os.path.isdir( dirpath ) == False: - - # Take action only if this is not a dry run. - if dry_run_flag == False: - - # Be verbose if verbosity was requested. - if verbose_flag == True: - print "%s: creating directory %s" % ( script_name, dirpath ) - - # Make the directory, and parent directories, for dirpath. - os.makedirs( dirpath ) - - else: - - # Be verbose if verbosity was requested. - if verbose_flag == True: - print "%s: (dry-run) creating directory %s" % ( script_name, dirpath ) - - - # Walk the directory structure top-down. - for dirpath, dirnames, filenames in os.walk( tree_dir ): - - # Remove directories that appear in the ignore list. - for item in ignore_list: - if item in dirnames: - dirnames.remove( item ) - - # Consider each leaf specification. If we find the name in the directory - # path, then copy the files with its designated extensions into the flat - # source directory. - for leaf_spec in leaf_list: - - # Unpack the leaf_spec tuple. - src_exts, hdr_exts = leaf_spec - - # At this point following line can probably be removed - type_dir_name = os.sep + '' - - flat_source_leaf_dirpath = flat_source_base_dirpath - flat_header_leaf_dirpath = flat_header_base_dirpath - - if dirpath.find( type_dir_name ) != -1: - copy_files_to_flat_subdirs( dirpath, filenames, src_exts, hdr_exts, - flat_source_leaf_dirpath, - flat_header_leaf_dirpath ) - -# ------------------------------------------------------------------------------ - -def copy_files_to_flat_subdirs( dirpath, filenames, src_exts, hdr_exts, src_dirpath, hdr_dirpath ): - - # Consider all files in dirpath. - for filename in filenames: - - # Construct the full file path for the current file. - filepath = os.path.join( dirpath, filename ) - - # Iterate over the valid source extensions for the current directory - # path. - for src_ext in src_exts: - - # If the filename/filepath ends with the source extension, copy it - # to the source subdirectory within the flat destination directory. - if filepath.endswith( src_ext ): - - # Take action only if this is not a dry run. - if dry_run_flag == False: - - # Be verbose if verbosity was requested. - if verbose_flag == True: - print "%s: copying to %s from %s" % ( script_name, src_dirpath, filepath ) - - # Copy the source file to the source subdirectory. - shutil.copy2( filepath, src_dirpath ) - - else: - - # Be verbose if verbosity was requested. - if verbose_flag == True: - print "%s: (dry-run) copying to %s from %s" % ( script_name, src_dirpath, filepath ) - - # Iterate over the valid header extensions for the current directory - # path. - for hdr_ext in hdr_exts: - - # If the filename/filepath ends with the header extension, copy it - # to the include subdirectory within the flat destination directory. - if filepath.endswith( hdr_ext ): - - # Take action only if this is not a dry run. - if dry_run_flag == False: - - # Be verbose if verbosity was requested. - if verbose_flag == True: - print "%s: copying to %s from %s" % ( script_name, hdr_dirpath, filepath ) - - # Copy the header file to the header subdirectory. - shutil.copy2( filepath, hdr_dirpath ) - - else: - - # Be verbose if verbosity was requested. - if verbose_flag == True: - print "%s: (dry-run) copying to %s from %s" % ( script_name, hdr_dirpath, filepath ) - -# ------------------------------------------------------------------------------ - -def read_ignore_list(): - - # Open the ignore list files as read-only. - ignore_file = open( ignore_list_path, 'r' ) - ignore_file_win = open( ignore_list_win_path, 'r' ) - - # Read all lines in the ignore list files. The items in these lists contain - # newlines, which we'll strip out shortly. - raw_list = ignore_file.readlines() - raw_win_list = ignore_file_win.readlines() - - # Close the files. - ignore_file.close() - ignore_file_win.close() - - # Initialize an empty ignore list for the stripped version of the raw list. - ignore_list = [] - - # Iterate over the first raw list. - for line in raw_list: - - # Append the stripped line to a new list. - ignore_list.append( line.strip() ) - - # Iterate over the second raw list. - for line in raw_win_list: - - # Append the stripped line to a new list. - ignore_list.append( line.strip() ) - - # Return the list of stripped lines. - return ignore_list - -# ------------------------------------------------------------------------------ - -def read_leaf_list(): - - # Open the leaf list file. - leaf_file = open( leaf_list_path, 'r' ) - - # Read the lines in the file. - line_list = leaf_file.readlines() - - # Start with a blank list. - leaf_list = [] - - # Iterate over the lines. - for line in line_list: - - # Split the specification by colon to separate the fields. - fields = string.split( string.strip( line ), ':' ) - - # Get the individual fields of the specification. - src_exts = string.split( fields[0], ',' ) - hdr_exts = string.split( fields[1], ',' ) - - # If it's a singleton list of an empty string, make it an empty list. - if len(src_exts) == 1: - if src_exts[0] == '': - src_exts = [] - - # If it's a singleton list of an empty string, make it an empty list. - if len(hdr_exts) == 1: - if hdr_exts[0] == '': - hdr_exts = [] - - # Pack the fields into a tuple. - leaf_spec = ( src_exts, hdr_exts ) - - - # Append the tuple to our list. - leaf_list.append( leaf_spec ) - - # Return the list. - return leaf_list - -# ------------------------------------------------------------------------------ - -# Begin by executing main(). -main() diff --git a/attic/windows/build/gen-check-rev-file.py b/attic/windows/build/gen-check-rev-file.py deleted file mode 100644 index 20593f76b..000000000 --- a/attic/windows/build/gen-check-rev-file.py +++ /dev/null @@ -1,252 +0,0 @@ -#! /usr/bin/env python -# -# BLIS -# An object-based framework for developing high-performance BLAS-like -# libraries. -# -# Copyright (C) 2014, The University of Texas at Austin -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# - Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# - Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# - Neither the name(s) of the copyright holder(s) nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# - -# ------------------------------------------------------------------------------ - -# Import modules -import sys -import os -import os.path -import getopt - -# Global variables for command line options, with default settings. -script_name = "" -verbose_flag = False - -# Global constants -toplevel_dirpath = "." -svn_dirname = ".svn" -entries_filename = "entries" -revision_filename = "revision" -dummy_rev_string = "unknown" - - -# ------------------------------------------------------------------------------ - -def print_usage(): - - # Print help information. - print " " - print " %s" % script_name - print " " - print " Field G. Van Zee" - print " " - print " This script ensures that a revision file exists so nmake can include the" - print " revision number in the subdirectory paths to the build products." - print " " - print " If a .svn directory exists, the revision file is created (or updated)" - print " to contain the revision number contained in .svn\entries file." - print " Otherwise, if a .svn directory does not exist, the revision file is" - print " left untouched if it exists, and created with a dummy value if it does" - print " not." - print " " - print " This script is typically invoked by configure.cmd, but it can also be" - print " run manually." - print " " - print " Usage:" - print " %s" % script_name - print " " - print " The following options are accepted:" - print " " - print " -v verbose" - print " Be verbose. Output what's happening." - print " " - - # Exit the script. - sys.exit() - -# ------------------------------------------------------------------------------ - -def main(): - - # Extern our global veriables. - global script_name - global verbose_flag - - # Get the script name so we can use it in our output. - ( script_dir, script_name ) = os.path.split( sys.argv[0] ) - - try: - - # Get the command line options. - options, args = getopt.getopt( sys.argv[1:], "v") - - except getopt.GetoptError, err: - - # print help information and exit: - print str( err ) # will print something like "option -a not recognized" - print_usage() - - # Parse our expected command line options. - for o, a in options: - - if o == "-v": - verbose_flag = True - else: - assert False, "unhandled option" - - # Check the number of arguments after command line option processing. - n_args = len( args ) - if n_args != 0: - print_usage() - - # Construct the filepaths to the entries and revision files. - entries_filepath = os.path.join( toplevel_dirpath, svn_dirname, entries_filename ) - revision_filepath = os.path.join( toplevel_dirpath, revision_filename ) - - # Test for the existence of the entries file (and by proxy, a working copy). - entries_file_exists = file_exists( entries_filepath ) - - # If the entries file exists, we are in a working copy, and thus we can - # overwrite the revision file with a potentially new value. - if entries_file_exists == True: - - # Read the revision number from the entries file. - rev_num_str = read_revision_from_entries( entries_filepath ) - - # Be verbose if verbosity was requested. - if verbose_flag == True: - print "%s: Found working copy; writing revision string \"%s\" to %s" % ( script_name, rev_num_str, revision_filepath ) - - # Write the revision number to the revision file. - write_revision_to_file( rev_num_str, revision_filepath ) - - # If we can't find the entries file, we probably are in an exported - # copy: either an official snapshot, or a copy that someone exported - # manually--hopefully (and likely) the former. - else: - - # Be verbose if verbosity was requested. - if verbose_flag == True: - print "%s: Found export. Checking for revision file..." % ( script_name ) - - # Test for the existence of the revision file. - rev_file_exists = file_exists( revision_filepath ) - - # If the revision file does not exist, create a dummy file so the - # configure script has something to work with. - if rev_file_exists == False: - - # Be verbose if verbosity was requested. - if verbose_flag == True: - print "%s: Revision file not found. Writing dummy revision string \"%s\" to %s" % ( script_name, dummy_rev_string, revision_filepath ) - - # Write the dummy string to the revision file. - write_revision_to_file( dummy_rev_string, revision_filepath ) - - else: - - # Get the revision number from the file just for the purposes of - # being verbose, if it was requested. - rev_num_str = read_revision_file( revision_filepath ) - - # Be verbose if verbosity was requested. - if verbose_flag == True: - print "%s: Revision file found containing revision string \"%s\". Export is valid snapshot!" % ( script_name, rev_num_str ) - - -# ------------------------------------------------------------------------------ - -def file_exists( filepath ): - - # Try to open the file read-only. - try: - - fp = open( filepath, 'r' ) - fp.close() - exists = True - - except IOError, err: - - exists = False - - return exists - - -# ------------------------------------------------------------------------------ - -def read_revision_from_entries( entries_filepath ): - - # Open the ignore list files as read-only. - entries_file = open( entries_filepath, 'r' ) - - # Read all lines in the entries file. - raw_list = entries_file.readlines() - - # Close the file. - entries_file.close() - - # Grab the fourth line, which is where the revision number lives, and strip - # it of whitespace (probably just a newline). - rev_num_str = raw_list[3].strip() - - # Return the revision number string. - return rev_num_str - -# ------------------------------------------------------------------------------ - -def write_revision_to_file( rev_string, revision_filepath ): - - # Open the revision file for writing. - revision_file = open( revision_filepath, 'w' ) - - # Write the revision string to the file. - revision_file.write( rev_string ) - - # Close the file. - revision_file.close() - -# ------------------------------------------------------------------------------ - -def read_revision_file( revision_filepath ): - - # Open the revision file. - revision_file = open( revision_filepath, 'r' ) - - # Read the first (and only) line. - line = revision_file.readline() - - # Close the file. - revision_file.close() - - # Grab the string and strip the it of whitespace (should just be a newline). - rev_num_str = line.strip() - - # Return the revision number string. - return rev_num_str - -# ------------------------------------------------------------------------------ - -# Begin by executing main(). -main() diff --git a/attic/windows/build/gen-config-file.py b/attic/windows/build/gen-config-file.py deleted file mode 100644 index 557083276..000000000 --- a/attic/windows/build/gen-config-file.py +++ /dev/null @@ -1,360 +0,0 @@ -#! /usr/bin/env python -# -# BLIS -# An object-based framework for developing high-performance BLAS-like -# libraries. -# -# Copyright (C) 2014, The University of Texas at Austin -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# - Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# - Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# - Neither the name(s) of the copyright holder(s) nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# - -# ------------------------------------------------------------------------------ - -# Import modules -import sys -import os -import os.path -import getopt -import re -import string - -# Global variables for command line options, with default settings. -script_name = "" -dry_run_flag = False -verbose_flag = False - -# Global constants -config_dirname = "config" -source_dirname = "frame" -object_dirname = "obj" -object_extension = ".obj" -leaf_list_path = "build/leaf_list" -revision_filename = "revision" -rev_varname = "REVISION" -pwd_varname = "PWD" -arch_varname = "ARCH_STR" -build_varname = "BUILD_STR" -ccompiler_varname = "CCOMPILER_STR" - - -# ------------------------------------------------------------------------------ - -def print_usage(): - - # Print help information. - print " " - print " %s" % script_name - print " " - print " Field G. Van Zee" - print " " - print " Create a config.mk file that is to be included by the nmake Makefile." - print " This config.mk file is based on a template, but also includes variable" - print " definitions that are needed for the specific build were are performing." - print " The variables which are currently appended to config.mk at runtime are:" - print " - the revision string" - print " - the path to the current working directory" - print " - the build string (e.g. debug, release)" - print " - the architecture string (e.g. x86, x64)" - print " - the C compiler to use (e.g. icl, cl)" - print " - a list of paths to the object files to be compiled" - print " The config.mk file is placed within the config subdirectory." - print " " - print " Usage:" - print " %s [options] flat_dir arch build ccompiler path\\to\\config.mk.in" % script_name - print " " - print " The following options are accepted:" - print " " - print " -d dry-run" - print " Go through all the motions, but don't actually output" - print " the nmake definition file." - print " -v verbose" - print " Be verbose about actions (one line of output her action)." - print " " - - # Exit the script. - sys.exit() - -# ------------------------------------------------------------------------------ - -def main(): - - # Extern our global veriables. - global script_name - global dry_run_flag - global verbose_flag - - # Get the script name so we can use it in our output. - ( script_dir, script_name ) = os.path.split( sys.argv[0] ) - - try: - - # Get the command line options. - options, args = getopt.getopt( sys.argv[1:], "dv") - - except getopt.GetoptError, err: - - # print help information and exit: - print str( err ) # will print something like "option -a not recognized" - print_usage() - - # Parse our expected command line options. - for o, a in options: - - if o == "-d": - dry_run_flag = True - elif o == "-v": - verbose_flag = True - else: - assert False, "unhandled option" - - # Check the number of arguments after command line option processing. - n_args = len( args ) - if n_args != 5: - print_usage() - - # Acquire the non-optional arguments. - flat_dir = args[0] - arch_string = args[1] - build_string = args[2] - ccompiler_string = args[3] - input_filepath = args[4] - - # Acquire the list of leaf-type directories we will descend into. - leaf_list = read_leaf_list() - - # Read the contents of the template file. - template_file_line_list = read_template_file( input_filepath ) - - # Initialize a new list for the lines to be output - output_file_line_list = template_file_line_list - - # Read the revision number from the revision file. - rev_num_str = read_revision_file( revision_filename ) - - # Add a variable for the revision number of the code we're working with. - rev_var_value = rev_varname + " = " + rev_num_str + "\n" - output_file_line_list.append( rev_var_value ) - - # Add a variable for the path to the current working directory and append - # it to our list. - pwd_var_value = pwd_varname + " = " + os.getcwd() + "\n" - output_file_line_list.append( pwd_var_value ) - - # Add a variable for the architecture string and append it to our list. - arch_var_value = arch_varname + " = " + arch_string + "\n" - output_file_line_list.append( arch_var_value ) - - # Add a variable for the build type string and append it to our list. - build_var_value = build_varname + " = " + build_string + "\n" - output_file_line_list.append( build_var_value ) - - # Add a variable for the C compiler string and append it to our list. - ccompiler_var_value = ccompiler_varname + " = " + ccompiler_string + "\n" - output_file_line_list.append( ccompiler_var_value ) - - # Walk the flat subdirectories for each of the leaves. - for leaf_spec in leaf_list: - - # Unpack the leaf_spec tuple. - src_exts, hdr_exts = leaf_spec - - # Create the paths to the source and object subdirectories. - src_dirpath = os.path.join( flat_dir, source_dirname ) - obj_dirpath = os.path.join( flat_dir, object_dirname, arch_string, build_string ) - - # Get a list of files from the leaf subdirectory. - src_filenames = os.listdir( src_dirpath ) - - # This will be the nmake variable name to which we will assign the list - # of source files. - nmake_varname = "BLIS_OBJS" - - # Generate the line to output. - leaf_line = generate_object_list( nmake_varname, src_filenames, src_exts, obj_dirpath ) - - # Accumulate the lines. - output_file_line_list.append( leaf_line ) - - # Get the filename part of the input filepath. - input_filedir, input_filename = os.path.split( input_filepath ) - - # Remove the .in extension in the output filename. - output_filename = re.sub( '.mk.in', '.mk', input_filename ) - - # Construct the filepath for the output file. - output_filepath = os.path.join( flat_dir, config_dirname, output_filename ) - - # Write the output lines. - write_output_file( output_filepath, output_file_line_list ) - -# ------------------------------------------------------------------------------ - -def read_revision_file( filepath ): - - # Try to open the revision file. - try: - - revision_file = open( filepath, 'r' ) - - except IOError, err: - - print "%s: Couldn't open revision file %s" % ( script_name, filepath ) - sys.exit(1) - - # Read the first (and only) line. - line = revision_file.readline() - - # Close the file. - revision_file.close() - - # Grab the string and strip the it of whitespace (should just be a newline). - rev_num_str = line.strip() - - # Return the revision number string. - return rev_num_str - -# ------------------------------------------------------------------------------ - -def generate_object_list( nmake_varname, src_filenames, src_exts, obj_dirpath ): - - # Initialize the string as an assignment operation. - the_line = nmake_varname + " = " - - # Return early if there are no source extensions for this leaf spec. - if src_exts == []: - return "" - - # Construct a pattern to match any file ending with any of the source file - # extensions given. This string is going to look something like ".[cf]". - src_pattern = '\.[' - for src_ext in src_exts: - src_pattern = src_pattern + src_ext - src_pattern = src_pattern + ']' - - # Consider all source files. - for src_filename in src_filenames: - - obj_filename = re.sub( src_pattern, '.obj', src_filename ) - - # Create the full path to the file. - obj_filepath = os.path.join( obj_dirpath, obj_filename ) - - # Be verbose if verbosity was requested. - if verbose_flag == True: - print "%s: adding file %s" % ( script_name, obj_filepath ) - - # And then add it to the list. - the_line = the_line + obj_filepath + " " - - # Be verbose if verbosity was requested. - if verbose_flag == True: - print "%s: %s" % ( script_name, the_line ) - - # Append a newline to the end of the line, for file.writelines(). - the_line = the_line + "\n" - - # Return the new line. - return the_line - -# ------------------------------------------------------------------------------ - -def read_template_file( template_filepath ): - - # Open the template file as read-only. - template_file = open( template_filepath, 'r' ) - - # Read all lines in the template file. - template_file_lines = template_file.readlines() - - # Close the file. - template_file.close() - - # Return the list of lines in the template file. - return template_file_lines - -# ------------------------------------------------------------------------------ - -def write_output_file( output_filepath, output_lines ): - - # Take action only if this is not a dry run. - if dry_run_flag == False: - - # Open the template file as writable. - output_file = open( output_filepath, 'w' ) - - # Write the lines. - output_file.writelines( output_lines ) - - # Close the file. - output_file.close() - -# ------------------------------------------------------------------------------ - -def read_leaf_list(): - - # Open the leaf list file. - leaf_file = open( leaf_list_path, 'r' ) - - # Read the lines in the file. - line_list = leaf_file.readlines() - - # Start with a blank list. - leaf_list = [] - - # Iterate over the lines. - for line in line_list: - - # Split the specification by colon to separate the fields. - fields = string.split( string.strip( line ), ':' ) - - # Get the individual fields of the specification. - src_exts = string.split( fields[0], ',' ) - hdr_exts = string.split( fields[1], ',' ) - - # If it's a singleton list of an empty string, make it an empty list. - if len(src_exts) == 1: - if src_exts[0] == '': - src_exts = [] - - # If it's a singleton list of an empty string, make it an empty list. - if len(hdr_exts) == 1: - if hdr_exts[0] == '': - hdr_exts = [] - - # Pack the fields into a tuple. - leaf_spec = ( src_exts, hdr_exts ) - - # Append the tuple to our list. - leaf_list.append( leaf_spec ) - - # Return the list. - return leaf_list - -# ------------------------------------------------------------------------------ - -# Begin by executing main(). -main() diff --git a/attic/windows/build/ignore_list b/attic/windows/build/ignore_list deleted file mode 100644 index a8230623e..000000000 --- a/attic/windows/build/ignore_list +++ /dev/null @@ -1,7 +0,0 @@ -attic -broken -old -other -temp -tmp -test diff --git a/attic/windows/build/ignore_list.windows b/attic/windows/build/ignore_list.windows deleted file mode 100644 index 46f8b9aac..000000000 --- a/attic/windows/build/ignore_list.windows +++ /dev/null @@ -1 +0,0 @@ -.git diff --git a/attic/windows/build/leaf_list b/attic/windows/build/leaf_list deleted file mode 100644 index 98e115e3f..000000000 --- a/attic/windows/build/leaf_list +++ /dev/null @@ -1 +0,0 @@ -c:h diff --git a/attic/windows/build/nmake-help.cmd b/attic/windows/build/nmake-help.cmd deleted file mode 100644 index a46ce5f1a..000000000 --- a/attic/windows/build/nmake-help.cmd +++ /dev/null @@ -1,72 +0,0 @@ -:: -:: -:: BLIS -:: An object-based framework for developing high-performance BLAS-like -:: libraries. -:: -:: Copyright (C) 2014, The University of Texas at Austin -:: -:: Redistribution and use in source and binary forms, with or without -:: modification, are permitted provided that the following conditions are -:: met: -:: - Redistributions of source code must retain the above copyright -:: notice, this list of conditions and the following disclaimer. -:: - Redistributions in binary form must reproduce the above copyright -:: notice, this list of conditions and the following disclaimer in the -:: documentation and/or other materials provided with the distribution. -:: - Neither the name(s) of the copyright holder(s) nor the names of its -:: contributors may be used to endorse or promote products derived -:: from this software without specific prior written permission. -:: -:: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -:: "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -:: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -:: A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -:: HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -:: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -:: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -:: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -:: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -:: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -:: OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -:: -:: - -@echo off - -echo. -echo Makefile -echo. -echo Field G. Van Zee -echo. -echo nmake Makefile for building BLIS for Microsoft Windows. nmake targets -echo may be invoked after running the configure.cmd script. Valid targets are: -echo. -echo all - Invoke the lib and dll targets. -echo lib - Build BLIS as a static library. -echo dll - Build BLIS as a dynamically-linked library. -echo help - Output help and usage information. -echo clean - Invoke clean-log and clean-build targets. -echo clean-log - Remove any log files present. -echo clean-config - Remove all products of configure.cmd. Namely, remove the -echo config, include, and src directories. -echo clean-build - Remove all products of the compilation portion of the build -echo process. Namely, remove the obj, lib, and dll directories. -echo distclean - Invoke clean-log, clean-config, and clean-build targets. -echo. -echo The Makefile also recognizes configuration options corresponding to the -echo following Makefile variables: -echo. -echo VERBOSE - When defined, nmake outputs the actual commands -echo executed instead of more concise one-line progress -echo indicators. (Undefined by default.) -echo. -echo Typically, these options are specified by commenting or uncommenting the -echo corresponding lines in the Makefile. However, if the Makefile currently does -echo not define one of the options, and you wish to enable the corresponding -echo feature without editing the Makefile, you may define the variable at the -echo command line when nmake is invoked. For example, you may enable verboseness -echo while invoking the lib target as follows: -echo. -echo nmake lib VERBOSE=1 -echo. diff --git a/attic/windows/configure.cmd b/attic/windows/configure.cmd deleted file mode 100644 index c2ee037d7..000000000 --- a/attic/windows/configure.cmd +++ /dev/null @@ -1,87 +0,0 @@ -:: -:: -:: BLIS -:: An object-based framework for developing high-performance BLAS-like -:: libraries. -:: -:: Copyright (C) 2014, The University of Texas at Austin -:: -:: Redistribution and use in source and binary forms, with or without -:: modification, are permitted provided that the following conditions are -:: met: -:: - Redistributions of source code must retain the above copyright -:: notice, this list of conditions and the following disclaimer. -:: - Redistributions in binary form must reproduce the above copyright -:: notice, this list of conditions and the following disclaimer in the -:: documentation and/or other materials provided with the distribution. -:: - Neither the name(s) of the copyright holder(s) nor the names of its -:: contributors may be used to endorse or promote products derived -:: from this software without specific prior written permission. -:: -:: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -:: "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -:: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -:: A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -:: HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -:: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -:: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -:: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -:: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -:: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -:: OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -:: -:: - -@echo off - -:ENVIRONMENT - set GEN_CHECK_REV_FILE=.\build\gen-check-rev-file.py - set GATHER_SRC=.\build\gather-src-for-windows.py - set GEN_CONFIG_FILE=.\build\gen-config-file.py - set CONFIG_DEFS_TEMPL=.\build\config.mk.in - set SRC_TREE_DIR=..\frame - set TOP_BUILD_DIR=. - -:PARAMS - if "%1"=="" (goto USAGE) - if "%2"=="" (goto USAGE) - if "%3"=="" (goto USAGE) - - set ARCH=%1 - set BUILD=%2 - set CCOMPILER=%3 - -:TASK_UNIT - echo %0: Checking/updating revision file. - %GEN_CHECK_REV_FILE% -v - echo %0: Gathering source files into local flat directories. - %GATHER_SRC% %SRC_TREE_DIR% %TOP_BUILD_DIR% - echo %0: Creating configure definitions file. - %GEN_CONFIG_FILE% %TOP_BUILD_DIR% %ARCH% %BUILD% %CCOMPILER% %CONFIG_DEFS_TEMPL% - echo %0: Configuration and setup complete. You may now run nmake. - - goto END - -:USAGE - echo. - echo configure.cmd - echo. - echo A wrapper script for various configuration and setup scripts that need - echo. to be run before nmake when building BLIS for Microsoft Windows. - echo. - echo USAGE: - echo %0 [arch] [build] [cc] - echo. - echo arch -- The architecture string to build. - echo Supported values: {x86,x64} - echo build -- The kind of build. - echo Supported values: {debug,release} - echo cc -- The C compiler to use. - echo Supported values: {icl,cl} - echo. - echo examples: - echo %0 x86 debug icl - echo %0 x64 release cl - echo. - -:END diff --git a/attic/windows/gendll.cmd b/attic/windows/gendll.cmd deleted file mode 100644 index db0cdc1d2..000000000 --- a/attic/windows/gendll.cmd +++ /dev/null @@ -1,128 +0,0 @@ -@echo off -@setlocal enabledelayedexpansion - -rem -------------------------------------------------------------------- -rem Build a dll out of a set of object files specified by the -rem argument /objlist. -rem -rem The .lib file thus created is an "import" library, which one links -rem with, but the bulk of the code ends up in the associated .dll file. -rem --------------------------------------------------------------------- - -set THIS_SCRIPT=%~dp0%~nx0 - -if "%1"=="" goto USAGE -if "%2"=="" goto USAGE -if "%3"=="" goto USAGE -if "%4"=="" goto USAGE -if "%5"=="" goto USAGE - -set gd_lib_name=%1 -set gd_link=%gd_lib_name%-static.link -set LINKER=%3 -set LINKARGSFILE=%4 -set gd_def=%5 - -:PARSE_ARGS -set IMPORT= -set OBJLIST= -:ARGLOOP -if "%6"=="" goto ENDARGLOOP -if /i not "%6"=="/import" goto OBJARG -set IMPORT=!IMPORT! %7 -goto SHIFT -:OBJARG -if /i not "%6"=="/objlist" goto ENDARGLOOP -set OBJLIST=%7 -:SHIFT -shift /4 -shift /4 -goto ARGLOOP -:ENDARGLOOP - -if defined OBJLIST goto COMPILER_SETUP -echo Error: must supply /objlist -goto USAGE - -:COMPILER_SETUP -set gd_path=%2 -set gd_dll_path=%gd_path%.dll -set gd_main_c=dll_main__%gd_lib_name%.c -set gd_main_obj=dll_main__%gd_lib_name%.obj - -rem create C file for dll_main -for /F "tokens=*" %%i in ("#include ") do echo %%i >%gd_main_c% -echo. >>%gd_main_c% -echo BOOLEAN WINAPI DllMain( >>%gd_main_c% -echo HINSTANCE hDllHandle, >>%gd_main_c% -echo DWORD nReason, >>%gd_main_c% -echo LPVOID Reserved){ >>%gd_main_c% -echo. >>%gd_main_c% -echo BOOLEAN bSuccess = TRUE;>>%gd_main_c% -echo. >>%gd_main_c% -echo switch (nReason){ >>%gd_main_c% -echo case DLL_PROCESS_ATTACH: >>%gd_main_c% -echo DisableThreadLibraryCalls( hDllHandle ); >>%gd_main_c% -echo break; >>%gd_main_c% -echo case DLL_PROCESS_DETACH: >>%gd_main_c% -echo break; >>%gd_main_c% -echo. >>%gd_main_c% -echo }; >>%gd_main_c% -echo. >>%gd_main_c% -echo return bSuccess; >>%gd_main_c% -echo }; >>%gd_main_c% -echo.>>%gd_main_c% - -rem set up link file by specifying dll filepath and main object -echo /Fe%gd_dll_path% > %gd_link% -echo %gd_main_obj% >> %gd_link% - -rem add contents of linkargs file; most of the link argument action is -rem in this file -type %LINKARGSFILE% >> %gd_link% - -rem add command-line import libraries, if any -if defined IMPORT echo !IMPORT! >> %gd_link% - -rem add export specification -echo %gd_def% >> %gd_link% - -rem add contents of OBJLIST file -type %OBJLIST% >> %gd_link% - -rem create dll, import lib, and export file -%LINKER% /nologo /c /O2 /Fo%gd_main_obj% %gd_main_c% >> gendll-cl.log -%LINKER% @%gd_link% - -:CLEANUP -del /F /Q %gd_link% %gd_main_c% %gd_main_obj% gendll-cl.log -goto END - - -:USAGE -echo. -echo. gendll.cmd -echo. -echo. Generate a dynamically-linked library from a set of object files -echo. specified in objlist_file. -echo. -echo. Usage: -echo. %0 dllname dllpath linker linkargs_file symbols_file {/import importlib} /objlist objlist_file -echo. -echo. dllname -- the name of the DLL being created, with no extension. -echo. dllpath -- the path to the DLL being created, with no extension. -echo. linker -- the compiler to use to link the DLL. -echo. linkargs_file -- the path to a file containing a list of all linker -echo. arguments--link options, libraries, and library paths-- -echo. that that may be needed to successfully link the DLL -echo. being created. -echo. symbols_file -- the path to a file containing a list of symbols to -echo. export in the DLL. -echo. importlib -- the path to a .lib library that you wish to import into -echo. the DLL being created. Optional. -echo. objlist_file -- the path to a file containing the list of object files -echo. that make up the bulk of the DLL being created. -echo. - -:END -endlocal diff --git a/attic/windows/linkargs.txt b/attic/windows/linkargs.txt deleted file mode 100644 index 61be998da..000000000 --- a/attic/windows/linkargs.txt +++ /dev/null @@ -1,11 +0,0 @@ -/nologo -/LD /MT -/LIBPATH:"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib" -/LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib" -/nodefaultlib:libcmt /nodefaultlib:libc /nodefaultlib:libmmt -msvcrt.lib -/LIBPATH:"C:\Program Files (x86)\Intel\Compiler\11.1\048\lib\ia32" -/LIBPATH:"C:\Program Files (x86)\Intel\Compiler\11.1\048\mkl\ia32\lib" -mkl_intel_c.lib -mkl_sequential.lib -mkl_core.lib diff --git a/attic/windows/linkargs64.txt b/attic/windows/linkargs64.txt deleted file mode 100644 index 35df4bba9..000000000 --- a/attic/windows/linkargs64.txt +++ /dev/null @@ -1,11 +0,0 @@ -/nologo -/LD /MT -/LIBPATH:"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib\x64" -/LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib\amd64" -/nodefaultlib:libcmt /nodefaultlib:libc /nodefaultlib:libmmt -msvcrt.lib -/LIBPATH:"C:\Program Files (x86)\Intel\Compiler\11.1\048\lib\intel64" -/LIBPATH:"C:\Program Files (x86)\Intel\Compiler\11.1\048\mkl\em64t\lib" -mkl_intel_lp64.lib -mkl_sequential.lib -mkl_core.lib diff --git a/attic/windows/revision b/attic/windows/revision deleted file mode 100644 index 87edf799f..000000000 --- a/attic/windows/revision +++ /dev/null @@ -1 +0,0 @@ -unknown \ No newline at end of file diff --git a/attic/windows/vc110.pdb b/attic/windows/vc110.pdb deleted file mode 100644 index 39ecfdbbb4032998decf6ec6a1448548436fc83c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249856 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 work2 ? n_thread : 1 ); *nt2 = ( work1 < work2 ? n_thread : 1 ); - return; }