コンパイル用shell scriptを記述する。
ここではCERT Cの例題を編纂(compile)・実行する方法を検討する。shell scriptのデバッグは苦手。なるべく簡単な機能だけ使う。
最終的にはmakeを作るかもしれない。makeのデバッグはもっと苦手。全部が完成したら作成予定。
引数に関する考察
1コンパイル対象ファイル
1.1 C用 .cを付加
1.2 c++用 .cppを付加
2 複数ファイルのコンパイル
2.1 2つファイル用
2.2 3つファイル用
3 コンパイルオプションの指定
ファイル名の後に、コンパイルオプションを記述
4 実行時のオプションの記述
最後の引数は実行時に用いる
まずは、下記に掲載するプログラム用。
CERT C入門(1) Rule 01. Preprocessor (PRE)
https://qiita.com/kaizen_nagoya/items/8d2cb4158ed53d5a0a28
C言語の断片を、できれば実行結果で何か出力する処理を入れる。
コンパイルに意味があるかどうかを確かめる。
(意味のない処理がどういう記述であってもどうでもいい。)
副作用の有無を確かめるには出力するのが一番。
(出力しようとしなければ副作用が生じないこともある。)
実行結果に違いがあるかどうかを確かめる。
(コンパイラによって違うがあるような出力を試す。)
これまでに類似の作業は、「C Puzzle Book」「国際規格C、C++」「MISRA C/MISRA C++」で行ってきた。
C Puzzle Bookの有り難み5つ、C言語規格及びCコンパイラの特性を認識
https://qiita.com/kaizen_nagoya/items/d89a48c1536a02ecdec9
[C][C++]の国際規格案の例題をコンパイルするときの課題7つ。
https://qiita.com/kaizen_nagoya/items/5f4b155030259497c4de
MISRA C まとめ #include
https://qiita.com/kaizen_nagoya/items/f1a79a7cbd281607c7c9
Cコンパイル
cc pre01n.c
./a.out
実行可能に
$ chmod +x cert0.sh
+xで実行権を付与。数字を打つより間違いが少ない。
初心者向けシェルスクリプトの基本コマンドの紹介
https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337
実行
$ ./cert0.sh
$ 3 3
コンパイルして実行する
引数
引数を渡す
cc $1
./a.out
引数渡し実行
$ cert1 pre1n.c
$ 3 3
複数のコンパイラを使う
cc $1
./a.out
gcc-6 $1
./a.out
課題、2つ目のコンパイルを失敗すると、1つ目をまた実行してしまう。誤解する可能性あり。
$ cert1 pre1n.c
$ 3 3
$ 3 3
実行結果を削除する
cc $1
./a.out
rm a.out
gcc-6 $1
./a.out
rm a.out
事前の実行結果を削除
1つ目のコンパイルを失敗した場合、何かの結果を実行してしまう。
rm a.out
cc $1
./a.out
rm a.out
gcc-6 $1
./a.out
rm a.out
実行ファイルを残す
cc $1.c -o $1l
./$1l
gcc-6 $1.c -o $1g
./$1g
".c"の入力を省略できるようにした。
すごくスッキリした。
実行すると
$ cert2 pre1n
$ 3 3
$ 3 3
どちらがどちらの実行結果が間違えるといけない。
処理内容表示
echo "clang/llvm $1.c"
cc $1.c -o $1l
./$1l
gcc-6 $1.c -o $1g
./$1g
実行して見ると
$ cert2 pre1n
clang/llvm pre32n.c
3 3
gcc-6 pre32n.c
3 3
1日目のシェルスクリプト作りはこの辺まで。
のつもりでいたら、certc側で、第二引数を渡す必要があるプログラムがあり、書き換え。コンパイルエラー時には実行しないように追記。
#!/bin/sh
echo "$ clang $1.c"
cc $1.c -o $1l
if [ -e $1l ]; then
./$1l $2
fi
echo "\r"
echo "$ gcc-6 $1.c"
gcc-6 $1.c -o $1g
if [ -e $1g ]; then
./$1g $2
fi
gcc-7対応
#!/bin/sh
echo "$ clang $1.cpp"
cc $1.c -o $1l -I.
if [ -e $1l ]; then
./$1l $2
fi
echo "\r"
echo "$ gcc-7 $1.cpp"
gcc-7 $1.c -o $1g -I.
if [ -e $1g ]; then
./$1g $2
fi
gcc-7対応コンパイル対象が2つある場合
#!/bin/sh
echo "$ clang $1.c"
cc $1.c $2.c -o $1l -I.
if [ -e $1l ]; then
./$1l $3
fi
echo "\r"
echo "$ gcc-7 $1.c"
gcc-7 $1.c $2.c -o $1g -I.
if [ -e $1l ]; then
./$1l $3
fi
gcc-7対応コンパイル対象が3つある場合
#!/bin/sh
echo "$ clang $1.c"
cc $1.c $2.c $3.c -o $1l -I.
if [ -e $1l ]; then
./$1l $4
fi
echo "\r"
echo "$ gcc-7 $1.c"
gcc-7 $1.c $2.c $3.c -o $1g -I.
if [ -e $1g ]; then
./$1g $4
fi
C++用作成
#!/bin/sh
echo "$ clang++ $1.cpp"
clang++ $1.cpp -o $1l
if [ -e $1l ]; then
./$1l $2
fi
echo "\r"
echo "$ g++-6 $1.cpp"
g++-6 $1.cpp -o $1g
if [ -e $1g ]; then
./$1g $2
fi
g++-7対応
#!/bin/sh
echo "$ clang++ $1.cpp"
clang++ $1.cpp -o $1l
if [ -e $1l ]; then
./$1l $2
fi
echo "\r"
echo "$ g++-7 $1.cpp"
g++-7 $1.cpp -o $1g
if [ -e $1g ]; then
./$1g $2
fi
-std=c++17 追記
#!/bin/sh
echo "$ clang++ $1.cpp"
clang++ $1.cpp -std=c++17 -o $1l
if [ -e $1l ]; then
./$1l $2
fi
echo "\r"
echo "$ g++-7 $1.cpp"
g++-7 $1.cpp -std=c++17 -o $1g
if [ -e $1g ]; then
./$1g $2
fi
-Wallをつけた。一通りコンパイルしてみた。改良点を探すために-Wallの警告を順次確認。
#!/bin/sh
echo "$ clang++ $1.cpp -std=c++17 -Wall"
clang++ $1.cpp -std=c++17 -Wall -o $1l
if [ -e $1l ]; then
./$1l $2
fi
echo "\r"
echo "$ g++-7 $1.cpp -std=c++17 -Wall"
g++-7 $1.cpp -std=c++17 -Wall -o $1g
if [ -e $1g ]; then
./$1g $2
fi
-trigraph用にコンパイルオプションを記述できるようにした版(c++2011用)
#!/bin/sh
echo " usege ./cppwa11.sh prog option msg"
echo "$ clang++ $1.cpp $2 -std=c++11 -Wall"
clang++ $1.cpp -std=c++11 $2 -Wall -o $1l
if [ -e $1l ]; then
./$1l $3
fi
echo "\r"
echo "$ g++-7 $1.cpp $2 -std=c++11 -Wall"
g++-7 $1.cpp -std=c++11 $2 -Wall -o $1g
if [ -e $1g ]; then
./$1g $3
fi
C++N4910用に -std=C++2b 版作成
#!/bin/sh
if [ -e $1l ]; then
rm $1l
fi
if [ -e $1g ]; then
rm $1g
fi
echo "$ clang++ $1.cpp -std=03 -o $1l -I. -Wall"
clang++ $1.cpp -std=c++03 -o $1l -I. -Wall
if [ -e $1l ]; then
./$1l
fi
if [ -e $1l ]; then
rm $1l
fi
echo "$ clang++ $1.cpp -std=2b -o $1l -I. -Wall"
clang++ $1.cpp -std=c++2b -o $1l -I. -Wall
if [ -e $1l ]; then
./$1l
fi
echo "\r"
echo "$ g++ $1.cpp -std=03 -o $1g -I. -Wall"
g++ $1.cpp -std=c++03 -o $1g -I. -Wall
if [ -e $1g ]; then
./$1g
fi
if [ -e $1g ]; then
rm $1g
fi
echo "\r"
echo "$ g++ $1.cpp -std=2b -o $1g -I. -Wall"
g++ $1.cpp -std=c++2b -o $1g -I. -Wall
if [ -e $1g ]; then
./$1g
fi
利用方法
./cppwa11 cpp2011-2-4 -trigraph
#!/bin/sh
echo "$ clang++ $1.cpp -std=c++03 -Wall"
clang++ $1.cpp -std=c++03 -Wall -o $1l03
if [ -e $1l03 ]; then
./$1l03 $2
fi
echo "$ clang++ $1.cpp -std=c++11 -Wall"
clang++ $1.cpp -std=c++11 -Wall -o $1l11
if [ -e $1l11 ]; then
./$1l11 $2
fi
echo "$ clang++ $1.cpp -std=c++17 -Wall"
clang++ $1.cpp -std=c++17 -Wall -o $1l17
if [ -e $1l17 ]; then
./$1l17 $2
fi
echo "\r"
echo "$ g++-7 $1.cpp -std=c++03 -Wall"
g++-7 $1.cpp -std=c++03 -Wall -o $1g03
if [ -e $1g03 ]; then
./$1g03 $2
fi
echo "\r"
echo "$ g++-7 $1.cpp -std=c++11 -Wall"
g++-7 $1.cpp -std=c++11 -Wall -o $1g11
if [ -e $1g11 ]; then
./$1g11 $2
fi
echo "\r"
echo "$ g++-7 $1.cpp -std=c++17 -Wall"
g++-7 $1.cpp -std=c++17 -Wall -o $1g17
if [ -e $1g17 ]; then
./$1g17 $2
fi
docker用に追記
#!/bin/sh
echo "$ clang++ $1.cpp -std=c++03 -Wall"
clang++ $1.cpp -std=c++03 -lc++ -I/usr/local/include/c++/7.3.0 -I/usr/local/include/c++/7.3.0/x86_64-linux-gnu -Wall -o $1l03
if [ -e $1l03 ]; then
./$1l03 $2
fi
echo "$ clang++ $1.cpp -lc++ -std=c++11 -Wall"
clang++ $1.cpp -std=c++11 -lc++ -I/usr/local/include/c++/7.3.0 -I/usr/local/include/c++/7.3.0/x86_64-linux-gnu -Wall -o $1l11
if [ -e $1l11 ]; then
./$1l11 $2
fi
echo "$ clang++ $1.cpp -lc++ -std=c++17 -Wall"
clang++ $1.cpp -std=c++17 -lc++ -I/usr/local/include/c++/7.3.0 -I/usr/local/include/c++/7.3.0/x86_64-linux-gnu -Wall -o $1l17
if [ -e $1l17 ]; then
./$1l17 $2
fi
echo "\r"
echo "$ g++ $1.cpp -std=c++03 -Wall"
g++ $1.cpp -std=c++03 -Wall -o $1g03
if [ -e $1g03 ]; then
./$1g03 $2
fi
echo "\r"
echo "$ g++ $1.cpp -std=c++11 -Wall"
g++ $1.cpp -std=c++11 -Wall -o $1g11
if [ -e $1g11 ]; then
./$1g11 $2
fi
echo "\r"
echo "$ g++ $1.cpp -std=c++17 -Wall"
g++ $1.cpp -std=c++17 -Wall -o $1g17
if [ -e $1g17 ]; then
./$1g17 $2
fi
-std=c++14を追加した版
#!/bin/sh
echo "$ clang++ $1.cpp -std=c++03 -Wall"
clang++ $1.cpp -std=c++03 -I=. -Wall -o $1l03
if [ -e $1l03 ]; then
./$1l03 $2
fi
echo "$ clang++ $1.cpp -std=c++11 -Wall"
clang++ $1.cpp -std=c++11 -I=. -Wall -o $1l11
if [ -e $1l11 ]; then
./$1l11 $2
fi
echo "$ clang++ $1.cpp -std=c++14 -Wall"
clang++ $1.cpp -std=c++14 -I=. -Wall -o $1l14
if [ -e $1l14 ]; then
./$1l14 $2
fi
echo "$ clang++ $1.cpp -std=c++17 -Wall"
clang++ $1.cpp -std=c++17 -I=. -Wall -o $1l17
if [ -e $1l17 ]; then
./$1l17 $2
fi
echo "\r"
echo "$ g++-7 $1.cpp -std=c++03 -Wall"
g++-7 $1.cpp -std=c++03 -I=. -Wall -o $1g03
if [ -e $1g03 ]; then
./$1g03 $2
fi
echo "\r"
echo "$ g++-7 $1.cpp -std=c++11 -Wall"
g++-7 $1.cpp -std=c++11 -I=. -Wall -o $1g11
if [ -e $1g11 ]; then
./$1g11 $2
fi
echo "\r"
echo "$ g++-7 $1.cpp -std=c++14 -Wall"
g++-7 $1.cpp -std=c++14 -I=. -Wall -o $1g14
if [ -e $1g14 ]; then
./$1g14 $2
fi
echo "\r"
echo "$ g++-7 $1.cpp -std=c++17 -Wall"
g++-7 $1.cpp -std=c++17 -I=. -Wall -o $1g17
if [ -e $1g17 ]; then
./$1g17 $2
fi
C++N4741はclang++ -std=c++2a
のc1.shでコンパイルエラーを確認。
cpla.shで2つのコンパイラの合計5つのオプション
#!/bin/sh
echo "$ clang++ $1.cpp -std=c++2a -Wall"
clang++ $1.cpp -std=c++2a -I=. -Wall -o $1l2a
if [ -e $1l2a ]; then
./$1l2a $2
rm $1l2a
fi
コンパイル対象が2つの場合
#!/bin/sh
echo "$ clang++ $1.cpp $2.cpp -std=c++2a -Wall"
clang++ $1.cpp $2.cpp -std=c++2a -I=. -Wall -o $1l2a
if [ -e $1l2a ]; then
./$1l2a $3
rm $1l2a
fi
#!/bin/sh
echo "$ clang++ $1.cpp $2.cpp $3.cpp -std=c++2a -Wall"
clang++ $1.cpp $2.cpp $3.cpp -std=c++2a -I=. -Wall -o $1l2a
if [ -e $1l2a ]; then
./$1l2a $4
rm $1l2a
fi
2種類のコンパイラ、合計5種類のスイッチ
#!/bin/sh
echo "$ clang++ $1.cpp -std=c++03 -Wall"
clang++ $1.cpp -std=c++03 -I=. -Wall -o $1l03
if [ -e $1l03 ]; then
./$1l03 $2
fi
echo "$ clang++ $1.cpp -std=c++17 -Wall"
clang++ $1.cpp -std=c++17 -I=. -Wall -o $1l17
if [ -e $1l17 ]; then
./$1l17 $2
fi
echo "$ clang++ $1.cpp -std=c++2a -Wall"
clang++ $1.cpp -std=c++2a -I=. -Wall -o $1l2a
if [ -e $1l2a ]; then
./$1l2a $2
fi
echo "\r"
echo "$ g++-7 $1.cpp -std=c++03 -Wall"
g++-7 $1.cpp -std=c++03 -I=. -Wall -o $1g03
if [ -e $1g03 ]; then
./$1g03 $2
fi
echo "\r"
echo "$ g++-7 $1.cpp -std=c++17 -Wall"
g++-7 $1.cpp -std=c++17 -I=. -Wall -o $1g17
if [ -e $1g17 ]; then
./$1g17 $2
fi
#!/bin/sh
echo "$ clang++ $1.cpp $2.cpp -std=c++03 -Wall"
clang++ $1.cpp $2.cpp -std=c++03 -I=. -Wall -o $1l03
if [ -e $1l03 ]; then
./$1l03 $3
fi
echo "$ clang++ $1.cpp $2.cpp -std=c++17 -Wall"
clang++ $1.cpp $2.cpp -std=c++17 -I=. -Wall -o $1l17
if [ -e $1l17 ]; then
./$1l17 $3
fi
echo "$ clang++ $1.cpp $2.cpp -std=c++2a -Wall"
clang++ $1.cpp $2.cpp -std=c++2a -I=. -Wall -o $1l2a
if [ -e $1l2a ]; then
./$1l2a $3
fi
echo "\r"
echo "$ g++-7 $1.cpp $2.cpp -std=c++03 -Wall"
g++-7 $1.cpp $2.cpp -std=c++03 -I=. -Wall -o $1g03
if [ -e $1g03 ]; then
./$1g03 $3
fi
echo "\r"
echo "$ g++-7 $1.cpp $2.cpp -std=c++17 -Wall"
g++-7 $1.cpp $2.cpp -std=c++17 -I=. -Wall -o $1g17
if [ -e $1g17 ]; then
./$1g17 $3
fi
#!/bin/sh
echo "$ clang++ $1.cpp $2.cpp $3.cpp -std=c++03 -Wall"
clang++ $1.cpp $2.cpp $3.cpp -std=c++03 -I=. -Wall -o $1l03
if [ -e $1l03 ]; then
./$1l03 $4
fi
echo "$ clang++ $1.cpp $2.cpp $3.cpp -std=c++17 -Wall"
clang++ $1.cpp $2.cpp $3.cpp -std=c++17 -I=. -Wall -o $1l17
if [ -e $1l17 ]; then
./$1l17 $4
fi
echo "$ clang++ $1.cpp $2.cpp $3.cpp -std=c++2a -Wall"
clang++ $1.cpp $2.cpp $3.cpp -std=c++2a -I=. -Wall -o $1l2a
if [ -e $1l2a ]; then
./$1l2a $4
fi
echo "\r"
echo "$ g++-7 $1.cpp $2.cpp $3.cpp -std=c++03 -Wall"
g++-7 $1.cpp $2.cpp $3.cpp -std=c++03 -I=. -Wall -o $1g03
if [ -e $1g03 ]; then
./$1g03 $4
fi
echo "\r"
echo "$ g++-7 $1.cpp $2.cpp $3.cpp -std=c++17 -Wall"
g++-7 $1.cpp $2.cpp $3.cpp -std=c++17 -I=. -Wall -o $1g17
if [ -e $1g17 ]; then
./$1g17 $4
fi
整形台本
#!/bin/bash
astyle -s2 -c -N < $1.cpp > $1s2.cpp
cat $1s2.cpp
参考資料
CERT CPP入門(1) Rule 01. Declarations and Initialization (DCL)
https://qiita.com/kaizen_nagoya/items/61b3c431756fe8e6af3e
Linux初心者のシェルスクリプト入門
https://qiita.com/lrf141/items/6c01d2f7afff79cd7286
ShellScriptでよく使う表現
https://qiita.com/rotocuir/items/986e8ee732730606622b
自己参照
C++ Support(0)
https://qiita.com/kaizen_nagoya/items/8720d26f762369a80514
Coding Rules(0) C Secure , MISRA and so on
https://qiita.com/kaizen_nagoya/items/400725644a8a0e90fbb0
Ethernet 記事一覧 Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794
Wireshark 一覧 wireshark(0)、Ethernet(48)
https://qiita.com/kaizen_nagoya/items/fbed841f61875c4731d0
線網(Wi-Fi)空中線(antenna)(0) 記事一覧(118/300目標)
https://qiita.com/kaizen_nagoya/items/5e5464ac2b24bd4cd001
OSEK OS設計の基礎 OSEK(100)
https://qiita.com/kaizen_nagoya/items/7528a22a14242d2d58a3
Error一覧(C/C++, python, bash...) Error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8
なぜdockerで機械学習するか 書籍・ソース一覧作成中 (目標100)
https://qiita.com/kaizen_nagoya/items/ddd12477544bf5ba85e2
言語処理100本ノックをdockerで。python覚えるのに最適。:10+12
https://qiita.com/kaizen_nagoya/items/7e7eb7c543e0c18438c4
プログラムちょい替え(0)一覧:4件
https://qiita.com/kaizen_nagoya/items/296d87ef4bfd516bc394
TOPPERSまとめ #名古屋のIoTは名古屋のOSで
https://qiita.com/kaizen_nagoya/items/9026c049cb0309b9d451
docker(0) 資料集
https://qiita.com/kaizen_nagoya/items/45699eefd62677f69c1d
Qiita-dockerお宝鑑定団
https://qiita.com/kaizen_nagoya/items/509e125263559b5aed5b
The C++ Standard Library: clang++とg++でコンパイルしてみた(まとめ):14件
https://qiita.com/kaizen_nagoya/items/9bdfaa392443d13e5759
C++17 - The Complete Guide clang++とg++でコンパイルしてみた(まとめ):4件
https://qiita.com/kaizen_nagoya/items/c000f307e642990781e1
C++N3242, 2011, ISO/IEC 14882, C++ standard(1) Example code compile list
https://qiita.com/kaizen_nagoya/items/685b5c1a2c17c1bf1318
C++N4606 Working Draft 2016, ISO/IEC 14882, C++ standard(1) Example code compile list
https://qiita.com/kaizen_nagoya/items/df5d62c35bd6ed1c3d43/
C++N4741, 2018 Standard Working Draft on ISO/IEC 14882 sample code compile list
https://qiita.com/kaizen_nagoya/items/3294c014044550896010
C++N4910:2022 Standard Working Draft on ISO/IEC 14882(0) sample code compile list
https://qiita.com/kaizen_nagoya/items/fc957ddddd402004bb91
Autosar Guidelines C++14 example code compile list(1-169)
https://qiita.com/kaizen_nagoya/items/8ccbf6675c3494d57a76
プログラマによる、プログラマのための、統計と確率のプログラミングとその後 統計と確率一覧(0)
https://qiita.com/kaizen_nagoya/items/6e9897eb641268766909
プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945
一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39
<この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。>
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.
文書履歴(document history)
ver. 0.10 初版 20180320
ver. 0.11 第二引数渡し 20180321
ver. 0.12 C++版追記 20180322
ver. 0.13 gcc-7対応追記 20180407
ver. 0.14 echo "\r"、prompt表記 echo "$"追記。20180407
ver. 0.15 コンパイル対象ファイル2つ版、3つ版 20180407
ver. 0.16 "-I."追記。カレントディレクトリのヘッダファイルを<>include可能に 20180407
ver. 0.17 g++-7対応 20180408
ver. 0.18 コンパイルエラー時に実行しない設定追記。
"if [ -e x ]; then" "x" "fi"
ver. 0.19 -std=c++17 版 20180415
ver. 0.20 -Wallをつけた。20180423
ver. 0.21 # -trigraph用にコンパイルオプションを記述できるようにした版(c++2011用)20180424
ver. 0.22 -std=c++03, -std=c++11, -std=c++17の3種類でコンパイルする記述追記 20180424
ver. 0.23 N4606 Annex C(informative) Compatibility のため-std=c++14を追加した版を追記 20180503
ver. 0.24 N4741 でclang++ -std=c++2aだけ使うスクリプトと、2aを含めた5種類のスクリプトのファイルが1つ、2つ、3つ版 20180507
ver. 0.30 整形台本追記 20180524
ver. 0.31 C++N4910用に -std=C++2b 版作成 追記 20220614
ver. 0.32 上記スクリプト加筆 20220722
最後までおよみいただきありがとうございました。
いいね 💚、フォローをお願いします。
Thank you very much for reading to the last sentence.
Please press the like icon 💚 and follow me for your happy life.