configureの作成

cc コンパイラオプション
% cc [<オプション>] <ファイル名> [<ライブラリ>]

srcdir: コンパイルされるソースに対するディレクトリ
.ac: ユーザーのアクセス権限を証明

#!/bin/bash
cat >>Makefile.am <

# ビルドしてインストール
bin_PROGRAMS=test

#コンパイルする際のコンパイルオプション
#../configureなどルートディレクトリ以外で実行した時のインクルードディレクトリ
test_CFLAGS=-g -l @srcdir@/include/

#test_LDADDはライブラリ
test_LDADD= -lm

#ソースコード
test_SOURCES=test.c 

#ライブラリ用設定
include_HEADERS=test.h 
#ライブラリ作成する際のライブラリ名
lib_LIBRARIES=libtest.a 
#libtest.aのソースコード
libtest_a_SOURCES

#ビルドしないがインストールするファイル
#prefixオプションで指定したディレクトリ以下の/share/パッケージ名に配置
pkgdata_DATA=setting
#C言語からdesineとして参照
AM_CFLAGS= -DEVENTTABLE_CSV=""$(pkgdatadir)/setting""

#再帰的にmakeを実行
SUBDIRS= subdir subdir2/subsubdir 
EOF 
vim Makefile.am 
autoscan 
touch NEWS README AUTHORS ChangeLog 
awk '{if(/AC_INIT/){print "AC_INIT(FULL-PACKAGE-NAME, 0.0.1, name@hoge.jp)";print"AM_INIT_AUTOMAKE"}else{print $0}}' configure.scan >
congifure.ac 
vim configure.ac 
aclocal 
autoheader
autoconf
automake -a -c

configureスクリプト

configureスクリプトで設定する項目は、インストールディレクトリ、コンパイラやそのオプション、機能や追加オプションのオン・オフ、ソフトウェア実行時の設定のデフォルト値

インストールディレクトリの設定は、「–prefix=dirname」

$ ./configure --prefix=/opt/hello-2.7
$ make
$ sudo make install

vagrant@vagrant-ubuntu-trusty-64:~/other/hello-2.7$ /opt/hello-2.7/bin/hello
Hello, world!

–prefixを指定しないと、/usr/localにインストール。/usr/localはos標準外のソフトをインストール

shareディレクトリはプロセッサーのアークテクチャに寄らないファイル

./configure

vagrant@vagrant-ubuntu-trusty-64:~/other$ wget http://ftp.gnu.org/gnu/hello/hello-2.7.tar.gz
vagrant@vagrant-ubuntu-trusty-64:~/other$ tar zxvf hello-2.7.tar.gz
vagrant@vagrant-ubuntu-trusty-64:~/other$ cd hello-2.7
vagrant@vagrant-ubuntu-trusty-64:~/other/hello-2.7$ ls
ABOUT-NLS ChangeLog configure.ac gnulib man src
aclocal.m4 ChangeLog.O contrib INSTALL NEWS tests
AUTHORS config.in COPYING Makefile.am po THANKS
build-aux configure doc Makefile.in README TODO

慣習としてドキュメントは全て大文字

Makefile.am, Makefile.inはあるが、Makefileはありませんね。
環境に合わせたmakefileを作成するのが.congifureです。


Makefile.amは、プログラマが作成した定義ファイルでautomakeがMakefile.inを作成する。Makefile.inがMakefileを作成する

bitcoin/Makefile.amも、.configureでmakefileを作成する為のファイルですね^^ なるほどーすげー知識いるなー

./configureを実行します
vagrant@vagrant-ubuntu-trusty-64:~/other/hello-2.7$ ./configure
.
.
.
config.status: creating Makefile
config.status: creating contrib/Makefile
config.status: creating doc/Makefile
config.status: creating gnulib/lib/Makefile
config.status: creating man/Makefile
config.status: creating po/Makefile.in
config.status: creating src/Makefile
config.status: creating tests/Makefile
config.status: creating config.h
config.status: executing depfiles commands
config.status: executing po-directories commands
config.status: creating po/POTFILES
config.status: creating po/Makefile

vagrant@vagrant-ubuntu-trusty-64:~/other/hello-2.7$ ./configure | grep ‘checking’ | wc -l
202

あれ、よく見たら、Makefile.amとかみんなで作ってるけど。。。configureやmakefileまで作るレベルにならにゃいかん、ってことか。。

GNU

GNU hello
http://www.gnu.org/software/hello/
https://github.com/avar/gnu-hello

wgetのバージョンを見ます
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ wget -V
GNU Wget 1.15 built on linux-gnu.

+digest +https +ipv6 +iri +large-file +nls +ntlm +opie +ssl/openssl

Wgetrc:
/etc/wgetrc (system)
Locale:
/usr/share/locale
Compile:
gcc -DHAVE_CONFIG_H -DSYSTEM_WGETRC=”/etc/wgetrc”
-DLOCALEDIR=”/usr/share/locale” -I. -I../../src -I../lib
-I../../lib -D_FORTIFY_SOURCE=2 -I/usr/include -g -O2
-fstack-protector –param=ssp-buffer-size=4 -Wformat
-Werror=format-security -DNO_SSLv2 -D_FILE_OFFSET_BITS=64 -g -Wall
Link:
gcc -g -O2 -fstack-protector –param=ssp-buffer-size=4 -Wformat
-Werror=format-security -DNO_SSLv2 -D_FILE_OFFSET_BITS=64 -g -Wall
-Wl,-Bsymbolic-functions -Wl,-z,relro -L/usr/lib -lssl -lcrypto
-ldl -lz -lidn -luuid ftp-opie.o openssl.o http-ntlm.o
../lib/libgnu.a

PGP, MD5, SHA1はチェックサム

e.g. ece4c66f0c05d216fc96969fcf3d1add *mod_fcgid-2.3.9.tar.gz
md5sumで確認する
$ md5sum -b httpd-2.2.19.tar.gz

vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ dpkg -l gnupg
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==============-============-============-=================================
ii gnupg 1.4.16-1ubun amd64 GNU privacy guard – a free PGP re

vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ gpg –list-keys
gpg: directory `/home/vagrant/.gnupg’ created
gpg: new configuration file `/home/vagrant/.gnupg/gpg.conf’ created
gpg: WARNING: options in `/home/vagrant/.gnupg/gpg.conf’ are not yet active during this run
gpg: keyring `/home/vagrant/.gnupg/pubring.gpg’ created
gpg: /home/vagrant/.gnupg/trustdb.gpg: trustdb created

make

main.c

main()
{
	hello();
}

hello.c

#include <stdio.h>
 
hello()
{
  printf("Hello, World!\n");
}

Makefile

hello: main.o hello.o

helloがターゲット

vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ make
cc -c -o hello.o hello.c
cc -c -o main.o main.c
cc hello.o main.o -o hello
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ ./hello
Hello, World!

時間かかったー、これだけに30分費やした。。

vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ touch hello.c
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ make
cc -c -o hello.o hello.c
cc hello.o main.o -o hello

ほう。

hello: main.o hello.o
clean:
	rm -f *.o hello

vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ make clean
rm -f *.o hello
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ ls
hello.c main.c Makefile

all, test, install, cleanなどがある

ダイナミックリンクとスタティックリンク

ビルド: コンパイルとリンクを実行して、ソースコードから実行可能な形式のファイルを作る
コンパイルにはコンパイラ、リンクにはリンカというツールが使われる
リンカへの入力は、オブジェクトファイルとライブラリ

C言語の標準ライブラリはlibc
ライブラリファイルは、/lib, /usr/lib, /lib64, /usr/lib64にある

vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ ls -lp /lib
total 416
drwxr-xr-x 2 root root 4096 May 14 21:28 apparmor/
lrwxrwxrwx 1 root root 21 May 14 22:21 cpp -> /etc/alternatives/cpp
drwxr-xr-x 4 root root 4096 May 14 21:28 cryptsetup/
drwxr-xr-x 3 root root 4096 May 14 21:28 firmware/
drwxr-xr-x 2 root root 4096 May 14 21:28 hdparm/
drwxr-xr-x 2 root root 4096 May 14 21:27 ifupdown/
drwxr-xr-x 2 root root 4096 May 14 21:27 init/
-rwxr-xr-x 1 root root 71528 Jun 13 2017 klibc-gLiulUM5C1Zpwc25rCxX8UZ6S-s.so
lrwxrwxrwx 1 root root 22 Nov 1 2013 libcryptsetup.so.4 -> libcryptsetup.so.4.5.0
-rw-r–r– 1 root root 145552 Nov 1 2013 libcryptsetup.so.4.5.0
lrwxrwxrwx 1 root root 17 Jan 8 2014 libip4tc.so.0 -> libip4tc.so.0.1.0
-rw-r–r– 1 root root 27392 Jan 8 2014 libip4tc.so.0.1.0
lrwxrwxrwx 1 root root 17 Jan 8 2014 libip6tc.so.0 -> libip6tc.so.0.1.0
-rw-r–r– 1 root root 31520 Jan 8 2014 libip6tc.so.0.1.0
lrwxrwxrwx 1 root root 16 Jan 8 2014 libiptc.so.0 -> libiptc.so.0.0.0
-rw-r–r– 1 root root 5816 Jan 8 2014 libiptc.so.0.0.0
lrwxrwxrwx 1 root root 20 Jan 8 2014 libxtables.so.10 -> libxtables.so.10.0.0
-rw-r–r– 1 root root 47712 Jan 8 2014 libxtables.so.10.0.0
drwxr-xr-x 3 root root 4096 May 14 21:27 lsb/
drwxr-xr-x 2 root root 4096 May 14 21:28 modprobe.d/
drwxr-xr-x 3 root root 4096 May 14 21:28 modules/
drwxr-xr-x 2 root root 4096 May 14 21:28 modules-load.d/
drwxr-xr-x 3 root root 4096 May 14 21:27 plymouth/
drwxr-xr-x 3 root root 4096 May 14 21:29 recovery-mode/
drwxr-xr-x 2 root root 4096 May 14 21:28 resolvconf/
drwxr-xr-x 3 root root 4096 May 14 21:28 systemd/
drwxr-xr-x 15 root root 4096 Mar 22 2014 terminfo/
drwxr-xr-x 4 root root 4096 May 14 22:21 udev/
drwxr-xr-x 2 root root 4096 May 14 21:29 ufw/
drwxr-xr-x 5 root root 12288 May 14 22:21 x86_64-linux-gnu/
drwxr-xr-x 2 root root 4096 May 14 21:28 xtables/

agrant@vagrant-ubuntu-trusty-64:~/bitcoin$ ls -lp /lib64
total 0
lrwxrwxrwx 1 root root 32 Mar 27 2019 ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.19.so

ライブラリにはシェアードライブラリ(ダイナミックライブラリ)とスタティックライブラリがある
例えば、拡張子が”.so”はShared Objectの略
ライブラリはオブジェクトファイルをアーカイブした集合体で拡張子は.a

シェアードライブラリは動的に決定される
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ ldd /bin/bash
linux-vdso.so.1 => (0x00007ffd3e1ac000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fc634203000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc633fff000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc633c36000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc63442c000)

ビルドの実態は、コンパイラやリンカのコマンドを順次実行している
makeは主にc言語で記述したプログラムのビルドに使う MySQLなどではCMake

build.gradle(module:app)

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "jp.hoge.anew"
        minSdkVersion 15
        targetSdkVersion 26
        resConfigs "ja", "xxhdpi"
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            ext.enableCrashlytics = false
        }
    }
    aaptOptions {
        cruncherEnabled false
    }
}

少し早くなった印象。

First Set Algorithm

for each nonterminal X do First(X) :={}
while there are changes to any First(X) do
	for each production rule X ->X1X2...Xn do
		k:=1;
		while k<=n do
			First(X) = First(X) U (First(Xk)-{ε})
			if ε is not in First(Xk) then break;
			k := k+1;
		if (k>n) then First(X) = First(X) U {ε} 

follow sets

stmt -> if-stmt|other
if-stmt -> if(exp)stmt else-part
else-part -> else stmt | ε
exp -> 0 | 1

Regular Expressions

Regular Expressions are used in grep, sed, awk, perl, vi, shells, lex, yacc
– Each may use slightly different convention

State Machines

Parser Classification
LR: Bottom Up Parser
-L: scan left to right
-R: traces rightmost derivation of input string

LL: Top Down Parser
-L: Scan left to right
-L: traces leftmost derivation of input string

Typical notation
– LL(0), LL(1), LR(1), LR(k)
– number(k) refers to maximum look ahead

Recursive Descent Parsing
Non-terminal variable
convert
correct select rule for expansion matchToken
consumes token or Error

EBNF to BNF
 ::=  '*'  | 
EBNF
 ::=  {'*'  }
BNF
 ::= 
 ::= '*'   | ε

RegEx: Finite Automata

Deterministic Finite Automata (DFA)

Lexical Analysis(Scanner)
Read input: one character at a time
Group characters into tokens
Remove white spaces and comments
Encode token types and form tuples and return to parser

type value
FloatConst 123.45
VAR String=DaysOfWeek
Operator Value =+

Regular expression r (a pattern of characters) and its language L(r)
-> used in many Unix programs (e.g., grep, vi., etc.)
State machine (finite automata)

Representations of String
Basics of Regular Expression
Σ= AaBbCcDdEeFf…. {}|[]”;’<>?,./

Symbols & alphabet
-> A symbol is a valid character in a language
-> alphabet is set of legal symbols

Metacharacters/metasymbols that have special meanings:
Defining reg-ex operations(e.g. |,(,), *, + etc.)
Escape character(\) to turn off special meanings
Empty string e and empty set

a | b* = {a, ε, b, bb, bbb, …}
(a | b)* = {ε, a, b, ab, ba, aa, bb, aaa, aab, …} = Any number (including zero) of a’s and b’s in any order

unix-style regular expression
a-b same as abcd
^1-3 denotes characters other than 1, 2, or 3
-, [], +, ?, ^ and $
[a-zA-Z_][a-zA-Z_0-9]*
[0-9][0-9]*
(+|-)?[0-9][0-9]*