Improving IOS Build Time

Turtles do not judge being slow.

anonymous

Long build times can be a significant challenge, especially when working with large legacy codebases. On iOS, using Xcode to build projects that include C and C++ libraries often results in repeated recompilation of unchanged components, which wastes time and resources.

A solution to this problem is ccache, a compiler cache tool that optimizes build processes by caching the results of compilations. This approach reduces redundant work and speeds up subsequent builds. Below, we’ll explore how to set up ccache for iOS builds to improve development efficiency.

How you can resolve?

There is a library development by a group of people ccache is caching your compilers at cache as a build and faster execute entire process.

Here’s the merged and refined version of your article, incorporating the missing details and improvements from my earlier refactored article:


Stage 1: Installation

To get started, install ccache using Homebrew, a popular package manager for macOS:

brew install ccache

Once installed, verify its location on your system by running:

which ccache

This command will output the installation path of ccache on your computer.

To confirm the installation was successful and check the version, use:

ccache --version

Stage 2: Linking Libraries

ccache works by acting as a layer between your compiler and the build process, caching previously compiled results. To enable ccache for your build tools, you need to create symbolic links to the compiler binaries.

Since this requires administrative privileges, first switch to the root user:

sudo su -

Enter your macOS password when prompted. You now have the necessary permissions to make system-level changes.

Next, run the following commands to create symbolic links:

ln -s $(which ccache) /usr/local/bin/gcc
ln -s $(which ccache) /usr/local/bin/g++
ln -s $(which ccache) /usr/local/bin/cc
ln -s $(which ccache) /usr/local/bin/c++
ln -s $(which ccache) /usr/local/bin/clang
ln -s $(which ccache) /usr/local/bin/clang++

These links ensure that when tools like gcc, g++, or clang are called during the build, ccache is used first. This allows ccache to check if a cached object file can be reused, skipping unnecessary recompilation.


Stage 3: Configuring Xcode

By default, Xcode uses fully-specified paths for its compilers, which bypasses ccache. To ensure ccache is utilized during builds, modify your Podfile with a post_install hook to set Xcode to use relative paths for compilers:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings["CC"] = "clang"
      config.build_settings["CXX"] = "clang++"
      config.build_settings["LD"] = "clang"
      config.build_settings["LDPLUSPLUS"] = "clang++"
    end
  end
end

After adding this snippet, run:

pod install

This ensures ccache is integrated into your Xcode build pipeline.


Stage 4: Testing

Once everything is set up, test your build process to ensure ccache is working as expected. To check cache statistics, run:

ccache -s

This will display statistics about cache hits and misses. On the first build, you will see “misses” since the cache is empty. Subsequent builds should show “hits,” indicating that ccache is effectively reusing cached objects.


Additional Tips

1. Preserving Cache in CI: For CI environments, the first build will always be slow as the cache is empty. Use your CI provider’s caching mechanism to save and restore the ~/.ccache directory between builds for faster subsequent builds.

2. Advanced Configuration: To maximize caching for iOS builds, set the following ccache options either in your shell environment or in the ~/.ccache/ccache.conf file:

export CCACHE_SLOPPINESS=clang_index_store,file_stat_matches,include_file_ctime,include_file_mtime,ivfsoverlay,pch_defines,modules,system_headers,time_macros
export CCACHE_FILECLONE=true
export CCACHE_DEPEND=true
export CCACHE_INODECACHE=true

Alternatively, in ~/.ccache/ccache.conf:

sloppiness = clang_index_store,file_stat_matches,include_file_ctime,include_file_mtime,ivfsoverlay,pch_defines,modules,system_headers,time_macros
file_clone = true
depend_mode = true
inode_cache = true

Verify the configuration by running:

ccache -p

3. Troubleshooting: If you notice no improvement in build times or see 0 hits/misses, double-check:

  • The symbolic links are correctly pointing to ccache.
  • Xcode is configured to use relative paths for compilers.
Enable ccache debugging for further insight:

ccache --debug

Conclusion

By using ccache, you can significantly reduce build times, especially for large projects or in CI environments. While the initial setup takes some effort, the time saved on subsequent builds makes it worthwhile. If you face any issues, don’t hesitate to leave a comment for support.

Source

Check Other Posts

Leave a Reply

Your email address will not be published. Required fields are marked *

About the author

Engineering Manager of multiple projects.