MySQL 5.x 설치 (1)

MySQL

Install

Ubuntu 16 x64, armhf 등에서 패키지로 설치

1

Start

mysql-server 를 설치하며 만든 root 사용자 패스워드를 사용해서 데이터베이스에 접속한다.

1
2
3
4
5
6
7
8
9
$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.26 MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

데이터베이스 보기

1
2
3
4
5
6
7
8
9
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+

mysql shell 에서 root 패스워드 변경

1
2
mysql> update user set password=password('PASSWORD') where user = ‘root’;
mysql> flush privileges;

MySQL 설정

MySQL에서 설정파일을 읽는 순서는 다음과 같다.

/etc/my.cnf
/etc/mysql/my.cnf
/usr/local/mysql/etc/my.cnf
~/.my.cnf

/etc/my.cnf

utf-u 문자셋을 기본으로 설정하기 위해서 my.cnf 파일을 다음 같이 사용한다.

만약 외부에서 데이터베이스를 접속하면 설정의 bind-address 막아 주어야 한다. 그렇지 않으면 클라이언트에서 접속 시도시 다음 2003 에러가 난다.[^2]

1
ERROR 2003 (HY000): Can't connect to MySQL server on

MySQL 설정 파일에서 문자셋을 변경할 수 있다. 다믕 같이 자신의 my.cnf 파일을 작성한다. client, mysqld, mysql 에 대해서 utf8 사용을 선언해 준다.

1
2
3
4
5
6
7
8
9
10
11
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

[mysql.server]
user=mysql
basedir=/var/lib

[safe_mysqld]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[client]
..
default-character-set=utf8

[mysqld]
character-set-client-handshake=FALSE
init_connect="SET collation_connection = utf8_general_ci"
init_connect="SET NAMES utf8"
character-set-server=utf8
collation-server=utf8_general_ci

[mysqldump]
default-character-set=utf8

[mysql]
default-character-set=utf8

Mysql Secure Installation

1
# mysql_secure_installation

SSL

SSL을 통한 암호화 접속을 허용하려면 서버측과 클라이언트 측 모두 인증 파일을 만들어야 한다.

https://dev.mysql.com/doc/refman/5.7/en/using-encrypted-connections.html

서버측 인증

인증 --ssl 옵션으로 파일은,

  • –ssl-ca identifies the Certificate Authority (CA) certificate.

  • –ssl-cert identifies the server public key certificate. This can be sent to the client and authenticated against the CA certificate that it has.

  • –ssl-key identifies the server private key.

mysql_ssl_rsa_setup 유틸리티를 실행하면 data 디렉토리 밑에 생성해 준다.[^5]

ca.pem
server-cert.pem
server-key.pem

파일을 생성해 준다.

1
2
3
4
5
[mysqld]

ssl-ca=/var/mysql/ca.pem
ssl-cert=/var/mysql/server-cert.pem
ssl-key=/var/mysql/server-key.pem

openssl 이용

openssl을 이용해 수동으로 키를 생성한다. [^6]

1
2
3
#cd /etc/mysql
#openssl genrsa 2048 > ca-key.pem

ca certificate 생성

1
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem
1
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem

private key를 생성합니다.

[root@EDYDR51P0 newcerts]# openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem

증서를 가지고 SSL 로 접속할려면 요런 옵션으로 접속하면 된다.

mysql -u root -p –ssl –ssl-ca=c:\cert\cert.pem

참조

https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-16-04

[^5]: Creating SSL & RSA Certificates and keys
[^6]: [Creating SSL Certificates and keys Using openssl](6.4.3.2 Creating SSL Certificates and Keys Using openssl)

Cloud Drives 마운트 사용하기

리눅스 ( 아마 Armbian 서버에서 사용하려고 했었던 것 같다?!)에서 Cloud drive를 사용하고자 한다.

Odroid C2 그리고 Orange-pi 시스템에서 사용할, 데스크탑 환경의 Armbian Xenial에서 사용하기 위해 클라우드 드라이브를 사용할 목적으로 사용했었다.

Google Drive

Google drive는 grive 패키지로 제공되고 있다. 최근 (아마 2016년 이후) Google의 REST API가 바뀌어 grive2 패키지를 사용해야 한다. 패키지 제공이 되지 않으면 소스 빌드해서 사용했다.

grive2 소스 기반 설치

Debian/Ubuntu/Linux Mint 에서 다음 라이브러리가 필요하다:

  • yajl 2.x
  • libcurl
  • libstdc++
  • libgcrypt
  • Boost (Boost filesystem, program_options, regex, unit_test_framework and system are required)
  • expat

다음 같이 cmake 와 필요한 라이브러리를 apt로 설치한다.

1
2
sudo apt-get install git cmake build-essential libgcrypt11-dev libyajl-dev \
libboost-all-dev libcurl4-openssl-dev libexpat1-dev libcppunit-dev binutils-dev pkg-config

빌드

소스 다운로드:

1
2
git clone https://github.com/vitalif/grive2
cd grive2

CMake 로는 다음 같이 빌드 환경을 구성한다

1
2
3
mkdir build
cd build
cmake ..

그리고 Make 로 다음 같이 빌드한다:

1
make -j4

그리고 설치한다:

1
sudo make install

Updates

소스는 git pull 로 최신 소스를 얻고 다시 빌드한다:

1
2
3
4
5
6
cd /path/to/yourGriveSourceCodeDir/grive2
git pull
cd build
cmake ..
make -j4
sudo make install

Usage

인증

1
2
3
4
5
6
7
8
9
10
$ grive -a
-----------------------
Please go to this URL and get an authentication code:

https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%....client_id=22314510474.apps.googleusercontent.com
-----------------------
Please input the authentication code here:
5/dTdVFy9xBd2cKLYvkcvJlYhwfht4IPuyJdri2Vv3sKA
Reading local directories
Reading remote server file list

참조


## OneDrive, for Linux

OneDrive, for Linux를 설치해서 사용한다.

설치

https://github.com/skilion/onedrive 와 같이 다운로드해서 설치하거나 apt로 unstable apt로 설치할 수 있다.

source 설치

git-hub 가이드에 따라,

1
2
3
4
5
sudo apt-get install libcurl-dev
sudo apt-get install libsqlite3-dev
sudo wget http://master.dl.sourceforge.net/project/d-apt/files/d-apt.list -O /etc/apt/sources.list.d/d-apt.list
wget -qO - http://dlang.org/d-keyring.gpg | sudo apt-key add -
sudo apt-get update && sudo apt-get install dmd-bin

그런데 Armbian 에서 llibcurl-dev 패키지를 요구해서,

1
2
3
4
5
6
7
$ sudo apt-get install libcurl-dev
Reading state information... Done
Package libcurl-dev is a virtual package provided by:
libcurl4-openssl-dev 7.38.0-4+deb8u5
libcurl4-nss-dev 7.38.0-4+deb8u5
libcurl4-gnutls-dev 7.38.0-4+deb8u5
You should explicitly select one to install.

그래서 libcurl-dev을 설치했다

1
2
$ sudo apt-get install libcurl4-openssl-dev
$ sudo apt-get install libsqlite3-dev

설정

1
2
3
4
$ cat ~/.config/onedrive/config
sync_dir = "~/OneDrive"
skip_file = ".*|~*|thumbs.db|Games/*.iso"
skip_dir = ".*|Music|Movies/FullHD"

사용은

1
2
3
4
5
6
7
$ onedrive -h
Usage: onedrive [OPTION]...
no option Sync and exit.
-m --monitor Keep monitoring for local and remote changes.
--resync Forget the last saved state, perform a full sync.
-v --verbose Print more details, useful for debugging.
-h --help This help information.

참조

Build ffmpeg - macOS

Mac OS X 에서 ffmpeg 빌드

Android OS에 사용할 ffmpeg를 macOS에서 크로스컴파일러로 빌드해서 포팅하는 과정을 담고 있다.
필요한 것은

  • homebrew
  • xcode command line
  • Android NDK stanalone toolchain

준비할 것

Homebrew 를 이용한 빌드를 위해서 xcode와 homebrew 설치가 필요하다.

Xcode 최신버전들은 Command line tool을 수동으로 설치해야 한다.

  • Xcode를 실행하여 ‘Preferences > Downloads > Command Line Tools’ 항목을 설치

homebrew 설치

1
ruby <(curl -fsSkL raw.github.com/mxcl/homebrew/go)

그리고 homebrew doctor 명령을 실행해 설치 환경과 내용이 이상 없는지 확인한다.

1
homebrew doctor

update로 포뮬라들을 최신으로 갱신해 준다.

1
brew update

homebrew에서 설치하는 개체를 Ruby script로 패키지에 대해 선언한 명세서를 Formula라고 하고 install 명령에 의해 /usr/local/Library/Formula 에 설치한다.

homebrew에서 패키지를 하나 설치한다.

1
$ brew install wget

그리고 패키지의 업그레이드, 제거는 다음과 같다.

1
2
brew upgrade [foo]
brew uninstall [foo]

의존성 패키지 설치

ffmpeg 에 필요한 의존선 패키지를 설치한다.

1
2
3
4
brew install automake celt faac fdk-aac git \
lame libass libtool libvorbis libvpx libvo-aacenc \
opencore-amr openjpeg opus sdl schroedinger shtool \
speex texi2html theora wget x264 xvid yasm

Install libaacplus (atm. there is no recipe for it) 컴파일 환경에 대해 [^1]를 참조했다.

1
2
3
wget http://217.20.164.161/~tipok/aacplus/libaacplus-2.0.2.tar.gz
tar xzf libaacplus-2.0.2.tar.gz
cd libaacplus-2.0.2

libtool on osx is quite different from the gnu libtool, which is called glibtool on osx

1
2
3
4
5
6
7
cat autogen.sh | sed 's/libtool/glibtool/' > autogen2.sh


sed -i '.bck' -e 's/libtool/glibtool/' autogen.sh
./autogen.sh
make && make install
cd ..

Standalone toolchain

http://goo.gl/P20dD

Standalone toolchain은 Android NDK 최근 버전부터 추가된 기능입니다. 이걸 사용하면 ndk-build 명령을 쓰지 않고 기존의 configure -> make를 사용하던 컴파일 과정을 그대로 사용해서 라이브러리를 컴파일 할 수 있습니다.

ndk를 통해서 toolchain을 빌드한다. 자세한 사항은 STANDALONE-TOOLCHAIN  참조한다.

1
2
3
4
$ {NDK}/build/tools/make-standalone-toolchain.sh \
--platform=android-8 \
–install-dir=/MYDEV/android=9-toolchain
$ export PATH=/MYDEV/android=9-toolchain/bin:$PATH

샘플 코드 컴파일 방법
test.cpp 가 있다고 가정하고

1
$ arm-linux-androideabi-g++ -o test_arm test.cpp

Makefile 을 다음과 같이 만든다.

1
2
3
4
5
6
7
8
9
10
ARM_COMPILE = arm-linux-androideabi-
CC = g++

ARM_CC = $(ARM_COMPILE)g++
ARM_INCLUDES = -I /MYDEV/android=9-toolchain/sysroot/usr/include
CFLAGS = -O2 -Wall -D_LINUX -fno-strict-aliasing -D_COLOR_LOG
BINS = test

arm:
$(ARM_CC) $(CFLAGS) -o test_arm test.cpp $(ARM_INCLUDES)

ffmpeg build

standalone toolchain을 사용한다.

ffmpeg configuration

1
export ANDROID_ROOT=/cygdrive/c/my-android-toolchain
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ANDROID_ROOT=/home/qkboo/my-android-toolchain \
./configure --target-os=linux \
--arch=arm \
--enable-cross-compile \
--cc=$ANDROID_ROOT/bin/arm-linux-androideabi-gcc \
--cross-prefix=$ANDROID_ROOT/bin/arm-linux-androideabi- \
--extra-cflags="-marm -march=armv7-a -mfloat-abi=softfp -mfpu=neon" \
--extra-ldflags="-Wl,--fix-cortex-a8" \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-network \
--disable-devices \
--disable-filters

맨 첫 줄의 ANDROID_ROOT 값은 자신이 standalone toolchain을 설치한 폴더로 수정합니다.

참고로

  • “–arch=arm”과 “–enable-cross-compile”: arm CPU 용으로 cross compile 하겠다는 옵션입니다.
  • “–cc”나 “–cross-prefix”: cross compile 할 때 사용할 compiler에 관한 정보를 줍니다.
  • “–extra-cflags”나 “–extra-ldflags”는 neon 사용할 때 쓰는 옵션입니다. (c:/android-ndk-r5b/docs/STANDALONE-TOOLCHAIN.html 참조)

나머지는 ffmpeg에서 이러이러한 기능은 빼고 컴파일 하겠다는 뜻입니다. 예를들어 network 이런 기능은 필요없겠지요?

생성된 config.h 파일을 열어봅니다.

1
2
3
4
5
6
7
8
9
10
11
#define ARCH_ARM 1

#define HAVE_ARMV5TE 1

#define HAVE_ARMV6 1

#define HAVE_ARMV6T2 1

#define HAVE_ARMVFP 1

#define HAVE_NEON 1

위와 같은 설정들이 잘 되어 있음을 확인할 수 있으실 겁니다.

config.h 파일에서 #define restrict restrict 부분을 찾아 다음과 같이 바꾼다.

1
#define restrict

X264 컴파일

http://bongjaemoon.wordpress.com/2012/05/25/ffmpeg-x264-compile-for-using-with-android-ndk-on-mac-osx/

Application.mk 작성

g:/Root/FFmpegBasic/jni 폴더에 Application.mk 파일을 만듭니다.
내용은 간단히 아래와 같이 한 줄만 작성합니다.

  1. APP_ABI := armeabi-v7a

참고:
arm architecture ARMv7-A 이상을 타겟으로 컴파일 하겠다는 옵션입니다.
arm CoretexA8 이상의 core가 이에 해당됩니다.
앞서 말씀드린대로 arm11 코어를 사용한 Optimus One, Galaxy Neo 같은 폰에서는 안 돌아가겠지요.

Android.mk 작성

http://www.viper.pe.kr/docs/make-ko/make-ko_toc.html (한글)
http://sunsite.ualberta.ca/Documentation/Gnu/make-3.79/html_chapter/make_toc.html (영문)

Android.mk 는 폴더마다 여러개를 작성해야 합니다.공통으로 사용할 common.mk 파일을 먼저 작성한 후, 각각 폴더마다 설명하겠습니다.

  • common.mk

g:/Root/FFmpegBasic/jni/ffmpeg 폴더에 common.mk 파일을 만듭니다.모든 Android.mk에서 공통으로 include 해서 사용할 파일입니다.

common.mk에서는 크게 두가지 일을 할 것입니다.1) 공통으로 사용할 컴파일 옵션을 정의합니다.2) configure를 통해 생성된 파일에서 컴파일 할 소스 파일 이름들을 읽어 저장합니다.

  1. 컴파일 옵션은 다음과 같이 한 줄이면 됩니다.

1.COMMON_CFLAGS := -DHAVE_AV_CONFIG_H -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -DPIC -std=c99 -fomit-frame-pointer -fPIC -fno-math-errno -fno-signed-zeros -fno-tree-vectorize
참고:컴파일 옵션이 복잡해 보이지만 그냥 configure에서 생성된 컴파일 옵션을 그대로 정리해 준 것 뿐입니다.

ffmpeg 폴더의 common.mak 파일을 열어보시면아래와 같은 부분이 있습니다.
1.%.o: %.c 2.$(CCDEP)
3.$(CC) $(CPPFLAGS) $(CFLAGS) $(CC_DEPFLAGS) -c $(CC_O) $<
FFmpeg 컴파일 할 때, $(CPPFLAGS) $(CFLAGS) $(CC_DEPFLAGS) 이 세 개의 매크로에 정의된 옵션들을 사용하는 것을 알 수 있습니다.

ffmpeg 폴더의 config.mak 파일을 열어보시면 이 값들이 정의되어 있습니다.

CPPFLAGS는 아래와 같습니다.
1.CPPFLAGS= -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -DPIC
이 값들은 다 사용해 줍니다.

CFLAGS는 엄청 깁니다.
1.CFLAGS= -marm -march=armv7-a -mfloat-abi=softfp -mfpu=neon  -std=c99 -fomit-frame-pointer -fPIC -marm -g -Wdeclaration-after-statement -Wall -Wno-parentheses -Wno-switch -Wdisabled-optimization -Wpointer-arith -Wredundant-decls -Wno-pointer-sign -Wcast-qual -Wwrite-strings -Wtype-limits -Wundef -Wmissing-prototypes -Wno-pointer-to-int-cast -O3 -fno-math-errno -fno-signed-zeros -fno-tree-vectorize -Werror=implicit-function-declaration -Werror=missing-prototypes
복잡해 보이지만 하나씩 차근히 보면 정리가 됩니다.
여기서 -marm -march=armv7-a -mfloat-abi=softfp -mfpu=neon -g -O3 옵션들은 다 뺍니다.우리는 Android ndk-build를 사용할 것이기 때문에 -O3 같은 최적화 관련 옵션은 지정하지 않습니다.(이것은 android build system이 알아서 해줍니다)-marm -march=armv7-a -mfloat-abi=softfp -mfpu=neon 이와 같은 cross compile관련, neon 관련 옵션도 빼줍니다.(이것은 나중에 Android.mk의 옵션으로 지정해 줄 것입니다)마지막으로 -W 로 시작하는 옵션은 warning 관련 옵션이니 그냥 다 뺍니다.

CC_DEPFLAGS는 별 것 없고 상관없는 값들입니다. 무시합니다.

추가로 subdir.mak 파일을 보시면 아래와 같은 부분이 있습니다. 1.$(OBJS) $(SUBDIR)%.ho $(SUBDIR)%-test.o $(TESTOBJS): CPPFLAGS += -DHAVE_AV_CONFIG_H
$(OBJS) 에 정의된 모든 파일에 위 조건이 해당되므로 -DHAVE_AV_CONFIG_H 도 포함합니다.

이렇게 정리하면 위에서 한 줄로 정리한 COMMON_CFLAGS 컴파일 옵션들이 나옵니다.

  1. 컴파일 할 소스 파일들을 정의

이 부분은 소스가 좀 길고 복잡하게 느껴질 수 있습니다. 하지만 역시 핵심은 간단합니다.

먼저 FFmpeg의 Makefile을 하나만 분석해 보겠습니다.
ffmpeg 폴더의 common.mak 파일을 열어보면 아래와 같은 부분이 있습니다.
1.OBJS      += $(OBJS-yes)
컴파일에 사용할 소스 파일은 OBJS 매크로와 OBJS-yes 매크로에 정의되어 있다는 것을 알 수 있습니다.
우리도 이 소스들을 컴파일 하면 되므로 똑같이 적어줍니다.

이제 OBJS 매크로에는 xxxxx.o 와 같은 object 파일들이 쭉 저장되게 됩니다.이걸 그냥 간단히 전부 xxxxx.c로 변환해서 쓰면 가장 쉽겠지만 그렇게 간단하지는 않습니다.우선 c 파일 외에도 xxxxx.S 와 같은 어셈블리 코드들이 포함되어 있고,neon 컴파일 해야하는 소스들은 xxxxx.c.neon 또는 xxxxx.S.neon 과 같이 neon 접미사를 붙여줘야 하기 때문입니다.

다행인 것은, FFmpeg 소스들을 보면 neon 컴파일 해야 하는 소스들은 모두
_neon.c 와 같이 _neon 접미사가 붙어 있어서 이것으로 구분이 가능합니다.(ffmpeg/libavcodec/arm 폴더의 파일들을 훑어 보시기 바랍니다)따라서 _neon 접미사를 검색해서 해당 접미사가 있는 소스에만 .neon을 마지막에 추가해 주면 됩니다.

위와 같은 과정을 수동으로 일일이 진행하셔도 좋지만 번거로우니 Makefile 문법을 사용해 작성해 주면 됩니다.최종적으로 컴파일 할 소스 파일들은 각각 다음 매크로에 저장할 것입니다.

C_FILES: 컴파일 할 c 파일S_FILES: 컴파일 할 S 파일NEON_C_FILES: neon 컴파일 할 c 파일NEON_S_FILES: neon 컴파일 할 S 파일FFFILES: 컴파일 할 모든 소스 파일 전부 정의

이제까지 설명한 것을 종합해서 common.mk의 전체 소스를 보여드리면 아래와 같습니다.
common.mk 파일을 다음과 같이 작성해줍니다.

01.COMMON_CFLAGS := -DHAVE_AV_CONFIG_H -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -DPIC -std=c99 -fomit-frame-pointer -fPIC -fno-math-errno -fno-signed-zeros -fno-tree-vectorize
02. 
03.OBJS += $(OBJS-yes)
04. 
05.ALL_S_FILES := $(wildcard $(LOCAL_PATH)/$(ARCH)/.S)
06.ALL_S_FILES := $(addprefix $(ARCH)/,$(notdir $(ALL_S_FILES)))
07. 
08.NEON_S_FILES := $(wildcard $(LOCAL_PATH)/$(ARCH)/
_neon.S)
09.NEON_S_FILES := $(addprefix $(ARCH)/,$(notdir $(NEON_S_FILES)))
10. 
11.NEON_C_FILES := $(wildcard $(LOCAL_PATH)/$(ARCH)/*_neon.c)
12.NEON_C_FILES := $(addprefix $(ARCH)/,$(notdir $(NEON_C_FILES)))
13. 
14.S_FILES := $(filter-out $(NEON_S_FILES),$(ALL_S_FILES))
15. 
16.C_OBJS := $(OBJS)
17.ifneq ($(S_FILES),)
18.S_OBJS := $(S_FILES:.S=.o)
19.S_OBJS := $(filter $(S_OBJS),$(C_OBJS))
20.C_OBJS := $(filter-out $(S_OBJS),$(C_OBJS))
21.else
22.S_OBJS :=
23.endif
24. 
25.ifneq ($(NEON_S_FILES),)
26.NEON_S_OBJS := $(NEON_S_FILES:.S=.o)
27.NEON_S_OBJS := $(filter $(NEON_S_OBJS),$(C_OBJS))
28.C_OBJS := $(filter-out $(NEON_S_OBJS),$(C_OBJS))
29.else
30.NEON_S_OBJS :=
31.endif
32. 
33.ifneq ($(NEON_C_FILES),)
34.NEON_C_OBJS := $(NEON_C_FILES:.c=.o)
35.NEON_C_OBJS := $(filter $(NEON_C_OBJS),$(C_OBJS))
36.C_OBJS := $(filter-out $(NEON_C_OBJS),$(C_OBJS))
37.else
38.NEON_C_OBJS :=
39.endif
40. 
41.C_FILES := $(C_OBJS:.o=.c)
42.S_FILES := $(S_OBJS:.o=.S)
43.NEON_C_FILES := $(NEON_C_OBJS:.o=.c.neon)
44.NEON_S_FILES := $(NEON_S_OBJS:.o=.S.neon)
45. 
46.FFFILES := $(sort $(NEON_S_FILES)) $(sort $(NEON_C_FILES)) $(sort $(S_FILES)) $(sort $(C_FILES))

참고:OBJS 와 OBJS-yes 매크로가 어떻게 생성되는지 보겠습니다.

ffmpeg/libavcodec 폴더의 Makefile을 열어 봅니다.
1.OBJS = allcodecs.o                                                     
2.audioconvert.o                                                  
3.avpacket.o                                                      
4.bitstream.o                                                     
5.bitstream_filter.o                                              
6.dsputil.o                                                       
위와 같은 소스를 볼 수 있습니다.이는 다시 말하면 allcodecs.c, audioconvert.c … 와 같은 소스들은 컴파일 옵션과 상관없이 무조건 컴파일 하겠다는 뜻입니다.

다음으로 아래와 같은 코드들이 이어집니다.
1.OBJS-$(CONFIG_AANDCT)                  += aandcttab.o
2.OBJS-$(CONFIG_AC3DSP)                  += ac3dsp.o
3.OBJS-$(CONFIG_CRYSTALHD)               += crystalhd.o
ffmpeg 폴더의 config.mak 파일을 열어서 CONFIG_AANDCT, CONFIG_CRYSTALHD 등을 찾아 보시면 이게 어떻게 돌아가는지 알 수 있습니다.config.mak 파일을 열어 보면 아래와 같이 되어 있습니다.
1.CONFIG_AANDCT=yes
2.!CONFIG_CRYSTALHD=yes
즉, “OBJS-$(CONFIG_AANDCT)”는 “OBJS-yes”로 변환되어 aandcttab.c 는 컴파일할 것이고,”OBJS-$(CONFIG_CRYSTALHD)”는 그렇지 않으니 crystalhd.c 는 컴파일 하지 않을 것 입니다.

이런 방법은 거의 모든 open source library에서 사용하고 있는 표준적인 방법이니 익숙해지는 것이 좋습니다.

참조

[^1]: Compiling ffmeg on macOS