Skip to content

akbs-org/akbs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

AKBS: The All Knowing Build System for C, C++ and Assembly

Requirements

Python 3>=

Installation

# Linux
python3 -m pip install akbs
# Windows (UNSUPPORTED!)
python -m pip install akbs


# Usage
python3 -m akbs

Speed

To test the build system, I made a build script for basic_math_operations,

Operating System: Debian Bullseye Host: Linux 5.10.102.1-microsoft-standard-WSL2 Architecture: x86_64

AKBS: Version: 1.0.5 Time: 1.351s

CMake w/ Makefile: CMake Version: 3.26.0 Make Version: 4.3 Time: 3.360s

CMake w/ Ninja: CMake Version: 3.26.0 Ninja Version: 1.11.1 Time: 2.750s

The build.akbs file is as follows

set(C_STD, 17)
set(CXX_STD, 17)
set(FILES, wildcard$(src/library/**/*.cpp) wildcard$(src/library/**/*.c))
set(OUTPUT_DIR, dist)
set(BUILD_DIR, build)

if(eq$($PLATFORM, POSIX))
set(FILES, wildcard$(src/library/linux/*.asm) remove$($FILES, src/library/cross-platform/addp.c, src/library/cross-platform/multiply_whole.c))
endif

check_for(C, CXX, ASM_INTEL, SHARED, STATIC)

set(OUTPUT, libbasic_math_operations.so)
compile(SHARED, $FILES)
set(OUTPUT, libbasic_math_operations.a)
compile(STATIC, $FILES)

Note: The remove$() helper function is used because the multiply_whole and addp functions are already present in Assembly for Linux, not for Windows

How do you use AKBS?

By default, the build script is called build.akbs, similar to Makefile and CMakeLists.txt However, you can use the --file option to specify a file

To enable languages, you use the check_for function

check_for(C, CXX, ASM_INTEL, ASM_ATT, STATIC, SHARED)

Right now, only these 4 languages (and a static and shared library linker) (3 if you count AT&T and Intel syntax Assembly as one language) are supported

If you want to set the standard of C and C++, set the C_STD or CXX_STD variable

set(C_STD, 17)
set(CXX_STD, 17)

To compile a list of files, use the compile function

compile(SHARED/STATIC, src/a.c src/b.c src/c.c)

To print a statement you can use the print function and to exit a program, use exit

print($PLATFORM)
exit(1)

To use a variable, use $VARIABLENAME

The $PLATFORM variable comes predefined and is set to os.name

For conditions, use if (else and else if are not implemented yet) and endif.

if(set$(PLATFORM))
print($PLATFORM)
if(eq$($PLATFORM, UNIX))
print Yay, we're in UNIX land
endif
endif

Also, there is a rudimentary pre-processor, with %define

%define ifend endif
if(set$(PLATFORM))
ifend

Comments work by adding a semi-colon at the start of the line

; these   
; lines   
; will    
; be      
; skipped 

Comments will also work at the end of a line

print($PLATFORM) ; this text will be ignored, and is merely a comment

There is also a list of helper functions

Function Name Arguments Description Introduced
wildcard$ str1 Evaluates a list of space separated globs into a space separated list of files v1.0.0
remove$ str1, str2, str3... Removes str2 onwards from a space separated list of strings v1.0.0
replace$ str1, str2, str3... Replaces str2,4,6,8... with str3,5,7,9... in str1 v1.0.3
eq$ arg1, arg2 Checks if two strings are equal v1.0.0
neq$ arg1, arg2 Checks if two strings are unequal v1.0.3
gt$ arg1, arg2 Checks if arg1 is greater than arg2 v1.0.3
lt$ arg1, arg2 Checks if arg1 is lesser than arg2 v1.0.3
gte$ arg1, arg2 Checks if arg1 is greater than or equal to arg2 v1.0.3
lte$ arg1, arg2 Checks if arg1 is lesser than or equal to arg2 v1.0.3
set$ arg1 Checks if there is a variable with the name arg1
notset$ arg1 Checks if there is not a variable with the name arg1 v1.0.3
and$ arg1, arg2, arg3... Ands all the booleans v1.0.4
or$ arg1, arg2, arg3... Ors all the booleans v1.0.4
not$ arg1 Nots the boolean v1.0.4

A list of important variables are

Variable Is Set Description Introduced
PLATFORM Yes Equivalent of os.name v1.0.0
C_COMPILER No C compiler location set by check_for v1.0.0
CXX_COMPILER No C++ compiler location set by check_for v1.0.0
ASM_INTEL_COMPILER No Intel Assembly assembler location set by check_for v1.0.0
ASM_ATT_COMPILER No AT&T Assembly assembler location set by check_for v1.0.0
SHARED_COMPILER No Linker location for shared libraries set by check_for v1.0.0
STATIC_COMPILER No Linker location for static libraries set by check_for v1.0.2
OUTPUT No Output file generated by linking v1.0.0
C_STD No The C std used (just the number like 17, 11, etc.) v1.0.0
CXX_STD No The C++ std used (just the number like 17, 11, etc.) v1.0.0
BUILD_DIR No The directory to build the objects in v1.0.1
OUTPUT_DIR No The directory to output the finished objects in in v1.0.1
C_FLAGS No Flags passed to C compiler v1.0.2
CXX_FLAGS No Flags passed to C++ compiler v1.0.2
ASM_INTEL_FLAGS No Flags passed to Intel Assembly assembler v1.0.2
ASM_ATT_FLAGS No Flags passed to AT&T Assembly assembler v1.0.2
SHARED_FLAGS No Flags passed to shared library linker v1.0.2
STATIC_FLAGS No Flags passed to static library linker v1.0.2

How to clean the files

python3 -m akbs --clean

To-Do

  • Build directory (milestone 1.0.1)
  • Nested functions
  • Windows support
  • Optimization
  • Subdirectories
  • Ability to set compilers from set() and environment variables
  • More if conditions
  • replace$() helper function
  • --clean command
  • Documenting my code + Readable variables
  • C_FLAGS, CXX_FLAGS, ASM...
  • Cache install locations (milestone 1.0.2)
  • Ability to set target architecture (Use CFLAGS and CXXFLAGS)
  • Plugin Support
  • Make print and exit a function, not a statement
  • Make comments work in the middle of a line