首先我们通过内置的工程模板创建一个空工程:
$?xmake?create?-P?./hello create?hello?... create?ok!
这个时候xmake将会产生一些工程文件,如下:
$?cd?./hello $?tree?. . ├──?src │???└──?main.c └──?xmake.lua
这个简单的程序仅仅只是为了打印输出: hello xmake!
$?cat?./src/main.c?
#includeint?main(int?argc,?char**?argv)
{????printf("hello?xmake!\n");????return?0;
}xmake.lua是基于lua语法的工程描述文件,它很简单:
$?cat?xmake.lua?
target("hello")
????set_kind("binary")
????add_files("src/*.c")现在我们开始编译这个程序
$?xmake
checking?for?the?architecture?...?x86_64
checking?for?the?Xcode?SDK?version?for?macosx?...?10.11checking?for?the?target?minimal?version?...?10.11checking?for?the?c?compiler?(cc)?...?xcrun?-sdk?macosx?clang
checking?for?the?c++?compiler?(cxx)?...?xcrun?-sdk?macosx?clang
checking?for?the?objc?compiler?(mm)?...?xcrun?-sdk?macosx?clang
checking?for?the?objc++?compiler?(mxx)?...?xcrun?-sdk?macosx?clang++
checking?for?the?assember?(as)?...?xcrun?-sdk?macosx?clang
checking?for?the?linker?(ld)?...?xcrun?-sdk?macosx?clang++
checking?for?the?static?library?archiver?(ar)?...?xcrun?-sdk?macosx?ar
checking?for?the?static?library?extractor?(ex)?...?xcrun?-sdk?macosx?ar
checking?for?the?shared?library?linker?(sh)?...?xcrun?-sdk?macosx?clang++
checking?for?the?swift?compiler?(sc)?...?xcrun?-sdk?macosx?swiftc
checking?for?the?debugger?(dd)?...?xcrun?-sdk?macosx?lldb
configure
{
????ex?=?"xcrun?-sdk?macosx?ar",???ccache?=?"ccache",???plat?=?"macosx",???ar?=?"xcrun?-sdk?macosx?ar",???buildir?=?"build",???as?=?"xcrun?-sdk?macosx?clang",???sh?=?"xcrun?-sdk?macosx?clang++",???arch?=?"x86_64",???mxx?=?"xcrun?-sdk?macosx?clang++",???xcode_dir?=?"/Applications/Xcode.app",???target_minver?=?"10.11",???sc?=?"xcrun?-sdk?macosx?swiftc",???mode?=?"release",???make?=?"make",???cc?=?"xcrun?-sdk?macosx?clang",???host?=?"macosx",???dd?=?"xcrun?-sdk?macosx?lldb",???kind?=?"static",???ld?=?"xcrun?-sdk?macosx?clang++",???xcode_sdkver?=?"10.11",???cxx?=?"xcrun?-sdk?macosx?clang",???mm?=?"xcrun?-sdk?macosx?clang"}
configure?ok!
clean?ok!
[00%]:?ccache?compiling.release?src/main.c
[100%]:?linking.release?hello
build?ok!??接着运行它:
$?xmake?run?hello hello?world!
或者进行调试
$?xmake?run?-d?hello? [lldb]$target?create?"build/hello"Current?executable?set?to?‘build/hello‘?(x86_64). [lldb]$b?main Breakpoint?1:?where?=?hello`main,?address?=?0x0000000100000f50 [lldb]$rProcess?7509?launched:?‘/private/tmp/hello/build/hello‘?(x86_64) Process?7509?stopped *?thread?#1:?tid?=?0x435a2,?0x0000000100000f50?hello`main,?queue?=?‘com.apple.main-thread‘,?stop?reason?=?breakpoint?1.1 ????frame?#0:?0x0000000100000f50?hello`mainhello`main: ->??0x100000f50?<+0>:??pushq??%rbp????0x100000f51?<+1>:??movq???%rsp,?%rbp????0x100000f54?<+4>:??leaq???0x2b(%rip),?%rdi??????????;?"hello?world!" ????0x100000f5b?<+11>:?callq??0x100000f64???????????????;?symbol?stub?for:?puts [lldb]$
接着我们尝试构建一个android版本,这个时候得设置ndk路径,当然也能配置到全局配置中,一劳永逸
$?xmake?f?-p?android?--ndk=~/files/android-ndk-r10e/
checking?for?the?architecture?...?armv7-achecking?for?the?SDK?version?of?NDK?...?android-21checking?for?the?c?compiler?(cc)?...?arm-linux-androideabi-gcc
checking?for?the?c++?compiler?(cxx)?...?arm-linux-androideabi-g++
checking?for?the?assember?(as)?...?arm-linux-androideabi-gcc
checking?for?the?linker?(ld)?...?arm-linux-androideabi-g++
checking?for?the?static?library?archiver?(ar)?...?arm-linux-androideabi-ar
checking?for?the?static?library?extractor?(ex)?...?arm-linux-androideabi-ar
checking?for?the?shared?library?linker?(sh)?...?arm-linux-androideabi-g++
configure
{
????ex?=?"/Users/ruki/files/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-ar",???ccache?=?"ccache",???ndk?=?"~/files/android-ndk-r10e/",???sc?=?"xcrun?-sdk?macosx?swiftc",???ar?=?"/Users/ruki/files/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-ar",???ld?=?"/Users/ruki/files/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-g++",???buildir?=?"build",???host?=?"macosx",???as?=?"/Users/ruki/files/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc",???toolchains?=?"/Users/ruki/files/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin",???arch?=?"armv7-a",???mxx?=?"xcrun?-sdk?macosx?clang++",???xcode_dir?=?"/Applications/Xcode.app",???target_minver?=?"10.11",???ndk_sdkver?=?21,???mode?=?"release",???cc?=?"/Users/ruki/files/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc",???cxx?=?"/Users/ruki/files/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-g++",???make?=?"make",???dd?=?"xcrun?-sdk?macosx?lldb",???kind?=?"static",???sh?=?"/Users/ruki/files/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-g++",???xcode_sdkver?=?"10.11",???plat?=?"android",???mm?=?"xcrun?-sdk?macosx?clang"}
configure?ok!
$?xmake
clean?ok!
[00%]:?ccache?compiling.release?src/main.c
[100%]:?linking.release?hello
build?ok!??或者我们编一个iphoneos的版本,例如:
$?xmake?f?-p?iphoneos
checking?for?the?architecture?...?armv7
checking?for?the?Xcode?SDK?version?for?iphoneos?...?9.2checking?for?the?target?minimal?version?...?9.2checking?for?the?c?compiler?(cc)?...?xcrun?-sdk?iphoneos?clang
checking?for?the?c++?compiler?(cxx)?...?xcrun?-sdk?iphoneos?clang
checking?for?the?objc?compiler?(mm)?...?xcrun?-sdk?iphoneos?clang
checking?for?the?objc++?compiler?(mxx)?...?xcrun?-sdk?iphoneos?clang++
checking?for?the?assember?(as)?...?gas-preprocessor.pl?xcrun?-sdk?iphoneos?clang
checking?for?the?linker?(ld)?...?xcrun?-sdk?iphoneos?clang++
checking?for?the?static?library?archiver?(ar)?...?xcrun?-sdk?iphoneos?ar
checking?for?the?static?library?extractor?(ex)?...?xcrun?-sdk?iphoneos?ar
checking?for?the?shared?library?linker?(sh)?...?xcrun?-sdk?iphoneos?clang++
checking?for?the?swift?compiler?(sc)?...?xcrun?-sdk?iphoneos?swiftc
configure
{
????ex?=?"xcrun?-sdk?iphoneos?ar",???ccache?=?"ccache",???ndk?=?"~/files/android-ndk-r10e/",???sc?=?"xcrun?-sdk?iphoneos?swiftc",???ar?=?"xcrun?-sdk?iphoneos?ar",???sh?=?"xcrun?-sdk?iphoneos?clang++",???buildir?=?"build",???xcode_dir?=?"/Applications/Xcode.app",???as?=?"/usr/local/share/xmake/tools/utils/gas-preprocessor.pl?xcrun?-sdk?iphoneos?clang",???toolchains?=?"/Users/ruki/files/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin",???arch?=?"armv7",???mxx?=?"xcrun?-sdk?iphoneos?clang++",???ndk_sdkver?=?21,???target_minver?=?"9.2",???cc?=?"xcrun?-sdk?iphoneos?clang",???mode?=?"release",???host?=?"macosx",???cxx?=?"xcrun?-sdk?iphoneos?clang",???make?=?"make",???dd?=?"xcrun?-sdk?macosx?lldb",???kind?=?"static",???ld?=?"xcrun?-sdk?iphoneos?clang++",???xcode_sdkver?=?"9.2",???plat?=?"iphoneos",???mm?=?"xcrun?-sdk?iphoneos?clang"}
configure?ok!
$?xmake
[00%]:?ccache?compiling.release?src/main.c
[100%]:?linking.release?hello
build?ok!??最后我们尝试为mingw平台进行编译,sdk指定交叉工具链目录,交叉编译linux平台也可以这么用哦。。
$?xmake?f?-p?mingw?--sdk=/usr/local/i386-mingw32-4.3.0/
checking?for?the?architecture?...?i386
checking?for?the?c?compiler?(cc)?...?i386-mingw32-gcc
checking?for?the?c++?compiler?(cxx)?...?i386-mingw32-g++
checking?for?the?assember?(as)?...?i386-mingw32-gcc
checking?for?the?linker?(ld)?...?i386-mingw32-g++
checking?for?the?static?library?archiver?(ar)?...?i386-mingw32-ar
checking?for?the?static?library?extractor?(ex)?...?i386-mingw32-ar
checking?for?the?shared?library?linker?(sh)?...?i386-mingw32-g++
checking?for?the?swift?compiler?(sc)?...?no
configure
{
????ex?=?"/usr/local/i386-mingw32-4.3.0/bin/i386-mingw32-ar",???ccache?=?"ccache",???ndk?=?"~/files/android-ndk-r10e/",???sc?=?"xcrun?-sdk?iphoneos?swiftc",???sdk?=?"/usr/local/i386-mingw32-4.3.0/",???cc?=?"/usr/local/i386-mingw32-4.3.0/bin/i386-mingw32-gcc",???ndk_sdkver?=?21,???buildir?=?"build",???plat?=?"mingw",???as?=?"/usr/local/i386-mingw32-4.3.0/bin/i386-mingw32-gcc",???toolchains?=?"/Users/ruki/files/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin",???arch?=?"i386",???mxx?=?"xcrun?-sdk?iphoneos?clang++",???xcode_dir?=?"/Applications/Xcode.app",???target_minver?=?"9.2",???sh?=?"/usr/local/i386-mingw32-4.3.0/bin/i386-mingw32-g++",???mode?=?"release",???host?=?"macosx",???cxx?=?"/usr/local/i386-mingw32-4.3.0/bin/i386-mingw32-g++",???make?=?"make",???dd?=?"xcrun?-sdk?macosx?lldb",???kind?=?"static",???ar?=?"/usr/local/i386-mingw32-4.3.0/bin/i386-mingw32-ar",???xcode_sdkver?=?"9.2",???ld?=?"/usr/local/i386-mingw32-4.3.0/bin/i386-mingw32-g++",???mm?=?"xcrun?-sdk?iphoneos?clang"}
configure?ok!
$?xmake
[00%]:?ccache?compiling.release?src/main.c
[100%]:?linking.release?hello.exe
build?ok!??xmake还能直接在windows的cmd终端下,进行直接编译windows的程序,它会去自动检测当前系统装的vs环境,调用里面的cl.exe编译器进行编译,一切都是自动化的,我们不需要额外配置什么,只需要执行:xmake 就行了。。
例如:
$?xmake
checking?for?the?architecture?...?x86
checking?for?the?Microsoft?Visual?Studio?version?...?2008checking?for?the?c?compiler?(cc)?...?cl.exe
checking?for?the?c++?compiler?(cxx)?...?cl.exe
checking?for?the?assember?(as)?...?ml.exe
checking?for?the?linker?(ld)?...?link.exe
checking?for?the?static?library?archiver?(ar)?...?link.exe?-lib
checking?for?the?shared?library?linker?(sh)?...?link.exe?-dll
checking?for?the?static?library?extractor?(ex)?...?lib.exe
configure
{
????ex?=?"lib.exe",???sh?=?"link.exe?-dll",???host?=?"windows",???ar?=?"link.exe?-lib",???as?=?"ml.exe",???plat?=?"windows",???buildir?=?"build",???arch?=?"x86",???cc?=?"cl.exe",???cxx?=?"cl.exe",???mode?=?"release",???clean?=?true,???kind?=?"static",???ld?=?"link.exe",???vs?=?"2008"}
configure?ok!
[00%]:?compiling.release?src\main.c
[100%]:?linking.release?hello.exe
build?ok!顺便说一下,在windows下编译,xmake是完全支持多任务的哦,默认就是自动多任务构建的,比起以前在msys, cygwin里面用 gmake来编译快多了,因为windows下的gmake就算你启用了-j 4 也没啥效果,非常非常得慢。。。
原文:https://blog.51cto.com/tboox/2872694