# Makefile - ROS2 项目构建 / 测试 / 启动聚合命令 # # 设计思想: # - 用 make 聚合所有 colcon / docker / 测试命令 # - 跨平台: Linux/macOS 直接 make;Windows 用 WSL 或 Git Bash # - 默认项目: docker compose -p ros2 # # 使用: # make help # 列出所有命令 # make build # build 镜像 # make up # 启动容器 # make down # 停止容器 # make colcon-build # 容器内 build 所有包 # make colcon-test # 容器内跑所有测试 # make launch TOPIC=pubsub # make logs # make shell # ---------- 配置 ---------- DOCKER_COMPOSE = docker compose -p ros2 -f docker/docker-compose.yml CONTAINER = ros2_dev WORKSPACE = /root/ros2_ws PACKAGES = py_pubsub cpp_pubsub py_srv py_action_demo cpp_robot_tf2 py_vision_demo \ py_params cpp_custom_interface py_lifecycle_composable cpp_qos_demo py_overlay_dds \ bringup # ---------- 颜色 ---------- GREEN = \033[0;32m YELLOW = \033[1;33m RESET = \033[0m .DEFAULT_GOAL := help .PHONY: help help: ## 显示所有命令 @echo "$(GREEN)ROS2 Learning Suite - Makefile$(RESET)" @echo "" @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " $(YELLOW)%-20s$(RESET) %s\n", $$1, $$2}' # ---------- Docker ---------- .PHONY: build build: ## 构建镜像(首次 5-10min) $(DOCKER_COMPOSE) build .PHONY: up up: ## 启动容器(后台) $(DOCKER_COMPOSE) up -d .PHONY: down down: ## 停止容器 $(DOCKER_COMPOSE) down .PHONY: logs logs: ## 查看容器日志 $(DOCKER_COMPOSE) logs -f ros2 .PHONY: shell shell: ## 进入容器开发终端 $(DOCKER_COMPOSE) exec ros2 bash -lc "source $(WORKSPACE)/install/setup.bash && exec bash" .PHONY: clean clean: ## 清理构建产物(build/install/log) $(DOCKER_COMPOSE) exec ros2 bash -lc "cd $(WORKSPACE) && rm -rf build/ install/ log/" # ---------- colcon ---------- .PHONY: colcon-build colcon-build: ## 容器内 build 所有包 $(DOCKER_COMPOSE) exec $(CONTAINER) bash -lc "cd $(WORKSPACE) && source /opt/ros/humble/setup.bash && colcon build --symlink-install --packages-select $(PACKAGES)" .PHONY: colcon-test colcon-test: ## 容器内跑所有包的测试 $(DOCKER_COMPOSE) exec $(CONTAINER) bash -lc "cd $(WORKSPACE) && source /opt/ros/humble/setup.bash && colcon test --packages-select $(PACKAGES)" .PHONY: colcon-build-one colcon-build-one: ## build 单包: make colcon-build-one PKG=py_pubsub $(DOCKER_COMPOSE) exec $(CONTAINER) bash -lc "cd $(WORKSPACE) && source /opt/ros/humble/setup.bash && colcon build --symlink-install --packages-select $(PKG)" .PHONY: colcon-test-one colcon-test-one: ## 测单包: make colcon-test-one PKG=py_pubsub $(DOCKER_COMPOSE) exec $(CONTAINER) bash -lc "cd $(WORKSPACE) && source /opt/ros/humble/setup.bash && colcon test --packages-select $(PKG)" # ---------- Launch (端到端 demo) ---------- .PHONY: launch launch: ## 启动 launch: make launch NAME=pubsub_launch $(DOCKER_COMPOSE) exec $(CONTAINER) bash -lc "cd $(WORKSPACE) && source $(WORKSPACE)/install/setup.bash && ros2 launch bringup $(NAME).py" .PHONY: full-demo full-demo: ## 启动 11 节点 full_demo $(DOCKER_COMPOSE) exec $(CONTAINER) bash -lc "cd $(WORKSPACE) && source $(WORKSPACE)/install/setup.bash && ros2 launch bringup full_demo_launch.py" # ---------- venv (本机开发) ---------- .PHONY: venv-setup venv-setup: ## 本机创建 Python venv(不污染系统 Python) powershell -ExecutionPolicy Bypass -File tools/setup_venv.ps1 .PHONY: venv-activate venv-activate: ## 提示如何激活 venv @echo "运行: powershell -ExecutionPolicy Bypass -File tools/setup_venv.ps1" @echo "然后: .\\.venv\\Scripts\\Activate.ps1" # ---------- 维护 ---------- .PHONY: lint lint: ## 容器内跑 ruff + flake8(代码风格) $(DOCKER_COMPOSE) exec $(CONTAINER) bash -lc "cd $(WORKSPACE) && ruff check src/ || true" .PHONY: format format: ## 容器内跑 black(代码格式化) $(DOCKER_COMPOSE) exec $(CONTAINER) bash -lc "cd $(WORKSPACE) && black src/ || true" .PHONY: status status: ## 显示所有节点 / topic / service / action $(DOCKER_COMPOSE) exec $(CONTAINER) bash -lc "source $(WORKSPACE)/install/setup.bash && ros2 node list && ros2 topic list && ros2 service list && ros2 action list"