Xcode下创建OpenWRT交叉编译项目

Xcode版本5.0.2,编译环境是OpenWRT SDK(mips-openwrt-linux-uclibc)。利用Xcoce的 “外部编译系统(External build system)”来实现在IDE中开发OpenWRT项目。

Xcode交叉编译配置

新项目和旧项目中都可以,在项目中创建目标“外部编译系统”(OS X – Other – External Build System),选择使用编译工具为“/bin/make”。

没错,需要使用Makefile系统来实现交叉编译。也许cmake也是可行的,但不做讨论。所以 后文会给出一个简单的交叉编译Makefile教程。

这么做已经足够,但是Xcode的代码补全功能只对它支持的编译目标做处理,所以还需要 一点小技巧。

修复代码补全失效

方法来自于StackOverflow上的这个页面。基本思路是,创建一个普通的“命令行” 目标(OS X – Application – Command Line Tool),名字任意,在其编译文件列表中添加 所有的代码文件。这就强制Xcode解析所有的代码文件,从而启用代码完成功能。

快,糙,猛。

如果觉得新目标生成的几个文件比较烦人,还可以删除掉编译阶段中的“复制”阶段,然后就 可以清理好项目目录了。

Makefile编写

Xcode对外部编译系统的支持,实质上是通过Makefile实现的。只要在项目目录中写好了 Makefile文件,就可以像普通项目一样使用IDE了。

所以说,可以参考任何一篇Makefile教程来编写这个文件。要实现交叉编译,就需要编写 支持自订工具链的Makefile。

下面是一个Makefile文件的模板,它会编译目录下所有的c与cpp文件。可惜的是我找不到 它的来源了,下面的是经过我修改后可以用于OpenWRT SDK工具链的版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
SDK := /Volumes/OpenWrt/trunk/staging_dir
SDKBIN := $(SDK)/toolchain-mips_34kc_gcc-4.6-linaro_uClibc-0.9.33.2/bin
export STAGING_DIR := $(SDK)
export PATH := $(SDKBIN):$(SDK)/host/bin

AR := $(SDKBIN)/mips-openwrt-linux-uclibc-ar
AS := $(SDKBIN)/mips-openwrt-linux-uclibc-as
CC := $(SDKBIN)/mips-openwrt-linux-uclibc-gcc
CXX := $(SDKBIN)/mips-openwrt-linux-uclibc-g++


program_NAME := tubed

program_C_SRCS := $(wildcard *.c)
program_CXX_SRCS := $(wildcard *.cpp)

program_C_OBJS := ${program_C_SRCS:.c=.o}
program_CXX_OBJS := ${program_CXX_SRCS:.cpp=.o}
program_OBJS := $(program_C_OBJS) $(program_CXX_OBJS)
program_INCLUDE_DIRS :=
program_LIBRARY_DIRS :=
program_LIBRARIES :=

CFLAGS += -std=$(GCC_C_LANGUAGE_STANDARD)
CPPFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir))
LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir))
LDFLAGS += $(foreach library,$(program_LIBRARIES),-l$(library))

.PHONY: all clean distclean 

all: $(program_NAME)

$(program_NAME): $(program_OBJS)
  $(LINK.cc) $(program_OBJS) -o $(program_NAME)

clean:
  @- $(RM) $(program_NAME)
  @- $(RM) $(program_OBJS)

distclean: clean

define OBJECT_DEPENDS_ON_CORRESPONDING_HEADER
  $(1) : ${1:.o=.h}
endef

  $(foreach object_file,$(program_OBJS),$(eval $(call OBJECT_DEPENDS_ON_CORRESPONDING_HEADER,$(object_file))))

至此,Xcode下的交叉编译环境已经完成。

Comments