C言語のビルドプロセスから理解する"./configure", "make" ,"make install"
Kakasiのインストールをしていて、 そういえば./configure
, make
,make install
って何しているのかちゃんと分かってないなあと思ったので調べたことをまとめた。
C言語本格入門 ~基礎知識からコンピュータの本質までを参考にさせて頂きました。
前提知識
C言語のソースコードはそのままでは実行できない
[種田元樹 (2018) . C言語本格入門 ~基礎知識からコンピュータの本質まで 技術評論社 図1-7より引用]
ビルドとは何か
C言語の移植性
Cランタイムとlibc
- C言語のソースコードを実行する環境の差異を吸収する
- CランタイムはC言語で書かれたプログラムを実行するための情報を持つファイル
- libcはC言語で書かれたプログラムを実行するためのライブラリ
- 実行ファイル=機械語のファイル+Cランタイム+libc
Q&A
Q. ./configure
すると何が起こるのか?
- 実行環境の情報を元にMakefileを作成する
Q. なぜ ./configure
する必要があるのか?
- C言語の移植性はCランタイムやlibcによって担保されているから
Q. make
すると何が起こるのか?
- ソースコードのビルドが行われる
Q. なぜmake
する必要があるのか?
- ソースコードの実行ファイルを生成しないとプログラムを実行できないから
Q. make install
すると何が起こるのか?
- makeで生成された実行ファイルをインストールする (指定のディレクトリにコピー)
Q. なぜmake install
する必要があるのか?
- 対象の実行ファイルを呼び出しやすくするため
参考
peeコマンドについて混乱したので調べた(シェルスクリプト)
環境
混乱
- 【問題と解答】jus共催 第37回シェル芸bot生きてるかどうか分からないけどシェル芸bot向けシェル芸勉強会 | 上田ブログのQ8の解答を読んでいて混乱した
$ matsuya | pee cat "grep -o ." rev んどうーレカニミ ミニカレーうどん ミ ニ カ レ ー う ど ん
- シェルスクリプトって
pee cat "grep -o ." rev
みたいにコマンドを並べられるんだっけ? - そもそも
pee
を初めて見た。pee
とは?
pee
tee
の出力先がパイプになったコマンド。パイプだからt→pなのかも。
SYNOPSIS pee [--[no-]ignore-sigpipe] [--[no-]ignore-write-errors] [["command"...]]
tee
はこんな感じで引数に複数のファイルを指定できる。
$ echo foo | tee bar.txt baz.txt $ cat bar.txt foo $ cat baz.txt foo
- つまり
pee
も引数として複数のコマンドを指定できる...?
$ echo foo | pee cat cat cat foo foo foo
- おお、やはり。
- ということで最初のワンライナーを見返してみる。これは
pee
の引数のコマンドに共通の標準入力を与えているものなのか。
$ matsuya | pee cat "grep -o ." rev
オプション付きコマンドの場合
"grep -o ."
のダブルクォートはもしかするとコマンドにオプションを付けるときに必要なのかも...?- 試しに下記を実行してみる
$ echo foo | pee cat cat "cat -n" foo foo 1 foo
- 最後の
cat
だけ行番号付きで出力された。 - やっぱりコマンドにオプションを指定するときはダブルクォートで囲ってあげる必要があるということみたい。
- 考えてみれば、シェルスクリプトでは半角スペースが引数の区切りとして解釈されてしまうし仕方ない。
出力順
pee
の引数に指定されたコマンドは先頭から順に終了するとは限らない。- 実際、最初に示した例では
rev
→cat
→"grep -o ."
の順に標準出力に書き込まれている。 - 何度か試すと時々順序が入れ替わる様子が観察できたので固定の出力が得られることは期待できないみたい。
pee
を親とした子プロセスがforkされて個々のコマンドが並行(コンカレント)に実行されているから...だと思う (違っていたらすまん)
xcode-select --installに失敗した
xcode-select --install
に失敗したのでXcode Command Line ToolsをApple公式サイトからダウンロードして解決したというお話。
環境
事象
gsedをsedとして呼び出せるようにしようと思いオプション付きでインストール実行。
$ brew install gnu-sed --with-default-names Error: The following formula gnu-sed cannot be installed as binary package and must be built from source. Install the Command Line Tools: xcode-select --install
なぜか失敗した。このオプションはソースコードのビルドが必要なことがエラーと何か関係していそうではある。
とりあえず指示されたコマンドを実行してみる。
$ xcode-select --install xcode-select: note: install requested for command line developer tools
すると以下の内容のポップアップウィンドウが表示されてダウンロードに失敗した。
xcode このソフトウェアは、現在ソフトウェア・アップデート・サーバから入手できないため、インストールできません。
解決策
- Xcode Command Line ToolsはApple公式サイトからも取得することが出来る。
- More Downloads for Apple Developersで
Command Line Tools
と検索 - 自分の環境のOSとXcodeのバージョンの組み合わせに一致するものを選択してダウンロード後にインストール。
インストール成功後に再度コマンドを実行する。
$ brew install gnu-sed --with-default-names ==> Downloading https://ftp.gnu.org/gnu/sed/sed-4.5.tar.xz ######################################################################## 100.0% ==> ./configure --prefix=/usr/local/Cellar/gnu-sed/4.5 ==> make install 🍺 /usr/local/Cellar/gnu-sed/4.5: 10 files, 528.5KB, built in 2 minutes 18 seconds
今度は成功。めでたい。
原因不明
$ xcode-select --install
が失敗する理由はよく分からない...
参考
VSCodeでシェルスクリプト(bash)の開発環境を整える
シェル芸勉強会の過去問演習を再開したいなぁと思ったので、まずは環境を整えてみる。
環境
インストールした拡張
-
- シンタックスハイライト
- この拡張をインストールするだけで動作する
"configurations": [ { "type": "bashdb", "request": "launch", "name": "Bash-Debug (select script from list of sh files)", "cwd": "${workspaceFolder}", "program": "${command:SelectScriptName}", "args": [] },
$ npm i -g bash-language-server
結果
コマンドをホバーするとmanがポップアップ
括弧の閉じ忘れ等の構文エラーが指摘される
シェルスクリプトやっていきましょう
IE11で文字列からDOM Nodeを生成・取得したい
業務で苦戦したことがあったのでまとめ
環境
- IE(11.345)
やりたいこと
- 文字列からDOM Nodeを生成してJavaScriptで取得したい
- どんな要素でも文字列から生成できて欲しい
<template>
要素にブラウザが対応している場合は下記の方法で生成と取得が可能- ただしIE11は
<template>
要素に対応していない
- ただしIE11は
function htmlToElements(html) { var template = document.createElement('template'); template.innerHTML = html; return template.content.childNodes; } var rows = htmlToElements('<tr><td>foo</td></tr><tr><td>bar</td></tr>');
Creating a new DOM element from an HTML string using built-in DOM methods or Prototypeより引用
div.innerHTMLではダメなのか
上記のStackOverflowにも書かれているが
<td>
要素は親に<tr>
要素しか持てない(<div>
はダメ)などの制限が要素によって存在する- 親要素の制限については、例えば
<td>
なら4.9.9 The td elementのContexts in which this element can be usedに記載がある
- 親要素の制限については、例えば
<tr>
要素を用意してtr.innerHTML
する手もあるにはあるが...
IE11ではどうするか
<template>
要素にブラウザが対応していない場合
ライブラリを使う
- 素直な方法
jQuery(3.3.1)
var node = $( "<td>hoge</td>" );
Dojo(1.10)
- 今もDojoを使っている人がいるかは分からないけど...
var node = domConstruct.toDom("<td>hoge</td>");
その他
insertAdjacentHTML()
- ライブラリではなくWebAPI標準
- 親要素が必要なのでinnerHTMLと本質的には一緒だと思う
- 詳細はElement.insertAdjacentHTML() - Web APIs | MDNを参照
var parent = document.getElementById('hoge'); parent.insertAdjacentHTML('afterbegin', '<td>hoge</td>');
結論
- ライブラリはマルチブラウザ対応を考える場合はやはり強い...
macOS Mojave(10.14)にアップグレード後にVSCodeのフォントが変になる事象を解決する方法
macOSをMojave(10.14)にアップグレードしてVSCodeを起動したら文字が変になっていて困った。
環境
事象
解決方法
- ターミナルを起動し下記を実行すると直る
- 原因についての詳細は参考のIssueを参照(私はあまりよく分かってない)
$ defaults write -g CGFontRenderingFontSmoothingDisabled -bool NO
- 元に戻したい場合はNO→YESにして実行
$ defaults write -g CGFontRenderingFontSmoothingDisabled -bool YES
結果
- before
- after
とりあえず直ってよかった