背景
GCCではないコンパイラを用いるとき、configure
のオプションで--disable-dependency-tracking
を指定しなければコンパイルが通らないことがあった。
dependency tracking
が無効の場合は、依存関係にあるヘッダーファイルを変更してもCファイルがビルドされない。
tcc 0.9.25は、gcc
の-MD
/-MF
オプションがサポートされていないので、このTCC 0.9.25を用いて、dependency tracking
を有効にする方法を検討する。
環境
msys2
gcc (TCCビルド用)
tcc 0.9.25 (最新版ではない)
tccビルド
msys版gccではビルドが通らないので、mingw32版gccでビルドする
サンプルプログラム
libhelloとhelloプロジェクトのサンプルを作成する。
Makefile.am
bootstrap.sh
configure.ac
hello/Makefile.am
hello/linux/Makefile.am
hello/src/main.c
libhello/Makefile.am
libhello/linux/Makefile.am
libhello/src/hello.c
libhello/src/hello.h
ビルド手順
$ sh bootstrap.sh
$ sh configure CC=tcc
...
checking for gcc... tcc
...
checking dependency style of tcc... none
...
...
config.status: executing depfiles commands
config.status: executing libtool commands
上記のように、dependency style
がnone
と判定され、
ビルドはできるが依存関係がチェックされない。
そこで、make
の実行時に、
$ make CCDEPMODE="depmode=cpp"
とすると、cpp
を利用して依存関係を調査してくれる。
make
の実行時にその都度設定しなければならないので、他の方法がないか調査を続ける。
追記(2016-07-13):
configure.ac
に以下を追加すると、コンパイラがtcc
, depmode
がcpp
になる。
CC=tcc
am_cv_CC_dependencies_compiler_type=cpp
AC_ARG_VAR([am_cv_CC_dependencies_compiler_type])
これにより、
$ sh bootstrap.sh
$ sh configure
$ make
のように、通常のビルド手順でもコンパイラ,depmodeを指定できる。
追記:
tcc 0.9.25をx86_64でビルドするときのパッチ
diff -crp tcc-0.9.25-org/libtcc.c tcc-0.9.25/libtcc.c
*** tcc-0.9.25-org/libtcc.c 2009-05-18 23:27:06.000000000 +0900
--- tcc-0.9.25/libtcc.c 2016-07-09 15:25:11.219000000 +0900
*************** TCCState *tcc_new(void)
*** 1824,1830 ****
#ifndef TCC_TARGET_PE
/* default library paths */
tcc_add_library_path(s, CONFIG_SYSROOT "/usr/local/lib");
! tcc_add_library_path(s, CONFIG_SYSROOT "/usr/lib");
tcc_add_library_path(s, CONFIG_SYSROOT "/lib");
#endif
--- 1824,1830 ----
#ifndef TCC_TARGET_PE
/* default library paths */
tcc_add_library_path(s, CONFIG_SYSROOT "/usr/local/lib");
! tcc_add_library_path(s, CONFIG_SYSROOT "/usr/lib64");
tcc_add_library_path(s, CONFIG_SYSROOT "/lib");
#endif
diff -crp tcc-0.9.25-org/tcc.h tcc-0.9.25/tcc.h
*** tcc-0.9.25-org/tcc.h 2009-05-18 23:27:06.000000000 +0900
--- tcc-0.9.25/tcc.h 2016-07-09 15:42:39.338000000 +0900
*************** typedef int BOOL;
*** 126,132 ****
--- 126,136 ----
/* path to find crt1.o, crti.o and crtn.o. Only needed when generating
executables or dlls */
+ #if defined(TCC_TARGET_X86_64)
+ #define CONFIG_TCC_CRT_PREFIX CONFIG_SYSROOT "/usr/lib64"
+ #else
#define CONFIG_TCC_CRT_PREFIX CONFIG_SYSROOT "/usr/lib"
+ #endif
#define INCLUDE_STACK_SIZE 32
#define IFDEF_STACK_SIZE 64
diff -crp tcc-0.9.25-org/tccelf.c tcc-0.9.25/tccelf.c
*** tcc-0.9.25-org/tccelf.c 2009-05-18 23:27:06.000000000 +0900
--- tcc-0.9.25/tccelf.c 2016-07-09 15:41:49.285000000 +0900
*************** static void tcc_add_runtime(TCCState *s1
*** 1199,1205 ****
--- 1199,1209 ----
tcc_add_library(s1, "c");
#ifdef CONFIG_USE_LIBGCC
+ #if defined(TCC_TARGET_X86_64)
+ tcc_add_file(s1, CONFIG_SYSROOT "/lib64/libgcc_s.so.1");
+ #else
tcc_add_file(s1, CONFIG_SYSROOT "/lib/libgcc_s.so.1");
+ #endif
#else
snprintf(buf, sizeof(buf), "%s/%s", s1->tcc_lib_path, "libtcc1.a");
tcc_add_file(s1, buf);
*************** static char elf_interp[] = "/usr/libexec
*** 1277,1283 ****
#elif defined TCC_ARM_EABI
static char elf_interp[] = "/lib/ld-linux.so.3";
#elif defined(TCC_TARGET_X86_64)
! static char elf_interp[] = "/lib/ld-linux-x86-64.so.2";
#elif defined(TCC_UCLIBC)
static char elf_interp[] = "/lib/ld-uClibc.so.0";
#else
--- 1281,1287 ----
#elif defined TCC_ARM_EABI
static char elf_interp[] = "/lib/ld-linux.so.3";
#elif defined(TCC_TARGET_X86_64)
! static char elf_interp[] = "/lib64/ld-linux-x86-64.so.2";
#elif defined(TCC_UCLIBC)
static char elf_interp[] = "/lib/ld-uClibc.so.0";
#else