使用cmake生成静态库时如何有中间编译语句

How to have an intermediate compile statement when generating a static library using cmake

我正在使用 clang 成功编译,从源代码到 IR 位码并生成静态库。我需要解决的问题是 IR 在其库内部全局名称中引用外部全局变量。我需要将这些内部全局名称修改为外部全局名称。例如,在 libc.a 中,在 LLVM 格式中:

@atoi = alias i32 (i8*), i32 (i8*)* @__GI_atoi

define hidden i32 @__GI_atoi(i8* nonnull) #0 {
  ...
  %4 call i64 @__GI_strtol(i8* %3, i8** null, i32 10) #2
  ...
}

declare hidden i64 @__GI_strtol(i8*, i8**, i32) #1

__GI_strtolatoi 模块外部,但在 libc.a 存档内部。 strtol 模块有一个 @strtol = alias ... @__GI_strtol 定义和一个名为 GI_strtol.

hidden 函数

我需要做的是在编译源文件的时候(上面例子中的atoi.c),我需要做的是:

  1. 将源文件编译为 .ll (LLVM) 格式。
  2. 将所有 not 具有关联 alias 语句的 declare hidden 转换为其外部全局值(基本上,hidden - -> dso_local__GI_**).
  3. 将生成的 .ll 文件转换为等效的 IR 位码 (.bc)。
  4. .bc 文件插入 libc.a 存档。

这可能吗?

我在 CMake 文件中有多个 add_custom_targetadd_custom_command,但是从 .c 编译到 .bc 时 none。

如果这是一个 make 构建,我会简单地添加定义以从 .c 编译到 .ll 和从 .ll 编译到 .bc,并且在最后阶段执行上述更改。

我希望能够使用 CMake 以最有效的方式执行上述步骤。我希望能够做到这一点,而不必从字面上看,add_custom_command/targets.

的 1000s

我找不到能够在编译过程中进行转换的方法。因此,我在存档本身上使用 add_custom_commandPOST_LINK。然后我处理存档中的每个条目,进行所需的转换,然后更新存档。

这是一种 get a bigger hammer 解决方案,但它有效并且不会添加 100 多个自定义目标。