113 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
| #
 | |
| # Copyright 2021 ByteDance Inc.
 | |
| #
 | |
| # Licensed under the Apache License, Version 2.0 (the "License");
 | |
| # you may not use this file except in compliance with the License.
 | |
| # You may obtain a copy of the License at
 | |
| #
 | |
| #     http://www.apache.org/licenses/LICENSE-2.0
 | |
| #
 | |
| # Unless required by applicable law or agreed to in writing, software
 | |
| # distributed under the License is distributed on an "AS IS" BASIS,
 | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| # See the License for the specific language governing permissions and
 | |
| # limitations under the License.
 | |
| #
 | |
| 
 | |
| ARCH			:= avx avx2 sse
 | |
| TMP_DIR			:= output
 | |
| OUT_DIR			:= internal/native
 | |
| SRC_FILE		:= native/native.c
 | |
| 
 | |
| CPU_avx			:= amd64
 | |
| CPU_avx2		:= amd64
 | |
| CPU_sse  		:= amd64
 | |
| 
 | |
| TMPL_avx		:= fastint_amd64_test fastfloat_amd64_test native_amd64_test native_export_amd64
 | |
| TMPL_avx2		:= fastint_amd64_test fastfloat_amd64_test native_amd64_test native_export_amd64
 | |
| TMPL_sse 		:= fastint_amd64_test fastfloat_amd64_test native_amd64_test native_export_amd64
 | |
| 
 | |
| CFLAGS_avx		:= -msse -mno-sse4 -mavx -mpclmul -mno-avx2 -DUSE_AVX=1 -DUSE_AVX2=0
 | |
| CFLAGS_avx2		:= -msse -mno-sse4 -mavx -mpclmul -mavx2    -DUSE_AVX=1 -DUSE_AVX2=1 
 | |
| CFLAGS_sse		:= -msse -mno-sse4 -mno-avx -mno-avx2 -mpclmul
 | |
| 
 | |
| CC_amd64		:= clang
 | |
| ASM2ASM_amd64	:= tools/asm2asm/asm2asm.py
 | |
| 
 | |
| CFLAGS			:= -mno-red-zone
 | |
| CFLAGS			+= -target x86_64-apple-macos11
 | |
| CFLAGS			+= -fno-asynchronous-unwind-tables
 | |
| CFLAGS			+= -fno-builtin
 | |
| CFLAGS			+= -fno-exceptions
 | |
| CFLAGS			+= -fno-rtti
 | |
| CFLAGS			+= -fno-stack-protector
 | |
| CFLAGS			+= -nostdlib
 | |
| CFLAGS			+= -O3
 | |
| CFLAGS			+= -Wall -Werror
 | |
| 
 | |
| NATIVE_SRC		:= $(wildcard native/*.h)
 | |
| NATIVE_SRC		+= $(wildcard native/*.c)
 | |
| 
 | |
| .PHONY: all clean ${ARCH}
 | |
| 
 | |
| define build_tmpl
 | |
| 	$(eval @arch := $(1))
 | |
| 	$(eval @tmpl := $(2))
 | |
| 	$(eval @dest := $(3))
 | |
| 
 | |
| ${@dest}: ${@tmpl}
 | |
| 	mkdir -p $(dir ${@dest})
 | |
| 	echo '// Code generated by Makefile, DO NOT EDIT.' > ${@dest}
 | |
| 	echo >> ${@dest}
 | |
| 	sed -e 's/{{PACKAGE}}/${@arch}/g' ${@tmpl} >> ${@dest}
 | |
| endef
 | |
| 
 | |
| define build_arch
 | |
| 	$(eval @cpu		:= $(value CPU_$(1)))
 | |
| 	$(eval @deps	:= $(foreach tmpl,$(value TMPL_$(1)),${OUT_DIR}/$(1)/${tmpl}.go))
 | |
| 	$(eval @asmin	:= ${TMP_DIR}/$(1)/native.s)
 | |
| 	$(eval @asmout	:= ${OUT_DIR}/$(1)/native_${@cpu}.s)
 | |
| 	$(eval @stubin	:= ${OUT_DIR}/native_${@cpu}.tmpl)
 | |
| 	$(eval @stubout	:= ${OUT_DIR}/$(1)/native_${@cpu}.go)
 | |
| 
 | |
| $(1): ${@asmout} ${@deps}
 | |
| 
 | |
| ${@asmout}: ${@stubout} ${NATIVE_SRC}
 | |
| 	mkdir -p ${TMP_DIR}/$(1)
 | |
| 	$${CC_${@cpu}} $${CFLAGS} $${CFLAGS_$(1)} -S -o ${TMP_DIR}/$(1)/native.s ${SRC_FILE}
 | |
| 	python3 $${ASM2ASM_${@cpu}} ${@asmout} ${TMP_DIR}/$(1)/native.s
 | |
| 	asmfmt -w ${@asmout}
 | |
| 
 | |
| $(eval $(call 	\
 | |
| 	build_tmpl,	\
 | |
| 	$(1),		\
 | |
| 	${@stubin},	\
 | |
| 	${@stubout}	\
 | |
| ))
 | |
| 
 | |
| $(foreach 							\
 | |
| 	tmpl,							\
 | |
| 	$(value TMPL_$(1)),				\
 | |
| 	$(eval $(call 					\
 | |
| 		build_tmpl,					\
 | |
| 		$(1),						\
 | |
| 		${OUT_DIR}/${tmpl}.tmpl,	\
 | |
| 		${OUT_DIR}/$(1)/${tmpl}.go	\
 | |
| 	))								\
 | |
| )
 | |
| endef
 | |
| 
 | |
| all: ${ARCH}
 | |
| 
 | |
| clean:
 | |
| 	for arch in ${ARCH}; do \
 | |
| 		rm -vfr ${TMP_DIR}/$${arch}; \
 | |
| 		rm -vfr ${OUT_DIR}/$${arch}; \
 | |
| 	done
 | |
| 
 | |
| $(foreach 								\
 | |
| 	arch,								\
 | |
| 	${ARCH},							\
 | |
| 	$(eval $(call build_arch,${arch}))	\
 | |
| )
 | 
