- 
          
 - 
                Notifications
    
You must be signed in to change notification settings  - Fork 880
 
Home
  
  
  
  
A cross-platform build utility based on Lua
Modern C/C++ build tools, Simple, Fast, Powerful dependency package integration
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. 🙏 [Become a sponsor]
Introduction (中文)
xmake is a lightweight cross-platform build utility based on Lua. It uses xmake.lua to maintain project builds. Compared with makefile/CMakeLists.txt, the configuration syntax is more concise and intuitive. It is very friendly to novices and can quickly get started in a short time. Let users focus more on actual project development.
It can compile the project directly like Make/Ninja, or generate project files like CMake/Meson, and it also has a built-in package management system to help users solve the integrated use of C/C++ dependent libraries.
If you want to know more, please refer to: Documents, Github and Gitee, and also welcome to join our community.
bash <(curl -fsSL https://xmake.io/shget.text)bash <(wget https://xmake.io/shget.text -O -)Invoke-Expression (Invoke-Webrequest 'https://xmake.io/psget.text' -UseBasicParsing).Content
An official xmake package repository: xmake-repo
$ xmake$ xmake run console$ xmake run -d console$ xmake f -p [windows|linux|macosx|android|iphoneos ..] -a [x86|arm64 ..] -m [debug|release]
$ xmake$ xmake f --menu
The test project: xmake-core
| buildsystem | Termux (8core/-j12) | buildsystem | MacOS (8core/-j12) | 
|---|---|---|---|
| xmake | 24.890s | xmake | 12.264s | 
| ninja | 25.682s | ninja | 11.327s | 
| cmake(gen+make) | 5.416s+28.473s | cmake(gen+make) | 1.203s+14.030s | 
| cmake(gen+ninja) | 4.458s+24.842s | cmake(gen+ninja) | 0.988s+11.644s | 
| buildsystem | Termux (-j1) | buildsystem | MacOS (-j1) | 
|---|---|---|---|
| xmake | 1m57.707s | xmake | 39.937s | 
| ninja | 1m52.845s | ninja | 38.995s | 
| cmake(gen+make) | 5.416s+2m10.539s | cmake(gen+make) | 1.203s+41.737s | 
| cmake(gen+ninja) | 4.458s+1m54.868s | cmake(gen+ninja) | 0.988s+38.022s | 
- Official package repository xmake-repo (tbox >1.6.1)
 - Official package manager Xrepo
 - User-built repositories
 - Conan (conan::openssl/1.1.1g)
 - Vcpkg (vcpkg:ffmpeg)
 - Homebrew/Linuxbrew (brew::pcre2/libpcre2-8)
 - Pacman on archlinux/msys2 (pacman::libcurl)
 - Clib (clib::clibs/[email protected])
 - Dub (dub::log 0.4.3)
 
- Windows (x86, x64)
 - macOS (i386, x86_64, arm64)
 - Linux (i386, x86_64, cross-toolchains ..)
 - *BSD (i386, x86_64)
 - Android (x86, x86_64, armeabi, armeabi-v7a, arm64-v8a)
 - iOS (armv7, armv7s, arm64, i386, x86_64)
 - WatchOS (armv7k, i386)
 - MSYS (i386, x86_64)
 - MinGW (i386, x86_64, arm, arm64)
 - Cygwin (i386, x86_64)
 - Wasm (wasm32)
 - Cross (cross-toolchains ..)
 
$ xmake show -l toolchains
xcode         Xcode IDE
vs            VisualStudio IDE
yasm          The Yasm Modular Assembler
clang         A C language family frontend for LLVM
go            Go Programming Language Compiler
dlang         D Programming Language Compiler
gfortran      GNU Fortran Programming Language Compiler
zig           Zig Programming Language Compiler
sdcc          Small Device C Compiler
cuda          CUDA Toolkit
ndk           Android NDK
rust          Rust Programming Language Compiler
llvm          A collection of modular and reusable compiler and toolchain technologies
cross         Common cross compilation toolchain
nasm          NASM Assembler
gcc           GNU Compiler Collection
mingw         Minimalist GNU for Windows
gnu-rm        GNU Arm Embedded Toolchain
envs          Environment variables toolchain
fasm          Flat Assembler
tinyc         Tiny C Compiler
emcc          A toolchain for compiling to asm.js and WebAssembly
icc           Intel C/C++ Compiler
ifort         Intel Fortran Compiler
musl          The musl-based cross-compilation toolchains- C
 - C++
 - Objective-C and Objective-C++
 - Swift
 - Assembly
 - Golang
 - Rust
 - Dlang
 - Fortran
 - Cuda
 - Zig (Experimental)
 
- Simple project configuration syntax
 - Direct build support, without relying on any third-party back-end make tools
 - Support cross platform
 - Support cross compilation
 - Multi-task parallel compilation support
 - C++20 Module-TS support
 - Support cross-platform C/C++ dependency packages
 - Support self-built distributed and third-party package repositories
 - Support multi-language mixed compilation
 - Flexible lua scripts, rich extension modules
 - Support for generating vsproj/cmake/makefile/compile_commands files
 - REPL interactive execution support
 - Incremental compilation support, automatic analysis of header dependency files
 - Fast switching toolchains
 
- Static Library
 - Shared Library
 - Console
 - Cuda Program
 - Qt Application
 - WDK Driver (umdf/kmdf/wdm)
 - WinSDK Application
 - MFC Application
 - iOS/MacOS Application
 - Framework and Bundle Program (iOS/MacOS)
 
add_rules("mode.debug", "mode.release")
target("console")
    set_kind("binary")
    add_files("src/*.c")
    if is_mode("debug") then
        add_defines("DEBUG")
    endtarget("test")
    set_kind("binary")
    add_files("src/*.c")
    after_build(function (target)
        print("hello: %s", target:name())
        os.exec("echo %s", target:targetfile())
    end)Download and use packages in xmake-repo or third-party repositories:
add_requires("tbox >1.6.1", "libuv master", "vcpkg::ffmpeg", "brew::pcre2/libpcre2-8")
add_requires("conan::openssl/1.1.1g", {alias = "openssl", optional = true, debug = true})
target("test")
    set_kind("binary")
    add_files("src/*.c")
    add_packages("tbox", "libuv", "vcpkg::ffmpeg", "brew::pcre2/libpcre2-8", "openssl")In addition, we can also use the xrepo command to quickly install dependent packages.
target("test")
    add_rules("qt.quickapp")
    add_files("src/*.cpp")
    add_files("src/qml.qrc")target("test")
    set_kind("binary")
    add_files("src/*.cu")
    add_cugencodes("native")
    add_cugencodes("compute_35")target("echo")
    add_rules("wdk.driver", "wdk.env.umdf")
    add_files("driver/*.c")
    add_files("driver/*.inx")
    add_includedirs("exe")
target("app")
    add_rules("wdk.binary", "wdk.env.umdf")
    add_files("exe/*.cpp")More wdk driver program examples (umdf/kmdf/wdm), please see WDK Program Examples
target("test")
    add_rules("xcode.application")
    add_files("src/*.m", "src/**.storyboard", "src/*.xcassets")
    add_files("src/Info.plist")target("test")
    add_rules("xcode.framework") -- or xcode.bundle
    add_files("src/*.m")
    add_files("src/Info.plist")add_requires("libomp", {optional = true})
target("loop")
    set_kind("binary")
    add_files("src/*.cpp")
    add_rules("c++.openmp")
    add_packages("libomp")$ xmake project -k vsxmake -m "debug;release" # New vsproj generator (Recommended)
$ xmake project -k vs -m "debug;release"
$ xmake project -k cmake
$ xmake project -k ninja
$ xmake project -k compile_commands$ xmake l ./test.lua
$ xmake l -c "print('hello xmake!')"
$ xmake l lib.detect.find_tool gcc
$ xmake l
> print("hello xmake!")
> {1, 2, 3}
< {
    1,
    2,
    3
  }More builtin plugins, please see: Builtin plugins
Please download and install more other plugins from the plugins repository xmake-plugins.
We can uses xmake-gradle plugin to compile JNI library in gradle.
plugins {
  id 'org.tboox.gradle-xmake-plugin' version '1.0.6'
}
android {
    externalNativeBuild {
        xmake {
            path "jni/xmake.lua"
        }
    }
}
The xmakeBuild will be injected to assemble task automatically if the gradle-xmake-plugin has been applied.
$ ./gradlew app:assembleDebug
> Task :nativelib:xmakeConfigureForArm64
> Task :nativelib:xmakeBuildForArm64
>> xmake build
[ 50%]: ccache compiling.debug nativelib.cc
[ 75%]: linking.debug libnativelib.so
[100%]: build ok!
>> install artifacts to /Users/ruki/projects/personal/xmake-gradle/nativelib/libs/arm64-v8a
> Task :nativelib:xmakeConfigureForArmv7
> Task :nativelib:xmakeBuildForArmv7
>> xmake build
[ 50%]: ccache compiling.debug nativelib.cc
[ 75%]: linking.debug libnativelib.so
[100%]: build ok!
>> install artifacts to /Users/ruki/projects/personal/xmake-gradle/nativelib/libs/armeabi-v7a
> Task :nativelib:preBuild
> Task :nativelib:assemble
> Task :app:assembleDebugWe also provide paid technical support to help users quickly solve related problems. For details, please click the image link below:
Or you can also consider sponsoring us to get technical support services, [Become a sponsor]
Some projects using xmake:
- Email:[email protected]
 - Homepage:xmake.io
 - Community
- Chat on reddit
 - Chat on telegram
 - Chat on gitter
 - Chat on discord/en
 - Chat on discord/zh
 - Chat on QQ Group: 343118190(Technical Support), 662147501
 
 - Source Code:Github, Gitee
 - Wechat Public: tboox-os
 
This project exists thanks to all the people who have contributed:
- TitanSnow: provide the xmake logo and install scripts
 - uael: provide the semantic versioning library sv
 - OpportunityLiu: improve cuda, tests and ci
 
