CURL = curl
WGET = wget
GIT = git
PERL = ./perl

all:

updatenightly: local/bin/pmbp.pl clean build
	$(CURL) -sSLf https://gist.githubusercontent.com/wakaba/34a71d3137a52abb562d/raw/gistfile1.txt | sh
	git add t_deps/modules
	perl local/bin/pmbp.pl --update
	git add config lib/
	$(CURL) -sSLf https://raw.githubusercontent.com/wakaba/ciconfig/master/ciconfig | RUN_GIT=1 REMOVE_UNUSED=1 perl

clean: clean-json-ps
	rm -fr local/*.txt

## ------ Setup ------

deps: git-submodules pmbp-install

git-submodules:
	$(GIT) submodule update --init

local/bin/pmbp.pl:
	mkdir -p local/bin
	$(WGET) -O $@ https://raw.github.com/wakaba/perl-setupenv/master/bin/pmbp.pl
pmbp-upgrade: local/bin/pmbp.pl
	perl local/bin/pmbp.pl --update-pmbp-pl
pmbp-update: pmbp-upgrade git-submodules
	perl local/bin/pmbp.pl --update \
	    --write-makefile-pl Makefile.PL
pmbp-install: pmbp-upgrade
	perl local/bin/pmbp.pl --install \
            --create-perl-command-shortcut @perl \
            --create-perl-command-shortcut @prove

## ------ Build ------

build: build-deps build-main

build-deps: deps json-ps

build-main: \
    lib/Char/Class/Alphabet.pm \
    lib/Char/Class/Han.pm \
    lib/Char/Class/Hiragana.pm \
    lib/Char/Class/Katakana.pm \
    lib/Char/Class/Kana.pm \
    lib/Char/Class/IDNBlacklist.pm \
    lib/Char/Class/ISOIECTR10176.pm \
    lib/Char/Class/JISX0221.pm \
    lib/Char/Class/JISX4051.pm \
    lib/Char/Class/JISX4052.pm \
    lib/Char/Class/XML.pm \
    lib/Char/Class/JaInput.pm \
    lib/Char/Class/RFC1815.pm \
    lib/Char/Class/UCS.pm
	mkdir -p local
	cd lib/Char/Prop/Unicode && $(MAKE) all

lib/Char/Class/Alphabet.pm: bin/generate-class-module.pl local/sets.json
	$(PERL) $< Alphabet Latin \
	    'TCVN6909_2001=$$tcvn6909:chars' \
	    'TCVN6909<-TCVN6909_2001' \
	    'Vietnamese<-TCVN6909_2001' \
	> $@
	$(PERL) -c $@
lib/Char/Class/Han.pm: bin/generate-class-module.pl local/sets.json
	$(PERL) $< Han Han \
	    'JP_Touyou1949=$$kanji:touyou-1949' \
	    'JP_TouyouDraft1954=$$kanji:touyou-draft-1954' \
	    'JP_Jouyou1981=$$kanji:jouyou-1981' \
	    'JP_Kyouiku1989=$$kanji:kyouiku-1989' \
	    'JP_Kyouiku1st1989=$$kanji:kyouiku-1-1989' \
	    'JP_Kyouiku2nd1989=$$kanji:kyouiku-2-1989' \
	    'JP_Kyouiku3rd1989=$$kanji:kyouiku-3-1989' \
	    'JP_Kyouiku4th1989=$$kanji:kyouiku-4-1989' \
	    'JP_Kyouiku5th1989=$$kanji:kyouiku-5-1989' \
	    'JP_Kyouiku6th1989=$$kanji:kyouiku-6-1989' \
	    'JP_Jimmei1951=$$kanji:jimmei-1951' \
	    'JP_Jimmei1976=$$kanji:jimmei-1976' \
	    'JP_Jimmei1981=$$kanji:jimmei-1981' \
	    'JP_Jimmei1990=$$kanji:jimmei-1990' \
	    'JP_Jimmei1997=$$kanji:jimmei-1997' \
	    'JP_Hyougai2000=$$kanji:hyougai-2000' \
	    'JP_HyougaiStandard2000=$$kanji:hyougai-standard-2000' \
	    'JP_HyougaiSimplified2000=$$kanji:hyougai-simplified-2000' \
	    'SenjimonJP=$$kanji:senjimon' \
	    'JP_Hyougai<-JP_Hyougai2000' \
	    'JP_HyougaiStandard<-JP_HyougaiStandard2000' \
	    'JP_HyougaiSimplified<-JP_HyougaiSimplified2000' \
	    'JP_Jimmei<-JP_Jimmei1997' \
	    'JP_JimmeiKyoyou<-JP_JimmeiKyoyou1981' \
	    'JP_Jouyou<-JP_Jouyou1981' \
	    'JP_Kyouiku<-JP_Kyouiku1989' \
	    'JP_Kyouiku1st<-JP_Kyouiku1st1989' \
	    'JP_Kyouiku2nd<-JP_Kyouiku2nd1989' \
	    'JP_Kyouiku3rd<-JP_Kyouiku3rd1989' \
	    'JP_Kyouiku4th<-JP_Kyouiku4th1989' \
	    'JP_Kyouiku5th<-JP_Kyouiku5th1989' \
	    'JP_Kyouiku6th<-JP_Kyouiku6th1989' \
	    'JP_Kyouiku1998<-JP_Kyouiku1989' \
	    'JP_Kyouiku1st1998<-JP_Kyouiku1st1989' \
	    'JP_Kyouiku2nd1998<-JP_Kyouiku2nd1989' \
	    'JP_Kyouiku3rd1998<-JP_Kyouiku3rd1989' \
	    'JP_Kyouiku4th1998<-JP_Kyouiku4th1989' \
	    'JP_Kyouiku5th1998<-JP_Kyouiku5th1989' \
	    'JP_Kyouiku6th1998<-JP_Kyouiku6th1989' \
	    'JP_Touyou<-JP_Touyou1949' \
	    'Senjimon<-SenjimonJP' \
	> $@
	$(PERL) -c $@
lib/Char/Class/Hiragana.pm: bin/generate-class-module.pl local/sets.json
	$(PERL) $< Hiragana Hiragana \
	    'All=$$kana:hiragana-all' \
	    'Digraph=$$kana:hiragana-digraph' \
	    'Hatsuon=$$kana:hiragana-hatsuon' \
	    'Seion=$$kana:hiragana-seion' \
	    'SemiVoiced=$$kana:hiragana-semivoiced' \
	    'Small=$$kana:hiragana-small' \
	    'Voiced=$$kana:hiragana-voiced' \
	> $@
	$(PERL) -c $@
lib/Char/Class/Katakana.pm: bin/generate-class-module.pl local/sets.json
	$(PERL) $< Katakana Katakana \
	    'All=$$kana:katakana-all' \
	    'Digraph=$$kana:katakana-digraph' \
	    'Hatsuon=$$kana:katakana-hatsuon' \
	    'Seion=$$kana:katakana-seion' \
	    'SemiVoiced=$$kana:katakana-semivoiced' \
	    'Small=$$kana:katakana-small' \
	    'Voiced=$$kana:katakana-voiced' \
	> $@
	$(PERL) -c $@
lib/Char/Class/Kana.pm: bin/generate-class-module.pl local/sets.json
	$(PERL) $< Kana Kana \
	    'All=$$kana:kana-all' \
	    'Digraph=$$kana:kana-digraph' \
	    'Hatsuon=$$kana:kana-hatsuon' \
	    'Seion=$$kana:kana-seion' \
	    'SemiVoiced=$$kana:kana-semivoiced' \
	    'Small=$$kana:kana-small' \
	    'Voiced=$$kana:kana-voiced' \
	> $@
	$(PERL) -c $@
lib/Char/Class/IDNBlacklist.pm: bin/generate-class-module.pl local/sets.json
	$(PERL) $< IDNBlacklist IDNBlacklist 'Chars=$$mozilla:IDN-blacklist-chars' > $@
	$(PERL) -c $@
lib/Char/Class/ISOIECTR10176.pm: bin/generate-class-module.pl local/sets.json
	$(PERL) $< ISOIECTR10176 ISOIECTR10176 \
	    'Latin=$$isoiectr10176-1998:latin' \
	    'Greek=$$isoiectr10176-1998:greek' \
	    'Arabic=$$isoiectr10176-1998:arabic' \
	    'Armenian=$$isoiectr10176-1998:armenian' \
	    'Bengali=$$isoiectr10176-1998:bengali' \
	    'Bopomofo=$$isoiectr10176-1998:bopomofo' \
	    'CJKUnifiedIdeographs=$$isoiectr10176-1998:cjk-unified-ideographs' \
	    'Cyrillic=$$isoiectr10176-1998:cyrillic' \
	    'Devanagari=$$isoiectr10176-1998:devanagari' \
	    'Digits=$$isoiectr10176-1998:digits' \
	    'Georian=$$isoiectr10176-1998:georian' \
	    'Gujarati=$$isoiectr10176-1998:gujarati' \
	    'Gurmukhi=$$isoiectr10176-1998:gurmukhi' \
	    'Hangul=$$isoiectr10176-1998:hangul' \
	    'Hebrew=$$isoiectr10176-1998:hebrew' \
	    'Hiragana=$$isoiectr10176-1998:hiragana' \
	    'Kannada=$$isoiectr10176-1998:kannada' \
	    'Katakana=$$isoiectr10176-1998:katakana' \
	    'Lao=$$isoiectr10176-1998:lao' \
	    'Malayalam=$$isoiectr10176-1998:malayalam' \
	    'Oriya=$$isoiectr10176-1998:oriya' \
	    'Special=$$isoiectr10176-1998:special' \
	    'Tamil=$$isoiectr10176-1998:tamil' \
	    'Telugur=$$isoiectr10176-1998:telugur' \
	    'Thai=$$isoiectr10176-1998:thai' \
	    'Tibetan=$$isoiectr10176-1998:tibetan' \
	> $@
	$(PERL) -c $@
lib/Char/Class/JISX0221.pm: bin/generate-class-module.pl local/sets.json
	$(PERL) $< JISX0221 JISX0221 \
	    'BasicJapanese=$$jisx0221-2001:basic-japanese' \
	    'FullwidthAlphanumeric=$$jisx0221-2001:fullwidth-alphanumerics' \
	    'HalfwidthKatakana=$$jisx0221-2001:halfwidth-katakana' \
	    'JapaneseIdeographicsSupplement1=$$jisx0221-2001:japanese-ideographics-supplement-1' \
	    'JapaneseIdeographicsSupplement2=$$jisx0221-2001:japanese-ideographics-supplement-2' \
	    'JapaneseIdeographicsSupplement3=$$jisx0221-2001:japanese-ideographics-supplement-3' \
	    'JapaneseNonIdeographicsSupplement=$$jisx0221-2001:japanese-non-ideopgrahics-supplement' \
	> $@
	$(PERL) -c $@
lib/Char/Class/JISX4051.pm: bin/generate-class-module.pl local/sets.json
	$(PERL) $< JISX4051 JISX4051 \
	    'AlphabeticExceptSpace=$$jisx4051-1995:western-non-space' \
	    'AlphabeticSpace=$$jisx4051-1995:western-space' \
	    'CharacterInDigits=$$jisx4051-1995:numbers' \
	    'CharacterInUnitSymbol=$$jisx4051-1995:units' \
	    'CloseBracket=$$jisx4051-1995:close-brackets' \
	    'FullStop=$$jisx4051-1995:full-stops' \
	    'Hiragana=$$jisx4051-1995:hiragana' \
	    'JapaneseSpace=$$jisx4051-1995:japanese-space' \
	    'LineStartKinsokuJapaneseCharacter=$$jisx4051-1995:kinsoku' \
	    'MiddleDot=$$jisx4051-1995:middle-dots' \
	    'MiscJapaneseCharacter=$$jisx4051-1995:misc-japanese' \
	    'OpenBracket=$$jisx4051-1995:open-brackets' \
	    'PostShortenedSymbol=$$jisx4051-1995:suffixes' \
	    'PreShortenedSymbol=$$jisx4051-1995:prefixes' \
	    'SeparationSymbol=$$jisx4051-1995:separators' \
	    'UnseparatableCharacter=$$jisx4051-1995:unseparatable' \
	    'WarichuuCloseBracket=$$jisx4051-1995:inline-annotation-close' \
	    'WarichuuOpenBracket=$$jisx4051-1995:inline-annotation-open' \
	> $@
	$(PERL) -c $@
lib/Char/Class/JISX4052.pm: bin/generate-class-module.pl local/sets.json
	$(PERL) $< JISX4052 JISX4052 \
	    'Alphabetic=$$jisx4052:western-all' \
	    'AlphabeticBasic=$$jisx4052:western-basic' \
	    'AlphabeticRecommended=$$jisx4052:western-recommended' \
	    'Digits=$$jisx4052:numbers' \
	    'KanaCharacter=$$jisx4052:kana' \
	    'Kenten=$$jisx4052:emphases' \
	> $@
	$(PERL) -c $@
lib/Char/Class/JaInput.pm: bin/generate-class-module.pl local/sets.json
	$(PERL) $< JaInput JaInput \
	    'Yomi=$$jisx4062-1998:yomi-char' \
	    'Boin=$$jisx4063-2000:boin' \
	    'Shiin=$$jisx4063-2000:shiin' \
	    'Digit=$$jisx4064-2002:digit' \
	    'Hiragana=$$jisx4064-2002:hiragana' \
	    'HiraganaMin=$$jisx4064-2002:hiragana-required' \
	    'Katakana=$$jisx4064-2002:katakana' \
	    'KatakanaMin=$$jisx4064-2002:katakana-required' \
	    'KanaSymbol=$$jisx4064-2002:kana-symbol' \
	    'Latin=$$jisx4064-2002:latin' \
	    'LatinCapital=$$jisx6002-1980:alpha-upper' \
	    'LatinSmall=$$jisx6002-1980:alpha-lower' \
	    'KeyKatakana=$$jisx6002-1980:katakana' \
	    'EnglishSymbol=$$jisx6002-1980:special-alpha' \
	    'KatakanaSymbol=$$jisx6002-1980:special-katakana' \
	> $@
	$(PERL) -c $@
lib/Char/Class/RFC1815.pm: bin/generate-class-module.pl local/sets.json
	$(PERL) $< RFC1815 RFC1815 \
	    'ISO10646J1=$$rfc1815:ISO-10646-J-1' \
	> $@
	$(PERL) -c $@
local/ucs.sh: ucs-list.txt
	echo exec $(PERL) bin/generate-class-module.pl UCS UCS \\ > $@
	cat $< | perl -n -e 'sub n ($$) { $$x = ucfirst lc $$_[0]; $$x =~ s/[ -](.)/uc $$1/ge; $$x =~ s/Cjk/CJK/g; $$x =~ s/^CJK/_CJK/g; $$x } sub l ($$) { $$x = $$_[0]; $$x =~ s/ /-/g; $$x } s{^(\d+) (.+)}{qq{\x27$$1<-}.n($$2).qq{\x27 \\\n\x27}.n($$2).qq{=\x24isoiec10646:}.l($$2).qq{\x27 \\}}e; print $$_' >> $@
	echo "'5<-IPAExtensions' \\" >> $@
	echo "'IPAExtensions="'$$isoiec10646:ipa-extensions'"' \\" >> $@
	echo "'300<-_BMP' \\" >> $@
	echo "'_BMP="'$$isoiec10646:bmp'"' \\" >> $@
	echo "'299<-_BMPFirstEdition' \\" >> $@
	echo "'_BMPFirstEdition="'$$isoiec10646:bmp-first-edition-code-point'"' \\" >> $@
	echo "'301<-_BMP_AMD7' \\" >> $@
	echo "'_BMP_AMD7="'$$isoiec10646:bmp-amd-7'"' \\" >> $@
	echo "'302<-_BMPSecondEdition' \\" >> $@
	echo "'_BMPSecondEdition="'$$isoiec10646:bmp-second-edition'"' \\" >> $@
	echo "'281<-_MES1' \\" >> $@
	echo "'_MES1="'$$isoiec10646:mes1'"' \\" >> $@
	echo "'282<-_MES2' \\" >> $@
	echo "'_MES2="'$$isoiec10646:mes2'"' \\" >> $@
	echo "'283<-_MES3A' \\" >> $@
	echo "'_MES3A="'$$isoiec10646:mes3a'"' \\" >> $@
	echo "'284<-_MES3B' \\" >> $@
	echo "'_MES3B="'$$isoiec10646:mes3b'"' \\" >> $@
	echo '' >> $@
lib/Char/Class/UCS.pm: bin/generate-class-module.pl local/sets.json local/ucs.sh
	sh local/ucs.sh > $@
	$(PERL) -c $@
lib/Char/Class/XML.pm: bin/generate-class-module.pl local/sets.json
	$(PERL) $< XML XML \
	    'Char10=$$xml10-5e:Char' \
	    'Char11=$$xml11:Char' \
	    'Char<-Char11' \
	    'RestrictedChar11=$$xml11:RestrictedChar' \
	    'RestrictedChar<-RestrictedChar11' \
	    'S=$$xml10-5e:S' \
	    'BaseChar=$$xml10-5e:BaseChar' \
	    'Ideographic=$$xml10-5e:Ideographic' \
	    'CombiningChar=$$xml10-5e:CombiningChar' \
	    'Digit=$$xml10-5e:Digit' \
	    'Extender=$$xml10-5e:Extender' \
	    'Letter=$$xml10-5e:Letter' \
	    'NameChar10_1=$$xml10-4e:NameChar' \
	    'NameChar10_5=$$xml10-5e:NameChar' \
	    'NameChar10<-NameChar10_5' \
	    'NameChar11=$$xml11:NameChar' \
	    'NameChar<-NameChar10_5' \
	    'NCNameChar10_1=$$xml10-4e:NCNameChar' \
	    'NCNameChar10_5=$$xml10-5e:NCNameChar' \
	    'NCNameChar10<-NCNameChar10_5' \
	    'NCNameChar11=$$xml11:NCNameChar' \
	    'NCNameChar<-NCNameChar10_5' \
	    '_NCNameStartChar10_1=$$xml10-4e:NCNameStartChar' \
	    '_NameStartChar10_1=$$xml10-4e:NameStartChar' \
	    'NameStartChar10_5=$$xml10-5e:NameStartChar' \
	    'NameStartChar10<-NameStartChar10_5' \
	    '_NameStartChar10<-NameStartChar10_5' \
	    'NameStartChar11=$$xml11:NameStartChar' \
	    'NameStartChar<-NameStartChar10_5' \
	    '_NameStartChar<-NameStartChar10_5' \
	    'NCNameStartChar10_5=$$xml10-5e:NCNameStartChar' \
	    'NCNameStartChar10<-NCNameStartChar10_5' \
	    '_NCNameStartChar10<-NCNameStartChar10_5' \
	    'NCNameStartChar<-NCNameStartChar10_5' \
	    '_NCNameStartChar<-NCNameStartChar10_5' \
	    'NCNameStartChar11=$$xml11:NCNameStartChar' \
	    '_UnrestrictedChar10=$$xml10-5e:unrestricted-char' \
	    '_UnrestrictedChar11=$$xml11:unrestricted-char' \
	    '_UnrestrictedChar<-_UnrestrictedChar11' \
	    'VersionNum=$$xml10-5e:VersionNum-char' \
	    'PubidChar=$$xml10-5e:PubidChar' \
	    '_deprecated_noncharacter=$$xml10-5e:discouraged' \
	    '_unicode_xml_not_suitable=$$unicode-xml:not-suitable' \
	    '_unicode_xml_suitable_format_character=$$unicode-xml:suitable' \
	> $@
	$(PERL) -c $@

local/sets.json:
	$(WGET) -O $@ https://raw.githubusercontent.com/manakai/data-chars/master/data/sets.json

json-ps: local/perl-latest/pm/lib/perl5/JSON/PS.pm
clean-json-ps:
	rm -fr local/perl-latest/pm/lib/perl5/JSON/PS.pm
local/perl-latest/pm/lib/perl5/JSON/PS.pm:
	mkdir -p local/perl-latest/pm/lib/perl5/JSON
	$(WGET) -O $@ https://raw.githubusercontent.com/wakaba/perl-json-ps/master/lib/JSON/PS.pm

## ------ Tests ------

PROVE = ./prove

test: test-deps test-main

test-deps: deps

test-main:
	$(PROVE) t/*/*.t

always:

## License: Public Domain.
