aboutsummaryrefslogblamecommitdiff
path: root/games/anki/Makefile
blob: ca9a21f8e5b98ae4b4481dd752df441c55e4aa5e (plain) (tree)
1
2
3
4
5
6
7
8
9
                                                        

                    
                      
                 
                                                                
                                      

                                                                       
 
                               

                                                        
                       
                                 
 

                                                                                                                                             


                                                                               
                                  
                                   
                                       
                                       
                               
                                                                                                
                                                                                      
                                                                            
                                                                              








                                                                               
                                 
                                                                                
                                                                                    
                                                                                    
                                                                                      
                                                                                          
                                                                                 

                                                                                          



                                                                                    
                                                                                      


                                                                              
                                                                          

                         
                   

                                                           



                                                           
                                                            
                                                          

                                                               
                                                           

                                                       
 

                                                                                            
                                          
 
                                  
                             
                             



                                     

                                 


                                      
                                      
                                      
                                    

                               
                               
                                



                                 

                             


                               
                                   

                                           
                                        
                                    

                                           
                                 

                                         
                                  

                                        

                                  
                                     
                              

                                
                            

                                  
                              

                                    


                                                   
                               

                                      
                                       
                                      


                                            
                                       

                             









                                         
                                      


                                  
                             
                          
                                  
                                



                                   
                                  
                            
                                 
                                
                                

                                 


                                     

                                

                                  
                                   




                                        
                             
                                 
                                  
                            

                               
                                   
                                    
                             

                                       





                                         
                               
                              

                                  
                                   

                            

                                  
                                             
                               
                           

                                  
                                  

                                    
                                 

                                       



                                     

                                       

                                        


                                        
                            
                                
                           
                           

                                     


                                     
                                  
                                  

                                            
                                        

                                   


                                        

                                             
                                        
                                         
                                    









                                            
                            
                            
                                   
                                   
                                 
                                 
                               





                                     
                                      
                                
                              
                                 
                                  


                                           


                                  


                                              






                                      
                                  

                                          

                                        
                            
                                 

                            
                                  
                                      
                                  
                                   
                                 
                                
                               
                            

                                          

                                            

                                     

                              
                                


                                
                            
                                 
                                  


                                       
                             
                               

                                      





                                        



                                     
                                

                                



                                          



                                               

                                         
                               




                                              
                                


                                 
                                   
                             

                                     

                                                   







                                                    
                               

                                     
                              
                                                  
                                   
                                                    
                              

                                 





                                                                                                                                                                               
                                                           

                  
                  
 




                                                                              
                                                      



                                                                    
 









                                                  


                                                                             
                        



                                        
 
             



                                                               
                                                    




                                                         

                                                          

                                                                         

                                                            


                                                               


                                                                                    


                                                                            
                                                                                                       


                                                                         

                                                            





                                                                 

                                                                      

                                                                       





                                                                                             
                                                                                     




                                                                       

                                                         
 
           






                                                                           

                                                                   

                                                                                  
 
              


                                                                                       
                                                                                    


                                                                                       


                               

                                                                  
                                                    
                                                                        
                                        
                                                                         
                                                                     
          








                                                                                                                                       
                                                                                                            
                                                                                                           

         

                                                                                  




                                                                                  
                                  

                                       
 
           



                                                                           

                                                                               



                                                                
 


                                                   

                                                               
                                  
                                                                                      

                                                                                   

                                                                                         



                                                                                    
 

                                                               
                                                         
                                  
                          


                                                                                

                                                                                
                       

                                                                                                                  
 
                      
# Created by: Andrew Pantyukhin <infofarmer@FreeBSD.org>

PORTNAME=	anki
DISTVERSION=	2.1.48
PORTREVISION=	3
# Don't forget to update ${_MY_BUILDHASH} if DISTVERSION changes
CATEGORIES=	games education python
MASTER_SITES=	LOCAL/kai/:yarncache
DISTFILES=	anki-yarn-cache-${DISTVERSION}${EXTRACT_SUFX}:yarncache

MAINTAINER=	kai@FreeBSD.org
COMMENT=	Flashcard trainer with spaced repetition

LICENSE=	AGPLv3+
LICENSE_FILE=	${WRKSRC}/LICENSE

BROKEN_aarch64=	needs adjustments (e.g. "//platforms:freebsd_arm64") for the shipped Bazel rules files to include several files during build.

NOT_FOR_ARCHS=	armv6 armv7 i386 mips powerpc
NOT_FOR_ARCHS_REASON=	the bazel build framework supports only 64-bit systems.

BUILD_DEPENDS=	bash:shells/bash \
		bazel:devel/bazel \
		esbuild:devel/esbuild \
		protoc:devel/protobuf \
		yarn:www/yarn \
		${PYTHON_PKGNAMEPREFIX}mypy-protobuf>=1.21:devel/py-mypy-protobuf@${PY_FLAVOR} \
		${PYTHON_PKGNAMEPREFIX}stringcase>0:devel/py-stringcase@${PY_FLAVOR} \
		${PYTHON_PKGNAMEPREFIX}black>0:devel/py-black@${PY_FLAVOR} \
		${PYTHON_PKGNAMEPREFIX}fluent>0:devel/py-fluent@${PY_FLAVOR} \
		${RUN_DEPENDS}

# For x64 architectures there's also a Python package "orjson" that still needs
# to be ported once the required features (= "untagged unions",
# "specialication" and "const_generics") of the "smallvec" crate are available
# in the Rust release channel.
#
# Although the "orjson" package is required via the setup.py of Anki's Python
# library it's (still) optional in the code.
RUN_DEPENDS=	lame:audio/lame \
		${PYTHON_PKGNAMEPREFIX}pyaudio>0:audio/py-pyaudio@${PY_FLAVOR} \
		${PYTHON_PKGNAMEPREFIX}sqlite3>0:databases/py-sqlite3@${PY_FLAVOR} \
		${PYTHON_PKGNAMEPREFIX}decorator>0:devel/py-decorator@${PY_FLAVOR} \
		${PYTHON_PKGNAMEPREFIX}jsonschema>0:devel/py-jsonschema@${PY_FLAVOR} \
		${PYTHON_PKGNAMEPREFIX}send2trash>0:deskutils/py-send2trash@${PY_FLAVOR} \
		${PYTHON_PKGNAMEPREFIX}distro>0:sysutils/py-distro@${PY_FLAVOR} \
		${PYTHON_PKGNAMEPREFIX}markdown>0:textproc/py-markdown@${PY_FLAVOR} \
		${PYTHON_PKGNAMEPREFIX}beautifulsoup>0:www/py-beautifulsoup@${PY_FLAVOR} \
		${PYTHON_PKGNAMEPREFIX}requests>0:www/py-requests@${PY_FLAVOR} \
		${PYTHON_PKGNAMEPREFIX}Flask>0:www/py-flask@${PY_FLAVOR} \
		${PYTHON_PKGNAMEPREFIX}Flask-Cors>0:www/py-flask-cors@${PY_FLAVOR} \
		${PYTHON_PKGNAMEPREFIX}protobuf>0:devel/py-protobuf@${PY_FLAVOR} \
		${PYTHON_PKGNAMEPREFIX}stringcase>0:devel/py-stringcase@${PY_FLAVOR} \
		${PYTHON_PKGNAMEPREFIX}waitress>0:www/py-waitress@${PY_FLAVOR}

# USES=ssl is required for the compilation of the Rust code
USES=		cargo desktop-file-utils pyqt:5 python:3.8+ shebangfix ssl
USE_GITHUB=	yes
GH_ACCOUNT=	ankitects
# Translation files
GH_TUPLE=	ankitects:anki-core-i18n:56d46d6:ftlrslib \
		ankitects:anki-desktop-ftl:5359f84:ftlextra
# Bazel Skylib framework and sets of bazel rules
GH_TUPLE+=	bazelbuild:bazel-skylib:e59b620:bzlskylib \
		bazelbuild:rules_cc:40548a2:bzlrcc \
		bazelbuild:rules_java:c13e3ea:bzlrjava \
		bazelbuild:rules_nodejs:2d02e82:bzlrnodejs \
		bazelbuild:rules_proto:f7a30f6:bzlrproto \
		ankitects:esbuild_toolchain:f942aa9:esbuildtc \
		ankitects:rules_pip:fb02cb7:bzlrpip \
		ankitects:rules_python:3927c9b:bzlrpython \
		ankitects:rules_rust:f66001a:bzlrrust \
		ankitects:rules_sass:275ace7:bzlrsass

USE_PYQT=	core gui network printsupport sip svg webchannel webengine widgets xml_build

SHEBANG_FILES=	qt/tools/runanki.system.in

CARGO_CRATES=	Inflector-0.11.4 \
		adler-1.0.2 \
		ahash-0.7.4 \
		aho-corasick-0.7.18 \
		ammonia-3.1.2 \
		anyhow-1.0.42 \
		arc-swap-1.3.0 \
		arrayref-0.3.6 \
		arrayvec-0.4.12 \
		arrayvec-0.5.2 \
		askama-0.10.5 \
		askama_derive-0.10.5 \
		askama_escape-0.10.1 \
		askama_shared-0.11.1 \
		async-trait-0.1.51 \
		atty-0.2.14 \
		autocfg-1.0.1 \
		base64-0.13.0 \
		bitflags-1.2.1 \
		bitvec-0.19.5 \
		blake3-0.3.8 \
		bumpalo-3.7.0 \
		byteorder-1.4.3 \
		bytes-1.0.1 \
		cc-1.0.69 \
		cfg-if-0.1.10 \
		cfg-if-1.0.0 \
		chrono-0.4.19 \
		coarsetime-0.1.19 \
		codespan-0.11.1 \
		codespan-reporting-0.11.1 \
		constant_time_eq-0.1.5 \
		convert_case-0.4.0 \
		core-foundation-0.9.1 \
		core-foundation-sys-0.8.2 \
		crc32fast-1.2.1 \
		crossbeam-channel-0.5.1 \
		crossbeam-utils-0.8.5 \
		crypto-mac-0.8.0 \
		cssparser-0.27.2 \
		cssparser-macros-0.6.0 \
		ctor-0.1.20 \
		derivative-2.2.0 \
		derive_more-0.99.16 \
		digest-0.9.0 \
		dirs-2.0.2 \
		dirs-sys-0.3.6 \
		dtoa-0.4.8 \
		dtoa-short-0.3.3 \
		dunce-1.0.2 \
		either-1.6.1 \
		encoding_rs-0.8.28 \
		env_logger-0.8.4 \
		fallible-iterator-0.2.0 \
		fallible-streaming-iterator-0.1.9 \
		fixedbitset-0.2.0 \
		flate2-1.0.20 \
		fluent-0.15.0 \
		fluent-bundle-0.15.1 \
		fluent-langneg-0.13.0 \
		fluent-syntax-0.11.0 \
		fnv-1.0.7 \
		foreign-types-0.3.2 \
		foreign-types-shared-0.1.1 \
		form_urlencoded-1.0.1 \
		funty-1.1.0 \
		futf-0.1.4 \
		futures-0.3.16 \
		futures-channel-0.3.16 \
		futures-core-0.3.16 \
		futures-executor-0.3.16 \
		futures-io-0.3.16 \
		futures-macro-0.3.16 \
		futures-sink-0.3.16 \
		futures-task-0.3.16 \
		futures-util-0.3.16 \
		fxhash-0.2.1 \
		generic-array-0.14.4 \
		getopts-0.2.21 \
		getrandom-0.1.16 \
		getrandom-0.2.3 \
		ghost-0.1.2 \
		h2-0.3.3 \
		hashbrown-0.11.2 \
		hashlink-0.7.0 \
		heck-0.3.3 \
		hermit-abi-0.1.19 \
		hex-0.4.3 \
		html5ever-0.25.1 \
		htmlescape-0.3.1 \
		http-0.2.4 \
		http-body-0.4.2 \
		httparse-1.4.1 \
		httpdate-1.0.1 \
		humansize-1.1.1 \
		humantime-2.1.0 \
		hyper-0.14.11 \
		hyper-rustls-0.22.1 \
		hyper-tls-0.5.0 \
		idna-0.2.3 \
		indexmap-1.7.0 \
		indoc-0.3.6 \
		indoc-impl-0.3.6 \
		inflections-1.1.1 \
		instant-0.1.10 \
		intl-memoizer-0.5.1 \
		intl_pluralrules-7.0.1 \
		inventory-0.1.10 \
		inventory-impl-0.1.10 \
		ipnet-2.3.1 \
		itertools-0.9.0 \
		itertools-0.10.1 \
		itoa-0.4.7 \
		js-sys-0.3.52 \
		kuchiki-0.8.1 \
		lazy_static-1.4.0 \
		lexical-core-0.7.6 \
		libc-0.2.98 \
		libsqlite3-sys-0.22.2 \
		linkify-0.5.0 \
		lock_api-0.4.4 \
		log-0.4.14 \
		mac-0.1.1 \
		maplit-1.0.2 \
		markup5ever-0.10.1 \
		markup5ever_rcdom-0.1.0 \
		matches-0.1.8 \
		memchr-2.4.0 \
		mime-0.3.16 \
		mime_guess-2.0.3 \
		miniz_oxide-0.4.4 \
		mio-0.7.13 \
		miow-0.3.7 \
		multimap-0.8.3 \
		native-tls-0.2.7 \
		new_debug_unreachable-1.0.4 \
		nodrop-0.1.14 \
		nom-6.1.2 \
		nom-7.0.0-alpha1 \
		ntapi-0.3.6 \
		num-format-0.4.0 \
		num-integer-0.1.44 \
		num-traits-0.2.14 \
		num_cpus-1.13.0 \
		num_enum-0.5.2 \
		num_enum_derive-0.5.2 \
		once_cell-1.8.0 \
		openssl-0.10.35 \
		openssl-probe-0.1.4 \
		openssl-sys-0.9.65 \
		ouroboros-0.9.5 \
		ouroboros_macro-0.9.5 \
		parking_lot-0.11.1 \
		parking_lot_core-0.8.3 \
		paste-0.1.18 \
		paste-impl-0.1.18 \
		percent-encoding-2.1.0 \
		pest-2.1.3 \
		petgraph-0.5.1 \
		phf-0.8.0 \
		phf-0.9.0 \
		phf_codegen-0.8.0 \
		phf_generator-0.8.0 \
		phf_generator-0.9.0 \
		phf_macros-0.8.0 \
		phf_macros-0.9.0 \
		phf_shared-0.8.0 \
		phf_shared-0.9.0 \
		pin-project-1.0.8 \
		pin-project-internal-1.0.8 \
		pin-project-lite-0.2.7 \
		pin-utils-0.1.0 \
		pkg-config-0.3.19 \
		ppv-lite86-0.2.10 \
		precomputed-hash-0.1.1 \
		proc-macro-crate-1.0.0 \
		proc-macro-error-1.0.4 \
		proc-macro-error-attr-1.0.4 \
		proc-macro-hack-0.5.19 \
		proc-macro-nested-0.1.6 \
		proc-macro2-1.0.28 \
		prost-0.7.0 \
		prost-build-0.7.0 \
		prost-derive-0.7.0 \
		prost-types-0.7.0 \
		pulldown-cmark-0.8.0 \
		pyo3-0.13.2 \
		pyo3-macros-0.13.2 \
		pyo3-macros-backend-0.13.2 \
		quote-1.0.9 \
		radium-0.5.3 \
		rand-0.7.3 \
		rand-0.8.4 \
		rand_chacha-0.2.2 \
		rand_chacha-0.3.1 \
		rand_core-0.5.1 \
		rand_core-0.6.3 \
		rand_hc-0.2.0 \
		rand_hc-0.3.1 \
		rand_pcg-0.2.1 \
		redox_syscall-0.2.9 \
		redox_users-0.4.0 \
		regex-1.5.4 \
		regex-syntax-0.6.25 \
		remove_dir_all-0.5.3 \
		reqwest-0.11.4 \
		ring-0.16.20 \
		rusqlite-0.25.3 \
		rustc-hash-1.1.0 \
		rustc_version-0.3.3 \
		rustls-0.19.1 \
		rustls-native-certs-0.5.0 \
		ryu-1.0.5 \
		schannel-0.1.19 \
		scopeguard-1.1.0 \
		sct-0.6.1 \
		security-framework-2.3.1 \
		security-framework-sys-2.3.0 \
		selectors-0.22.0 \
		semver-0.11.0 \
		semver-parser-0.10.2 \
		serde-1.0.127 \
		serde-aux-2.2.0 \
		serde_derive-1.0.127 \
		serde_json-1.0.66 \
		serde_repr-0.1.7 \
		serde_tuple-0.5.0 \
		serde_tuple_macros-0.5.0 \
		serde_urlencoded-0.7.0 \
		servo_arc-0.1.1 \
		sha1-0.6.0 \
		siphasher-0.3.6 \
		slab-0.4.3 \
		slog-2.7.0 \
		slog-async-2.7.0 \
		slog-envlogger-2.2.0 \
		slog-scope-4.4.0 \
		slog-stdlog-4.1.0 \
		slog-term-2.6.0 \
		smallvec-1.6.1 \
		socket2-0.4.1 \
		spin-0.5.2 \
		stable_deref_trait-1.2.0 \
		static_assertions-1.1.0 \
		string_cache-0.8.1 \
		string_cache_codegen-0.5.1 \
		strum-0.21.0 \
		strum_macros-0.21.1 \
		subtle-2.4.1 \
		syn-1.0.74 \
		take_mut-0.2.2 \
		tap-1.0.1 \
		tempfile-3.2.0 \
		tendril-0.4.2 \
		term-0.6.1 \
		termcolor-1.1.2 \
		thin-slice-0.1.1 \
		thiserror-1.0.26 \
		thiserror-impl-1.0.26 \
		thread_local-1.1.3 \
		time-0.1.44 \
		tinystr-0.3.4 \
		tinyvec-1.3.1 \
		tinyvec_macros-0.1.0 \
		tokio-1.9.0 \
		tokio-macros-1.3.0 \
		tokio-native-tls-0.3.0 \
		tokio-rustls-0.22.0 \
		tokio-socks-0.5.1 \
		tokio-util-0.6.7 \
		toml-0.5.8 \
		tower-service-0.3.1 \
		tracing-0.1.26 \
		tracing-core-0.1.18 \
		try-lock-0.2.3 \
		type-map-0.4.0 \
		typenum-1.13.0 \
		ucd-trie-0.1.3 \
		unic-char-property-0.9.0 \
		unic-char-range-0.9.0 \
		unic-common-0.9.0 \
		unic-langid-0.9.0 \
		unic-langid-impl-0.9.0 \
		unic-langid-macros-0.9.0 \
		unic-langid-macros-impl-0.9.0 \
		unic-ucd-category-0.9.0 \
		unic-ucd-version-0.9.0 \
		unicase-2.6.0 \
		unicode-bidi-0.3.5 \
		unicode-normalization-0.1.19 \
		unicode-segmentation-1.8.0 \
		unicode-width-0.1.8 \
		unicode-xid-0.2.2 \
		unindent-0.1.7 \
		untrusted-0.7.1 \
		url-2.2.2 \
		utf-8-0.7.6 \
		utf8-decode-1.0.1 \
		utime-0.3.1 \
		vcpkg-0.2.15 \
		version_check-0.9.3 \
		want-0.3.0 \
		wasi-0.9.0+wasi-snapshot-preview1 \
		wasi-0.10.0+wasi-snapshot-preview1 \
		wasm-bindgen-0.2.75 \
		wasm-bindgen-backend-0.2.75 \
		wasm-bindgen-futures-0.4.25 \
		wasm-bindgen-macro-0.2.75 \
		wasm-bindgen-macro-support-0.2.75 \
		wasm-bindgen-shared-0.2.75 \
		web-sys-0.3.52 \
		webpki-0.21.4 \
		webpki-roots-0.21.1 \
		which-4.2.2 \
		winapi-0.3.9 \
		winapi-i686-pc-windows-gnu-0.4.0 \
		winapi-util-0.1.5 \
		winapi-x86_64-pc-windows-gnu-0.4.0 \
		winreg-0.7.0 \
		wyz-0.2.0 \
		xml5ever-0.16.1 \
		zip-0.5.13 \
		reqwest@git+https://github.com/ankitects/reqwest.git?rev=7591444614de02b658ddab125efba7b2bb4e2335\#7591444614de02b658ddab125efba7b2bb4e2335 \
		hyper-timeout@git+https://github.com/ankitects/hyper-timeout.git?rev=0cb6f7d14c62819e37cd221736f8b0555e823712\#0cb6f7d14c62819e37cd221736f8b0555e823712 \
		linkcheck@git+https://github.com/ankitects/linkcheck.git?rev=2f20798ce521cc594d510d4e417e76d5eac04d4b\#2f20798ce521cc594d510d4e417e76d5eac04d4b \
		tokio-io-timeout@git+https://github.com/ankitects/tokio-io-timeout.git?rev=1ee0892217e9a76bba4bb369ec5fab8854935a3c\#1ee0892217e9a76bba4bb369ec5fab8854935a3c \
		pct-str@git+https://github.com/timothee-haudebourg/pct-str.git?rev=4adccd8d4a222ab2672350a102f06ae832a0572d\#4adccd8d4a222ab2672350a102f06ae832a0572d
CARGO_CARGOTOML=	${WRKSRC}/pylib/rsbridge/Cargo.toml

CARGO_BUILD=	no
CARGO_INSTALL=	no

# BAZEL=1 is required otherwise ${WRKSRC}/rslib/build/main.rs produces a dummy
# buildinfo.txt that doesn't contain the actual build hash.
CARGO_ENV=	BAZEL=1 \
		BUILDINFO=${_MY_LOCALREPO}/rust_output/buildinfo.txt \
		PYO3_PYTHON=${PYTHON_CMD} \
		PROTO_TOP=${WRKSRC}/proto/.top_level \
		PROTOC=${LOCALBASE}/bin/protoc \
		BACKEND_PROTO=${WRKSRC}/rslib/backend.proto \
		RSLIB_FTL_ROOT=${_MY_LOCALREPO}/ftlrslib/l10n.toml \
		EXTRA_FTL_ROOT=${_MY_LOCALREPO}/ftlextra/l10n.toml

OPTIONS_DEFAULT=	MPV
OPTIONS_GROUP=		PLAYER
OPTIONS_GROUP_PLAYER=	MPLAYER MPV
OPTIONS_SUB=		yes

MPV_DESC=	mpv media player support

MPLAYER_RUN_DEPENDS=	mplayer:multimedia/mplayer
MPV_RUN_DEPENDS=	mpv:multimedia/mpv

# Should contain the most recent commit that reflects ${DISTVERSION} and must
# be exactly 8 digits otherwise the check for newer versions won't work as
# expected.
_MY_BUILDHASH=	fb07bad3
# Path of the local bazel repositories
_MY_LOCALREPO=	${WRKSRC}/local_repos
# Path of cache that is used by www/yarn
_MY_YARNCACHE=	${WRKDIR}/.yarn

post-extract:
	# Create a configuration file for bazel
	@${ECHO_CMD} "startup --batch" > ${WRKSRC}/user.bazelrc
	# Create local repositories which are used by bazel
	@${MKDIR} ${_MY_LOCALREPO} \
		${_MY_LOCALREPO}/local_esbuild/bin \
		${_MY_LOCALREPO}/local_node/node/bin \
		${_MY_LOCALREPO}/local_node/node/lib \
		${_MY_LOCALREPO}/local_node/yarn/bin \
		${_MY_LOCALREPO}/protoc_bin_freebsd/bin \
		${_MY_LOCALREPO}/pyqt5 \
		${_MY_LOCALREPO}/rust_output/librsbridge \
		${_MY_LOCALREPO}/rust_output/strings_json
	# Create empty WORKSPACE files in the top directory of each local
	# repository
	@${TOUCH} ${_MY_LOCALREPO}/local_esbuild/WORKSPACE \
		${_MY_LOCALREPO}/local_node/WORKSPACE \
		${_MY_LOCALREPO}/protoc_bin_freebsd/WORKSPACE \
		${_MY_LOCALREPO}/pyqt5/WORKSPACE \
		${_MY_LOCALREPO}/rust_output/WORKSPACE
	# Copy the bazel rules for NodeJS and esbuild to the custom local repository
	# as they need some patching
	@${CP} -r ${WRKSRC_esbuildtc} ${_MY_LOCALREPO}/esbuild_toolchain
	@${CP} -r ${WRKSRC_bzlrnodejs} ${_MY_LOCALREPO}/rules_nodejs
	# Link the remaining bazel rules into the custom local repository as
	# they don't need to be patched
.for _dir in bzlskylib bzlrcc bzlrjava bzlrpip bzlrproto bzlrpython bzlrrust bzlrsass ftlextra ftlrslib
	@${RLN} ${WRKSRC_${_dir}} ${_MY_LOCALREPO}/${_dir:S/bzlr/rules_/}
.endfor
	# Copy custom BUILD.bazel files to the local repositories
	@${CP} ${FILESDIR}/bazel/BUILD.bazel-local_esbuild \
		${_MY_LOCALREPO}/local_esbuild/BUILD.bazel
	@${CP} ${FILESDIR}/bazel/BUILD.bazel-local_node \
		${_MY_LOCALREPO}/local_node/BUILD.bazel
	@${CP} ${FILESDIR}/bazel/BUILD.bazel-protoc_bin_freebsd \
		${_MY_LOCALREPO}/protoc_bin_freebsd/BUILD.bazel
	@${CP} ${FILESDIR}/bazel/BUILD.bazel-pyqt5 \
		${_MY_LOCALREPO}/pyqt5/BUILD.bazel
	@${CP} ${FILESDIR}/bazel/BUILD.bazel-rust_output-librsbridge \
		${_MY_LOCALREPO}/rust_output/librsbridge/BUILD.bazel
	@${CP} ${FILESDIR}/bazel/BUILD.bazel-rust_output-strings_json \
		${_MY_LOCALREPO}/rust_output/strings_json/BUILD.bazel
	@${CP} ${FILESDIR}/bazel/BUILD.bazel-i18n ${WRKSRC_ftlrslib}/BUILD.bazel
	@${CP} ${FILESDIR}/bazel/BUILD.bazel-i18n ${WRKSRC_ftlextra}/BUILD.bazel
	# Move some files out of the way as they will be replaced by custom copies.
	@${MV} ${WRKSRC}/repos.bzl ${WRKSRC}/repos.bzl.dist
	@${MV} ${WRKSRC}/pip/pyqt5/defs.bzl ${WRKSRC}/pip/pyqt5/defs.bzl.dist
	@${MV} ${WRKSRC}/pylib/rsbridge/BUILD.bazel ${WRKSRC}/pylib/rsbridge/BUILD.bazel.dist
	@${MV} ${WRKSRC}/rslib/i18n/BUILD.bazel ${WRKSRC}/rslib/i18n/BUILD.bazel.dist
	# Copy the replacement files
	@${CP} ${FILESDIR}/bazel/repos.bzl ${WRKSRC}/
	@${CP} ${FILESDIR}/bazel/pyqt5.bzl ${WRKSRC}/pip/pyqt5/defs.bzl
	@${CP} ${FILESDIR}/bazel/BUILD.bazel-pylib-rsbridge \
		${WRKSRC}/pylib/rsbridge/BUILD.bazel
	@${CP} ${FILESDIR}/bazel/BUILD.bazel-rslib-i18n \
		${WRKSRC}/rslib/i18n/BUILD.bazel

post-patch:
	@${REINPLACE_CMD} -e 's|%%LOCALBASE%%|${LOCALBASE}|' \
		${_MY_LOCALREPO}/rules_nodejs/internal/node/node_patches.js
	@${REINPLACE_CMD} -e 's|\@PREFIX\@|${PREFIX}|' \
		${WRKSRC}/qt/tools/runanki.system.in
	@${REINPLACE_CMD} -e 's|%%_MY_BUILDHASH%%|${_MY_BUILDHASH}|' \
		${WRKSRC}/scripts/status.sh
	@${REINPLACE_CMD} -e 's|%%_MY_LOCALREPO%%|${_MY_LOCALREPO}|g' \
		${WRKSRC}/repos.bzl ${WRKSRC}/proto/protobuf.bzl \
		${_MY_LOCALREPO}/esbuild_toolchain/esbuild_repo.bzl
	@${REINPLACE_CMD} -e 's|%%_MY_YARNCACHE%%|${_MY_YARNCACHE}|' \
		${_MY_LOCALREPO}/rules_nodejs/internal/npm_install/npm_install.bzl

pre-configure:
	# Link the binaries of Node, Protobuf and Yarn into the local bazel
	# repositories to provide them during build.
	${LN} -s ${LOCALBASE}/bin/protoc-gen-mypy ${WRKSRC}/pylib/tools/protoc-gen-mypy
	${LN} -s ${LOCALBASE}/bin/esbuild ${_MY_LOCALREPO}/local_esbuild/bin/esbuild
	${LN} -s ${LOCALBASE}/bin/node ${_MY_LOCALREPO}/local_node/node/bin/node
	${LN} -s ${LOCALBASE}/bin/yarn.js ${_MY_LOCALREPO}/local_node/yarn/bin/yarn.js
	${LN} -s ${LOCALBASE}/bin/protoc ${_MY_LOCALREPO}/protoc_bin_freebsd/bin/protoc

# Overview of the build process
#
# Steps 1 and 2 are built separately from the bazel build process.
#
# 1. rslib (Rust library, implictly built by step 2)
#    `-> produces ${_MY_LOCALREPO}/rust_output/strings_json/strings.json
# 2. pylib/rsbridge (Rust/Python bridge)
#    `-> produces ${_MY_LOCALREPO}/rust_output/librsbridge/librsbridge.so
# 3. The remaining components (Python, Qt5 and JS) are built by bazel
pre-build:
	# Generate buildinfo.txt which is used via BUILDINFO in ${CARGO_ENV} during
	# compilation.
	${ECHO_CMD} -e "STABLE_VERSION ${DISTVERSION}\nSTABLE_BUILDHASH ${_MY_BUILDHASH}" >> ${_MY_LOCALREPO}/rust_output/buildinfo.txt
	${CARGO_CARGO_RUN} build \
		--manifest-path ${CARGO_CARGOTOML} \
		--verbose \
		${CARGO_BUILD_ARGS}
	# These files are required for the remaining build process via bazel so copy
	# them the local repository.
	${CP} `${FIND} ${CARGO_TARGET_DIR} -name "librsbridge.so"` ${_MY_LOCALREPO}/rust_output/librsbridge/
	${CP} `${FIND} ${CARGO_TARGET_DIR} -name "strings.json"` ${_MY_LOCALREPO}/rust_output/strings_json/

do-build:
	# Limit bazel jobs to 1 due random build failures while compiling TS files
	# via "tsc".
	cd ${WRKSRC} && \
		bazel --output_user_root="${WRKDIR}/.bazel" build \
			--action_env=PYTHON_SITE_PACKAGES="${PYTHON_SITELIBDIR}" \
			--action_env=PYTHON_SYS_EXECUTABLE="${PYTHON_CMD}" \
			--compilation_mode opt \
			--jobs 1 \
			--subcommands \
		dist

post-build:
	${TAR} -xf `${FIND} ${WRKDIR}/.bazel -name "dist.tar"` -C ${WRKSRC}
	cd ${WRKSRC}/bazel-dist && \
		${UNZIP_NATIVE_CMD} anki-${DISTVERSION}-*.whl && \
		${UNZIP_NATIVE_CMD} aqt-${DISTVERSION}-*.whl
	# Compile Anki's Python libary (pylib) and Qt5 library (aqt) to prepare
	# them for installation
	${PYTHON_CMD} -m compileall ${WRKSRC}/bazel-dist/anki
	${PYTHON_CMD} -O -m compileall ${WRKSRC}/bazel-dist/anki
	${PYTHON_CMD} -m compileall ${WRKSRC}/bazel-dist/aqt
	${PYTHON_CMD} -O -m compileall ${WRKSRC}/bazel-dist/aqt

do-install:
	${MKDIR} ${STAGEDIR}${DATADIR}/anki \
			${STAGEDIR}${DATADIR}/aqt \
			${STAGEDIR}${PREFIX}/share/pixmaps \
			${STAGEDIR}${PREFIX}/share/applications
	cd ${WRKSRC}/bazel-dist/ \
		&& ${COPYTREE_SHARE} anki ${STAGEDIR}${DATADIR} "! -name .gitignore" \
		&& ${COPYTREE_SHARE} aqt ${STAGEDIR}${DATADIR} "! -name .gitignore"
	cd ${WRKSRC}/qt/linux \
		&& ${INSTALL_DATA} anki.xpm anki.png ${STAGEDIR}${PREFIX}/share/pixmaps \
		&& ${INSTALL_DATA} anki.desktop ${STAGEDIR}${PREFIX}/share/applications \
		&& ${INSTALL_MAN} anki.1 ${STAGEDIR}${MANPREFIX}/man/man1
	cd ${WRKSRC}/qt/tools \
		&& ${INSTALL_SCRIPT} runanki.system.in ${STAGEDIR}${PREFIX}/bin/anki
	${STRIP_CMD} ${STAGEDIR}${DATADIR}/anki/_backend/rsbridge.so

# Helper target to make the generation of the yarn cache easier
make-yarn-cache:
	# Run "make extract" before executing this target
	@${RM} -r ${_MY_YARNCACHE}
	@cd ${WRKSRC}/ts \
		&& ${LOCALBASE}/bin/yarn --cache-folder ${_MY_YARNCACHE} install
	@cd ${WRKSRC_bzlrnodejs}/packages/labs/grpc_web/ \
		&& ${LOCALBASE}/bin/yarn --cache-folder ${_MY_YARNCACHE} install
	@cd ${WRKSRC_bzlrsass}/sass \
		&& ${LOCALBASE}/bin/yarn --cache-folder ${_MY_YARNCACHE} install
	@cd ${WRKDIR} \
		&& ${TAR} -czf ${PORTNAME}-yarn-cache-${DISTVERSION}${EXTRACT_SUFX} .yarn \
		&& ${ECHO} "Please upload the file ${WRKDIR}/${PORTNAME}-yarn-cache-${DISTVERSION}${EXTRACT_SUFX}"

.include <bsd.port.mk>