Use ccache with CMake for faster compilation

C and C++ compilers aren’t the fastest pieces of software out there and there’s no lack of programmer jokes based on tedium of waiting for their work to complete.

There are ways to fix the pain though - one of them is ccache. CCache improves compilation times by caching previously built object files in private cache and reusing them when you’re recompiling same objects with same parameters. Obviously it will not help if you’re compiling the code for the first time and it also won’t help if you often change compilation flags. Most C/C++ development however involves recompiling same object files with the same parameters and ccache helps alot.

For illustration, here’s the comparison of first and subsequent compilation times of a largish C++ project:

Original run with empty cache:

Recompilation with warm cache:

Installation

CCache is available in repositories on pretty much all distributions. On OS X use homebrew:

and on Debian-based distros use apt:

CMake configuration

After ccache is installed, you need to tell CMake to use it as a wrapper for the compiler. Add these lines to your CMakeLists.txt:

Rerun cmake and next make should use ccache for wrapper.

Usage with Android NDK

CCache can even be used on Android NDK - you just need to export NDK_CCACHE environment variable with path to ccache binary. ndk-build script will automatically use it. E.g.

(Note that on Debian/Ubuntu the path will probably be /usr/bin/ccache)

CCache statistics

To see if ccache is really working, you can use ccache -s command, which will display ccache statistics:

On second and all subsequent compilations the “cache hit” values should increase and thus show that ccache is working.

参考链接


Use ccache with CMake for faster compilation

macOS Mojave(10.14.3)安装qemu

Install Homebrew:

Install qemu:

参考链接


macOS Mojave(10.14.3)编译Vulkan例子项目


编译 assimp的时候出现如下错误:

这个原因是由于代码的BUG导致的,修改~/Vulkan/xcode/assimp/assimp-mac/code/D3MFImporter.cpp230代码即可。

其他编译错误无视即可,只要能编译出 libassimp.3.3.1.dylib 即可。

修复方式如下图:
继续阅读macOS Mojave(10.14.3)编译Vulkan例子项目

macOS Mojave(10.14.3)编译使用MoltenVK运行Vulkan应用

MoltenVK是一个软件库,允许Vulkan应用程序在ApplemacOSiOS操作系统上运行在Metal之上。它是Vulkan Portability Initiative发布的第一个软件组件,该项目是在没有本地Vulkan驱动程序的平台上运行Vulkan子集的项目。

下载并编译 MoltenVK 的代码:

下载并编译 vuh 的代码:

执行测试:

参考链接


Parsing C++ in Python with Clang

macOS Mojave 10.14.2 llvm 7.0.1

参考链接


macOS Mojave(10.14.2)配置OpenVPN软件Tunnelblick 3.7.8(客户端)

我们需要在macOS Mojave (10.14.2)配置连接在OpenVPN服务器实现加密上网或者翻墙。这里我们使用在Tunnelblick 3.7.8实现我们需要的功能。
继续阅读macOS Mojave(10.14.2)配置OpenVPN软件Tunnelblick 3.7.8(客户端)

OpenCL代码编译成Vulkan代码的工具clspv

最近接到个任务,就是把OpenCL.cl代码编译成Vulkan程序。

使用Google开源的工具clspv实现这个功能即可。

编译完成后,在 bin 目录下生成 clspv 这个可执行程序。

使用的时候参考项目的文档 OpenCL C 1.2 Language on Vulkan

只是需要注意的是,如果使用了 image 类型,比如image2d_t 则需要提供 -samplermap 这个参数,这个参数指向一个文件,文件内容可能如下:

具体的定义跟在 OpenCL 中调用 read_image/write_image 函数时候指定的 sampler 参数一致即可。

参考链接


OpenCL C 1.2 Language on Vulkan

macOS Mojave(10.14.2) 编译KhronosGroup/SPIR项目的spir_12分支(llvm-3.2编译)

官方提供了一个名为 KhronosGroup/SPIR 的开源项目,支持OpenCL编译成SPIR代码的功能

注意: Vulkan使用SPIR-V也就是 spirv-1.0 分支,不使用此分支。本文实际上可以作为 llvm-3.2 在最新的 macOS Mojave(10.14.2) 上的编译指南。

这个工具使用的LLVM的版本非常古老,编译的时候问题多多。

这个工具在 macOS Mojave(10.14.2) 系统上使用 gcc 8.2.0 的编译流程如下:

如果使用 Xcode Version 10.1 (10B61) 编译会报告如下错误:

上述错误产生的原因在于 macOS 官方提供的 C++ 标准库中增加了校验 is_constructible (要求模版中的类必须明确构造函数和析构函数)这个逻辑,这个功能貌似在 C++ 14 中才加入的,显然这个校验有些操之过急了。

如果编译的时候出现如下错误信息:

则说明编译的时候,没有指定使用 macOS 官方提供的 ar , ranlib ,链接这两个程序到Xcode提供的即可。

如果编译的时候出现如下错误信息:

这是由于llvm/tools/clang/include/clang/Sema/AttributeList.h这个文件中的 ~AttributeList() LLVM_DELETED_FUNCTION; 这句话造成的,按理说这个析构函数不应该被调用到才对,但是代码中仍然有地方隐式调用了,我们需要做的就是去掉这行代码的 LLVM_DELETED_FUNCTION 属性即可。

 

编译完成后的使用方式如下:

  • <triple>: for 32 bit SPIR use spir-unknown-unknown, for 64 bit SPIR use spir64-unknown-unknown.
  • Note<OpenCL compile options> appears twice. The command line option -cl-spir-compile-options "<OpenCL compile options>" specifies the compile options that occur in the SPIR metadata.
  • <opencl_spir.h>: download opencl_spir.h from https://github.com/KhronosGroup/SPIR-Tools/blob/master/headers/opencl_spir.h
  • -O: -O0 (default) is the only tested option value at the moment. It's assumed by design that all optimizations are executed by SPIR consumer.

参考链接


macOS Mojave(10.14.2)使用"sed -i"命令时报错'sed: 1: "xxx": extra characters at the end of l command"'

最近在 macOS Mojave(10.14.2)使用"sed -i"命令时报错,类似如下:

刚刚遇到这个问题,百思不得其解。后来搜索了一下,才找到解释。

如下:

sed  -i 需要带一个字符串,用来备份源文件,这个字符串会加在源文件名后面组成备份的文件名。
如果这个字符串长度为 0,就是说是个空串,那么不备份。

这样 sed 不仅会修改文件,并且会生成一个 example.txt_nima 的备份文件。

如果不想备份修改前的内容,可以直接给个空参数,如下:

所以,上面的命令,我们需要修改成如下方式:

蛮扯淡的。

参考链接


OpenCL代码编译成Vulkan代码(SPIR-V)的工具

最近接到个任务,就是把OpenCL.cl代码编译成Vulkan程序。

请使用 OpenCL代码编译成Vulkan代码的工具clspv 实现这部分功能,官方提供的转换库,目前看来暂时没办法使用。

根据官方文档,Vulkan 1.0支持OpenCL 1.0/2.1的代码直接编译成Vulkan程序。

官方提供了一个名为 KhronosGroup/SPIR 的开源项目,支持OpenCL编译成SPIR-V代码的功能(Vulkan使用SPIR-V)。

这个工具在 macOS Mojave(10.14.2) 系统上使用 Xcode Version 10.1 (10B61) 编译流程如下:

 

编译完成后的使用方式如下:

  • <triple>: for 32 bit SPIR-V use spir-unknown-unknown, for 64 bit SPIR-V use spir64-unknown-unknown.
  • -D: to enable support for extension. e.g. -Dcl_khr_fp16 compile option will enable half support.
  • -O: -O0 (default) is the only tested option value at the moment. It's assumed by design that all optimizations are executed by SPIR-V consumer.

比如:


继续阅读OpenCL代码编译成Vulkan代码(SPIR-V)的工具