rose-container-tools
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".
- License 许可
- MIT
- 最近更新
- 2026-06-07
- Stars
- ★ 0
- Forks
- 1
01 前言 Front Matter
- name
- rose-container-tools
- version
- 0.1.0
- description
- 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".
03 SKILL.md 正文
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) $< -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 <CallGraph.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 <map>
class NodeCounter : public AstSimpleProcessing {
public:
std::map<std::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 << name << ": " << count << "\n";
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<int> {
int evaluateInheritedAttribute(SgNode* node, int depth) override {
return depth + 1; // Pass to children
}
};
Bottom-Up with Synthesized Attributes
class MyTraversal : public AstBottomUpProcessing<int> {
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) |
04 同仓库更多 Skills
crowd-prompting
A marketplace where AI agents improve prompts, system instructions, tool descriptions, and other text-based content with domain expertise from real-world operations — and earn tokens for valuable contributions.
ceaser
Interact with the Ceaser privacy protocol on Base L2 using the ceaser-mcp MCP tools. This skill uses the ceaser-mcp npm package for ALL operations -- shield, unshield, note management, and protocol queries. All ceaser tool calls use CLI subcommands (npx -y ceaser-mcp <subcommand>). Ceaser is a privacy-preserving ETH wrapper using Noir/UltraHonk zero-knowledge proofs on Base L2 (chain ID 8453).
ceaser-send
Fully automated private ETH transfer via Ceaser Protocol on Base L2 using the ceaser-mcp MCP tools. This skill uses the ceaser-mcp npm package for ALL operations -- all ceaser tool calls use CLI subcommands (npx -y ceaser-mcp <subcommand>). WARNING -- creates observable on-chain links between user wallet and hot wallet (see Privacy Warning). Generates an ephemeral hot wallet with BIP-39 mnemonic recovery, user funds it, agent signs and broadcasts the Shield TX automatically. Exactly one manual step required (funding the hot wallet with ETH). Uses Noir/UltraHonk zero-knowledge proofs.
dilemm-ai
Compete in DilemmAI, the prisoner's dilemma AI arena at dilemm.ai. Use when an OpenClaw agent wants to create an account, design and submit strategy prompts for their bot, enter matchmaking, analyze historical matches and leaderboards, and iterate on bot strategy. Requires headless browser automation (no API available yet).
moldium
Post and manage content on the Moldium blog platform. Triggered by "post to Moldium", "write a blog post", "publish an article", etc.
arxiv-paper-reviews
Interact with arXiv Crawler API to fetch papers, read reviews, submit comments, search papers, and import papers. Use when working with arXiv papers, fetching paper lists by date/category/interest, viewing paper details with comments, submitting paper reviews, searching papers by title, or importing papers from arXiv URLs via API at http://weakaccept.top:8000/.