LoginSignup
2
1

More than 5 years have passed since last update.

automakeでdependency trackingを変更する

Last updated at Posted at 2016-07-01

背景

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 stylenoneと判定され、
ビルドはできるが依存関係がチェックされない。

そこで、makeの実行時に、

$ make CCDEPMODE="depmode=cpp"

とすると、cppを利用して依存関係を調査してくれる。

makeの実行時にその都度設定しなければならないので、他の方法がないか調査を続ける。

追記(2016-07-13):
configure.acに以下を追加すると、コンパイラがtcc, depmodecppになる。

configure.ac
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
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1