Build ROSE tools using a container
/install rose-container-tools
ROSE Container Tools
Build and run ROSE-based source code analysis tools using ROSE installed in a container.
⚠️ ALWAYS Use Makefile
Never use ad-hoc scripts or command-line compilation for ROSE tools.
- Use
Makefilefor all builds - Enables
make -jparallelism - Ensures consistent flags
- Supports
make checkfor testing
Why Container?
ROSE requires GCC 7-10 and specific Boost versions. Most modern hosts don't have these. The container provides:
- Pre-installed ROSE at
/rose/install - Correct compiler toolchain
- All dependencies configured
Quick Start
1. Start the Container
# If container exists
docker start rose-tools-dev
docker exec -it rose-tools-dev bash
# Or create new container
docker run -it --name rose-tools-dev \
-v /home/liao/rose-install:/rose/install:ro \
-v $(pwd):/work \
-w /work \
rose-dev:latest bash
2. Build with Makefile
Always use Makefile to build ROSE tools. Never use ad-hoc scripts.
# Inside container
make # Build all tools
make check # Build and test
3. Run the Tool
./build/my_tool -c input.c
Makefile (Required)
Create Makefile for your tool:
ROSE_INSTALL = /rose/install
CXX = g++
CXXFLAGS = -std=c++14 -Wall -g -I$(ROSE_INSTALL)/include/rose
LDFLAGS = -L$(ROSE_INSTALL)/lib -Wl,-rpath,$(ROSE_INSTALL)/lib
LIBS = -lrose
BUILDDIR = build
SOURCES = $(wildcard tools/*.cpp)
TOOLS = $(patsubst tools/%.cpp,$(BUILDDIR)/%,$(SOURCES))
.PHONY: all clean check
all: $(TOOLS)
$(BUILDDIR)/%: tools/%.cpp
@mkdir -p $(BUILDDIR)
$(CXX) $(CXXFLAGS) $\x3C -o $@ $(LDFLAGS) $(LIBS)
check: all
@for tool in $(TOOLS); do \
echo "Testing $$tool..."; \
LD_LIBRARY_PATH=$(ROSE_INSTALL)/lib $$tool -c tests/hello.c; \
done
clean:
rm -rf $(BUILDDIR)
Example: Identity Translator
Minimal ROSE tool that parses and unparses code:
// tools/identity.cpp
#include "rose.h"
int main(int argc, char* argv[]) {
SgProject* project = frontend(argc, argv);
if (!project) return 1;
AstTests::runAllTests(project);
return backend(project);
}
Build and run:
make
./build/identity -c tests/hello.c
# Output: rose_hello.c (unparsed)
Example: Call Graph Generator
// tools/callgraph.cpp
#include "rose.h"
#include \x3CCallGraph.h>
int main(int argc, char* argv[]) {
ROSE_INITIALIZE;
SgProject* project = new SgProject(argc, argv);
CallGraphBuilder builder(project);
builder.buildCallGraph();
AstDOTGeneration dotgen;
dotgen.writeIncidenceGraphToDOTFile(
builder.getGraph(), "callgraph.dot");
return 0;
}
Example: AST Node Counter
// tools/ast_stats.cpp
#include "rose.h"
#include \x3Cmap>
class NodeCounter : public AstSimpleProcessing {
public:
std::map\x3Cstd::string, int> counts;
void visit(SgNode* node) override {
if (node) counts[node->class_name()]++;
}
};
int main(int argc, char* argv[]) {
SgProject* project = frontend(argc, argv);
NodeCounter counter;
counter.traverseInputFiles(project, preorder);
for (auto& [name, count] : counter.counts)
std::cout \x3C\x3C name \x3C\x3C ": " \x3C\x3C count \x3C\x3C "\
";
return 0;
}
Common ROSE Headers
| Header | Purpose |
|---|---|
rose.h |
Main header (includes most things) |
CallGraph.h |
Call graph construction |
AstDOTGeneration.h |
DOT output for AST/graphs |
sageInterface.h |
AST manipulation utilities |
AST Traversal Patterns
Simple Traversal (preorder/postorder)
class MyTraversal : public AstSimpleProcessing {
void visit(SgNode* node) override {
// Process each node
}
};
MyTraversal t;
t.traverseInputFiles(project, preorder);
Top-Down with Inherited Attributes
class MyTraversal : public AstTopDownProcessing\x3Cint> {
int evaluateInheritedAttribute(SgNode* node, int depth) override {
return depth + 1; // Pass to children
}
};
Bottom-Up with Synthesized Attributes
class MyTraversal : public AstBottomUpProcessing\x3Cint> {
int evaluateSynthesizedAttribute(SgNode* node,
SynthesizedAttributesList childAttrs) override {
int sum = 0;
for (auto& attr : childAttrs) sum += attr;
return sum + 1; // Return to parent
}
};
Testing in Container
# Run from host
docker exec -w /work rose-tools-dev make check
# Or interactively
docker exec -it rose-tools-dev bash
cd /work
make && make check
Troubleshooting
"rose.h not found"
# Check include path
echo $ROSE/include/rose
ls $ROSE/include/rose/rose.h
"cannot find -lrose"
# Check library path
ls $ROSE/lib/librose.so
Runtime: "librose.so not found"
# Set library path
export LD_LIBRARY_PATH=$ROSE/lib:$LD_LIBRARY_PATH
Segfault on large files
# Increase stack size
ulimit -s unlimited
Container Reference
| Path | Contents |
|---|---|
/rose/install |
ROSE installation (headers, libs, bins) |
/rose/install/include/rose |
Header files |
/rose/install/lib |
librose.so and dependencies |
/rose/install/bin |
ROSE tools (identityTranslator, etc.) |
/work |
Mounted workspace (your code) |
- 确保已安装 OpenClaw(本地或 Docker 部署)
- 在对话框中输入安装命令:
/install rose-container-tools - 安装完成后,直接呼叫该 Skill 的名称或使用
/rose-container-tools触发 - 根据 Skill 的参数说明提供必要输入,即可获得结构化输出
Build ROSE tools using a container 是什么?
Build and run ROSE compiler tools using ROSE installed in a Docker container. Use when developing source-to-source translators, call graph analyzers, AST processors, or any tool that links against librose.so. Triggers on "ROSE tool", "callgraph", "AST traversal", "source-to-source", "build with ROSE", "librose". 它是一个面向 Claude Code / OpenClaw 的 AI Agent Skill 插件,目前累计下载 819 次。
如何安装 Build ROSE tools using a container?
在 OpenClaw 或 Claude Code 对话框中运行命令「/install rose-container-tools」即可一键安装,无需额外配置。
Build ROSE tools using a container 是免费的吗?
是的,Build ROSE tools using a container 完全免费(开源免费),可自由下载、安装和使用。
Build ROSE tools using a container 支持哪些平台?
Build ROSE tools using a container 跨平台运行,可在任意部署了 OpenClaw / Claude Code 的环境中使用(cross-platform)。
谁开发了 Build ROSE tools using a container?
由 Chunhua Liao(@chunhualiao)开发并维护,当前版本 v1.0.0。