maya's blog

About programming, aws and ubuntu

ls コードリーディング①

やること

  1. ソースコード取得
  2. build

ソースコード取得

前回(ls コードリーディング⓪)ではmacOSlsソースコードを取得した。 恐らく最新verであろうfile_cmds-272.tar.gzをダウンロードしてgccでbuildしたけど、membershipPriv.hとか、humanize_numberがsymbol not foundとかとか。 足りないものを検索して同ディレクトリに置いて再ビルドするもそれでも何かが足りずにbuild errorになる…

違うverで試してみたところ、file_cmds-82.tar.gzではbuildがすんなり行けた。 ひとまず、今後はこれを用いるかな。

build

$ gcc --version
Apple LLVM version 10.0.0 (clang-1000.10.44.2)
Target: x86_64-apple-darwin18.0.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
$ curl -O https://opensource.apple.com/tarballs/file_cmds/file_cmds-82.tar.gz
$ tar zxvf ile_cmds-82.tar.gz
$ cd file_cmds-82/ls/
$ gcc -o ls ls.c cmp.c print.c util.c
ls.c:455:30: warning: incompatible function pointer types passing 'int (*)(const FTSENT *const *, const FTSENT *const *)' (aka 'int (*)(const struct _ftsent *const *, const struct _ftsent *const *)') to parameter of type
      'int (*)(const FTSENT **, const FTSENT **)' (aka 'int (*)(const struct _ftsent **, const struct _ftsent **)') [-Wincompatible-function-pointer-types]
            fts_open(argv, options, f_nosort ? NULL : mastercmp)) == NULL)
                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/fts.h:173:12: note: passing argument to parameter here
            int (*)(const FTSENT **, const FTSENT **)) __DARWIN_INODE64(fts_open);
                  ^
1 warning generated.
print.c:617:20: warning: field width should have type 'int', but argument has type 'size_t' (aka 'unsigned long') [-Wformat]
                        (void)printf("%*s ", width, "0B");
                                      ~~^    ~~~~~
print.c:619:20: warning: field width should have type 'int', but argument has type 'unsigned long' [-Wformat]
                        (void)printf("%*lld%c ", width - 1, bytes,
                                      ~~^~~      ~~~~~~~~~
print.c:622:19: warning: field width should have type 'int', but argument has type 'size_t' (aka 'unsigned long') [-Wformat]
                (void)printf("%*lld ", width, bytes);
                              ~~^~~    ~~~~~
3 warnings generated.
$ ./ls
Makefile                Makefile.preamble       cmp.c                   ls                      ls.c                    print.c                 util.c
Makefile.postamble      PB.project              extern.h                ls.1                    ls.h                    stat_flags.c
$

warningは出るものの、build, runできた。 (はてぶのコードハイライトでbashが対応してないのか…)