2016-02-01 22:26:01 +00:00
|
|
|
cmake_minimum_required(VERSION 2.8.5)
|
2015-08-05 23:23:15 +01:00
|
|
|
|
2020-05-26 14:36:55 +01:00
|
|
|
# Use ccache if possible
|
|
|
|
FIND_PROGRAM(CCACHE_PROGRAM ccache)
|
|
|
|
IF(CCACHE_PROGRAM)
|
|
|
|
MESSAGE(STATUS "Found ccache ${CCACHE_PROGRAM}")
|
|
|
|
ENDIF()
|
|
|
|
|
2016-02-01 22:26:01 +00:00
|
|
|
if(NOT CMAKE_BUILD_TYPE)
|
|
|
|
set(CMAKE_BUILD_TYPE "Debug" CACHE STRING
|
2020-02-05 13:24:50 +00:00
|
|
|
"Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." FORCE)
|
2016-02-01 22:26:01 +00:00
|
|
|
endif()
|
2015-08-05 23:23:15 +01:00
|
|
|
|
2018-04-11 01:57:37 +01:00
|
|
|
if(NOT CMAKE_INSTALL_PREFIX)
|
2019-06-23 02:21:48 +01:00
|
|
|
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}" CACHE STRING
|
2018-04-11 01:57:37 +01:00
|
|
|
"Directory to install zig to" FORCE)
|
|
|
|
endif()
|
|
|
|
|
2019-10-10 21:44:52 +01:00
|
|
|
set(CMAKE_USER_MAKE_RULES_OVERRIDE
|
|
|
|
${CMAKE_CURRENT_SOURCE_DIR}/cmake/c_flag_overrides.cmake)
|
|
|
|
set(CMAKE_USER_MAKE_RULES_OVERRIDE_CXX
|
|
|
|
${CMAKE_CURRENT_SOURCE_DIR}/cmake/cxx_flag_overrides.cmake)
|
|
|
|
|
2017-04-21 16:06:15 +01:00
|
|
|
project(zig C CXX)
|
2015-08-05 23:23:15 +01:00
|
|
|
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
|
|
|
|
|
2015-08-05 23:46:40 +01:00
|
|
|
set(ZIG_VERSION_MAJOR 0)
|
2020-04-13 18:36:30 +01:00
|
|
|
set(ZIG_VERSION_MINOR 6)
|
2018-03-15 13:15:05 +00:00
|
|
|
set(ZIG_VERSION_PATCH 0)
|
2015-08-05 23:23:15 +01:00
|
|
|
set(ZIG_VERSION "${ZIG_VERSION_MAJOR}.${ZIG_VERSION_MINOR}.${ZIG_VERSION_PATCH}")
|
2017-10-01 23:34:22 +01:00
|
|
|
|
|
|
|
find_program(GIT_EXE NAMES git)
|
|
|
|
if(GIT_EXE)
|
|
|
|
execute_process(
|
2018-06-30 03:22:04 +01:00
|
|
|
COMMAND ${GIT_EXE} -C ${CMAKE_SOURCE_DIR} name-rev HEAD --tags --name-only --no-undefined --always
|
2019-09-02 22:45:30 +01:00
|
|
|
RESULT_VARIABLE EXIT_STATUS
|
2017-10-01 23:34:22 +01:00
|
|
|
OUTPUT_VARIABLE ZIG_GIT_REV
|
2019-09-02 22:45:30 +01:00
|
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
|
|
ERROR_QUIET)
|
|
|
|
if(EXIT_STATUS EQUAL "0")
|
|
|
|
if(ZIG_GIT_REV MATCHES "\\^0$")
|
|
|
|
if(NOT("${ZIG_GIT_REV}" STREQUAL "${ZIG_VERSION}^0"))
|
|
|
|
message("WARNING: Tag does not match configured Zig version")
|
|
|
|
endif()
|
|
|
|
else()
|
|
|
|
set(ZIG_VERSION "${ZIG_VERSION}+${ZIG_GIT_REV}")
|
2017-10-01 23:34:22 +01:00
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
endif()
|
2015-08-05 23:23:15 +01:00
|
|
|
message("Configuring zig version ${ZIG_VERSION}")
|
|
|
|
|
2018-03-30 18:20:13 +01:00
|
|
|
set(ZIG_STATIC off CACHE BOOL "Attempt to build a static zig executable (not compatible with glibc)")
|
2019-07-09 10:03:57 +01:00
|
|
|
set(ZIG_STATIC_LLVM off CACHE BOOL "Prefer linking against static LLVM libraries")
|
add -DZIG_ENABLE_MEM_PROFILE option and -fmem-report flag
This can be used to find what's taking up memory in the compiler.
Here's an example of how to use it:
```
./zig test ../lib/std/std.zig --cache off -fmem-report
```
And here's the output I get for this on x86_64-linux-gnu today:
```
Const: 6462833 items, 152 bytes each, total 936.84 MiB
ConstGlobalRefs: 17236534 items, 24 bytes each, total 394.51 MiB
ResetResult: 1698108 items, 160 bytes each, total 259.11 MiB
ConstExprValue: 3118299 items, 80 bytes each, total 237.91 MiB
EndExpr: 1345395 items, 168 bytes each, total 215.56 MiB
Unknown_8: 27370821 items, 8 bytes each, total 208.82 MiB
VarPtr: 1127866 items, 168 bytes each, total 180.70 MiB
IrBasicBlock: 794834 items, 120 bytes each, total 90.96 MiB
LoadPtr: 554024 items, 160 bytes each, total 84.54 MiB
Unknown_64: 1245715 items, 64 bytes each, total 76.03 MiB
Unknown_40: 1879218 items, 40 bytes each, total 71.69 MiB
Unknown_72: 989117 items, 72 bytes each, total 67.92 MiB
Return: 423783 items, 160 bytes each, total 64.66 MiB
Unknown_168: 332480 items, 168 bytes each, total 53.27 MiB
Unknown_152: 336890 items, 152 bytes each, total 48.84 MiB
AddImplicitReturnType: 230819 items, 168 bytes each, total 36.98 MiB
Br: 217835 items, 168 bytes each, total 34.90 MiB
Unknown_184: 179529 items, 184 bytes each, total 31.50 MiB
FieldPtr: 179388 items, 184 bytes each, total 31.48 MiB
BinOp: 171004 items, 176 bytes each, total 28.70 MiB
LoadPtrGen: 173287 items, 168 bytes each, total 27.76 MiB
CondBr: 137864 items, 192 bytes each, total 25.24 MiB
Unknown_720: 30918 items, 720 bytes each, total 21.23 MiB
CallSrc: 99320 items, 216 bytes each, total 20.46 MiB
Unknown_160: 129243 items, 160 bytes each, total 19.72 MiB
Unknown_1: 19339456 items, 1 bytes each, total 18.44 MiB
CheckStatementIsVoid: 119838 items, 160 bytes each, total 18.29 MiB
Unknown_48: 371178 items, 48 bytes each, total 16.99 MiB
TestComptime: 101443 items, 160 bytes each, total 15.48 MiB
DeclVarSrc: 72578 items, 184 bytes each, total 12.74 MiB
StorePtr: 72776 items, 176 bytes each, total 12.22 MiB
ZigVar: 79201 items, 160 bytes each, total 12.09 MiB
Unknown_16: 770643 items, 16 bytes each, total 11.76 MiB
Phi: 60482 items, 184 bytes each, total 10.61 MiB
TestErrSrc: 66177 items, 168 bytes each, total 10.60 MiB
Unknown_240: 45164 items, 240 bytes each, total 10.34 MiB
ElemPtr: 58232 items, 184 bytes each, total 10.22 MiB
AllocaSrc: 60053 items, 176 bytes each, total 10.08 MiB
CallGen: 44873 items, 224 bytes each, total 9.59 MiB
SaveErrRetAddr: 63787 items, 152 bytes each, total 9.25 MiB
Unknown_112: 82283 items, 112 bytes each, total 8.79 MiB
AllocaGen: 51909 items, 176 bytes each, total 8.71 MiB
Unknown_24: 373599 items, 24 bytes each, total 8.55 MiB
ResultLocPeer: 113683 items, 72 bytes each, total 7.81 MiB
DeclRef: 36343 items, 168 bytes each, total 5.82 MiB
UnwrapErrPayload: 34603 items, 168 bytes each, total 5.54 MiB
Ref: 33414 items, 168 bytes each, total 5.35 MiB
Unknown_104: 53882 items, 104 bytes each, total 5.34 MiB
DeclVarGen: 32540 items, 168 bytes each, total 5.21 MiB
StructFieldPtr: 30449 items, 176 bytes each, total 5.11 MiB
UnwrapErrCode: 31508 items, 168 bytes each, total 5.05 MiB
Unknown_56: 90256 items, 56 bytes each, total 4.82 MiB
SpillBegin: 28722 items, 168 bytes each, total 4.60 MiB
SpillEnd: 28722 items, 160 bytes each, total 4.38 MiB
ResultLocReturn: 64573 items, 48 bytes each, total 2.96 MiB
PtrType: 14702 items, 184 bytes each, total 2.58 MiB
SliceType: 15005 items, 176 bytes each, total 2.52 MiB
Unknown_176: 13326 items, 176 bytes each, total 2.24 MiB
RefGen: 12881 items, 168 bytes each, total 2.06 MiB
UnOp: 12102 items, 176 bytes each, total 2.03 MiB
SwitchBr: 9453 items, 200 bytes each, total 1.80 MiB
TestErrGen: 11143 items, 160 bytes each, total 1.70 MiB
Unknown_32: 52359 items, 32 bytes each, total 1.60 MiB
CheckSwitchProngs: 9094 items, 184 bytes each, total 1.60 MiB
TypeOf: 9259 items, 160 bytes each, total 1.41 MiB
IntCast: 8772 items, 168 bytes each, total 1.41 MiB
OptionalUnwrapPtr: 8755 items, 168 bytes each, total 1.40 MiB
SwitchTarget: 9094 items, 160 bytes each, total 1.39 MiB
Cast: 8198 items, 176 bytes each, total 1.38 MiB
WidenOrShorten: 8448 items, 160 bytes each, total 1.29 MiB
ErrorUnion: 7613 items, 176 bytes each, total 1.28 MiB
SliceSrc: 6249 items, 192 bytes each, total 1.14 MiB
ErrWrapCode: 7133 items, 168 bytes each, total 1.14 MiB
TypeName: 7328 items, 160 bytes each, total 1.12 MiB
ImplicitCast: 5480 items, 176 bytes each, total 941.88 KiB
ResolveResult: 5638 items, 168 bytes each, total 924.98 KiB
ResultLocInstruction: 22696 items, 40 bytes each, total 886.56 KiB
BitCastSrc: 4947 items, 168 bytes each, total 811.62 KiB
CompileErr: 5148 items, 160 bytes each, total 804.38 KiB
ReturnPtr: 5305 items, 152 bytes each, total 787.46 KiB
Unreachable: 5038 items, 152 bytes each, total 747.83 KiB
TestNonNull: 4716 items, 160 bytes each, total 736.88 KiB
BitCastGen: 4431 items, 160 bytes each, total 692.34 KiB
PtrToInt: 4289 items, 160 bytes each, total 670.16 KiB
SliceGen: 3573 items, 192 bytes each, total 669.94 KiB
ArrayType: 4081 items, 168 bytes each, total 669.54 KiB
IntType: 3868 items, 168 bytes each, total 634.59 KiB
Unknown_88: 7213 items, 88 bytes each, total 619.87 KiB
Truncate: 3771 items, 168 bytes each, total 618.68 KiB
TypeInfo: 3740 items, 160 bytes each, total 584.38 KiB
SwitchVar: 3385 items, 176 bytes each, total 581.80 KiB
ContainerInitFields: 3223 items, 184 bytes each, total 579.13 KiB
ContainerInitList: 2309 items, 192 bytes each, total 432.94 KiB
PtrCastGen: 2626 items, 168 bytes each, total 430.83 KiB
BoolNot: 2457 items, 160 bytes each, total 383.91 KiB
FnProto: 2054 items, 184 bytes each, total 369.08 KiB
MergeErrSets: 1927 items, 176 bytes each, total 331.20 KiB
Unknown_136: 2486 items, 136 bytes each, total 330.17 KiB
Unknown_80: 4059 items, 80 bytes each, total 317.11 KiB
Bswap: 1670 items, 168 bytes each, total 273.98 KiB
TypeId: 1680 items, 160 bytes each, total 262.50 KiB
PtrCastSrc: 1371 items, 176 bytes each, total 235.64 KiB
ErrName: 1193 items, 160 bytes each, total 186.41 KiB
UnionTag: 1120 items, 160 bytes each, total 175.00 KiB
TagName: 1050 items, 160 bytes each, total 164.06 KiB
SizeOf: 942 items, 160 bytes each, total 147.19 KiB
MemberName: 871 items, 168 bytes each, total 142.90 KiB
Import: 881 items, 160 bytes each, total 137.66 KiB
PtrOfArrayToSlice: 758 items, 168 bytes each, total 124.36 KiB
UnionFieldPtr: 710 items, 176 bytes each, total 122.03 KiB
EnumToInt: 778 items, 160 bytes each, total 121.56 KiB
CheckRuntimeScope: 700 items, 168 bytes each, total 114.84 KiB
FieldParentPtr: 632 items, 184 bytes each, total 113.56 KiB
BoolToInt: 719 items, 160 bytes each, total 112.34 KiB
ResultLocPeerParent: 904 items, 104 bytes each, total 91.81 KiB
IntToPtr: 537 items, 168 bytes each, total 88.10 KiB
AlignOf: 561 items, 160 bytes each, total 87.66 KiB
AtomicRmw: 356 items, 208 bytes each, total 72.31 KiB
MemberCount: 441 items, 160 bytes each, total 68.91 KiB
Memset: 342 items, 176 bytes each, total 58.78 KiB
PopCount: 321 items, 168 bytes each, total 52.66 KiB
AlignCast: 251 items, 168 bytes each, total 41.18 KiB
IrInstruction *: 5230 items, 8 bytes each, total 40.86 KiB
IrBasicBlock *: 5230 items, 8 bytes each, total 40.86 KiB
TagType: 261 items, 160 bytes each, total 40.78 KiB
HasDecl: 234 items, 168 bytes each, total 38.39 KiB
OverflowOp: 191 items, 200 bytes each, total 37.30 KiB
Export: 209 items, 176 bytes each, total 35.92 KiB
SetCold: 219 items, 160 bytes each, total 34.22 KiB
ReturnAddress: 216 items, 152 bytes each, total 32.06 KiB
FromBytes: 178 items, 176 bytes each, total 30.59 KiB
SetRuntimeSafety: 188 items, 160 bytes each, total 29.38 KiB
OptionalWrap: 151 items, 168 bytes each, total 24.77 KiB
Clz: 143 items, 168 bytes each, total 23.46 KiB
ResizeSlice: 135 items, 168 bytes each, total 22.15 KiB
UnionInitNamedField: 106 items, 184 bytes each, total 19.05 KiB
Panic: 102 items, 160 bytes each, total 15.94 KiB
SwitchElseVar: 93 items, 168 bytes each, total 15.26 KiB
ToBytes: 89 items, 168 bytes each, total 14.60 KiB
IntToFloat: 78 items, 168 bytes each, total 12.80 KiB
Unknown_4360: 3 items, 4360 bytes each, total 12.77 KiB
ErrWrapPayload: 72 items, 168 bytes each, total 11.81 KiB
FloatOp: 62 items, 176 bytes each, total 10.66 KiB
FloatToInt: 47 items, 168 bytes each, total 7.71 KiB
FloatCast: 46 items, 168 bytes each, total 7.55 KiB
ErrToInt: 47 items, 160 bytes each, total 7.34 KiB
Asm: 33 items, 216 bytes each, total 6.96 KiB
ErrSetCast: 40 items, 168 bytes each, total 6.56 KiB
Memcpy: 34 items, 176 bytes each, total 5.84 KiB
AtomicLoad: 17 items, 184 bytes each, total 3.05 KiB
AwaitSrc: 16 items, 168 bytes each, total 2.62 KiB
Resume: 14 items, 160 bytes each, total 2.19 KiB
AwaitGen: 12 items, 176 bytes each, total 2.06 KiB
ArgType: 12 items, 168 bytes each, total 1.97 KiB
AnyFrameType: 12 items, 160 bytes each, total 1.88 KiB
SuspendFinish: 10 items, 160 bytes each, total 1.56 KiB
SuspendBegin: 10 items, 160 bytes each, total 1.56 KiB
Ctz: 9 items, 168 bytes each, total 1.48 KiB
FrameHandle: 8 items, 152 bytes each, total 1.19 KiB
SetEvalBranchQuota: 7 items, 160 bytes each, total 1.09 KiB
AssertZero: 7 items, 160 bytes each, total 1.09 KiB
UndeclaredIdent: 7 items, 160 bytes each, total 1.09 KiB
CmpxchgSrc: 5 items, 216 bytes each, total 1.05 KiB
CmpxchgGen: 5 items, 200 bytes each, total 1000.00 bytes
IntToEnum: 4 items, 168 bytes each, total 672.00 bytes
VectorType: 4 items, 168 bytes each, total 672.00 bytes
ErrorReturnTrace: 2 items, 160 bytes each, total 320.00 bytes
Breakpoint: 2 items, 152 bytes each, total 304.00 bytes
FrameAddress: 2 items, 152 bytes each, total 304.00 bytes
Unknown_4: 61 items, 4 bytes each, total 244.00 bytes
VectorToArray: 1 items, 168 bytes each, total 168.00 bytes
SetAlignStack: 1 items, 160 bytes each, total 160.00 bytes
Unknown_12: 2 items, 12 bytes each, total 24.00 bytes
ErrorTableEntry *: 0 items, 8 bytes each, total 0.00 bytes
AstNode *: 0 items, 8 bytes each, total 0.00 bytes
Total bytes used: 3.51 GiB
```
You can see that most of the memory is taken up by IR instructions,
as well as comptime values. This points toward 2 changes which will
greatly reduce memory usage:
* Rework semantic analysis so that IR instructions can be freed.
Currently the comptime value struct (ConstExprValue) is embedded
directly into the IrInstruction struct. If this is made to be
separate, at the very least pass 1 IR instructions can be freed.
This includes `Const` which is the largest usage of memory currently.
* Rework the ConstExprValue struct to no longer be a tagged union.
For example, there's no need for an integer comptime value to be
80 bytes.
From this you can also see that this eliminates some things from being
the culprit. Before doing this analysis, I considered whether doing
string interning would help. From the above output, you can see that all
strings in the compiler account for only 18 MiB, so string interning
would have been a dead end.
2019-10-19 08:23:23 +01:00
|
|
|
set(ZIG_ENABLE_MEM_PROFILE off CACHE BOOL "Activate memory usage instrumentation")
|
2020-04-10 06:25:15 +01:00
|
|
|
set(ZIG_PREFER_CLANG_CPP_DYLIB off CACHE BOOL "Try to link against -lclang-cpp")
|
2020-05-26 14:36:55 +01:00
|
|
|
set(ZIG_USE_CCACHE off CACHE BOOL "Use ccache if available")
|
|
|
|
|
|
|
|
if(CCACHE_PROGRAM AND ZIG_USE_CCACHE)
|
|
|
|
SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
|
|
|
|
endif()
|
2019-07-09 10:03:57 +01:00
|
|
|
|
|
|
|
if(ZIG_STATIC)
|
|
|
|
set(ZIG_STATIC_LLVM "on")
|
|
|
|
endif()
|
2016-02-11 08:33:27 +00:00
|
|
|
|
2017-10-01 21:10:05 +01:00
|
|
|
string(REGEX REPLACE "\\\\" "\\\\\\\\" ZIG_LIBC_LIB_DIR_ESCAPED "${ZIG_LIBC_LIB_DIR}")
|
|
|
|
string(REGEX REPLACE "\\\\" "\\\\\\\\" ZIG_LIBC_STATIC_LIB_DIR_ESCAPED "${ZIG_LIBC_STATIC_LIB_DIR}")
|
|
|
|
string(REGEX REPLACE "\\\\" "\\\\\\\\" ZIG_LIBC_INCLUDE_DIR_ESCAPED "${ZIG_LIBC_INCLUDE_DIR}")
|
2017-10-01 19:01:18 +01:00
|
|
|
|
2016-04-23 17:57:38 +01:00
|
|
|
option(ZIG_TEST_COVERAGE "Build Zig with test coverage instrumentation" OFF)
|
|
|
|
|
2020-01-16 18:09:45 +00:00
|
|
|
# Zig no longer has embedded LLD. This option is kept for package maintainers
|
|
|
|
# so that they don't have to update their scripts in case we ever re-introduce
|
|
|
|
# LLD to the tree. This option does nothing.
|
|
|
|
option(ZIG_FORCE_EXTERNAL_LLD "does nothing" OFF)
|
2016-02-11 08:33:27 +00:00
|
|
|
|
2020-03-28 03:43:21 +00:00
|
|
|
set(ZIG_TARGET_TRIPLE "native" CACHE STRING "arch-os-abi to output binaries for")
|
2020-04-08 22:41:51 +01:00
|
|
|
set(ZIG_TARGET_MCPU "baseline" CACHE STRING "-mcpu parameter to output binaries for")
|
2020-03-28 03:43:21 +00:00
|
|
|
set(ZIG_EXECUTABLE "" CACHE STRING "(when cross compiling) path to already-built zig binary")
|
|
|
|
|
2017-09-13 05:17:19 +01:00
|
|
|
find_package(llvm)
|
|
|
|
find_package(clang)
|
2020-01-16 18:09:45 +00:00
|
|
|
find_package(lld)
|
2016-01-19 04:28:54 +00:00
|
|
|
|
2018-09-30 21:45:33 +01:00
|
|
|
if(APPLE AND ZIG_STATIC)
|
|
|
|
list(REMOVE_ITEM LLVM_LIBRARIES "-lz")
|
2018-03-20 11:46:31 +00:00
|
|
|
find_library(ZLIB NAMES z zlib libz)
|
2019-03-18 22:36:35 +00:00
|
|
|
list(APPEND LLVM_LIBRARIES "${ZLIB}")
|
2018-03-20 11:46:31 +00:00
|
|
|
endif()
|
|
|
|
|
2017-12-27 00:44:08 +00:00
|
|
|
set(ZIG_CPP_LIB_DIR "${CMAKE_BINARY_DIR}/zig_cpp")
|
|
|
|
|
2019-04-18 07:58:12 +01:00
|
|
|
# Handle multi-config builds and place each into a common lib. The VS generator
|
|
|
|
# for example will append a Debug folder by default if not explicitly specified.
|
|
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${ZIG_CPP_LIB_DIR})
|
|
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${ZIG_CPP_LIB_DIR})
|
|
|
|
foreach(CONFIG_TYPE ${CMAKE_CONFIGURATION_TYPES})
|
|
|
|
string(TOUPPER ${CONFIG_TYPE} CONFIG_TYPE)
|
|
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${CONFIG_TYPE} ${ZIG_CPP_LIB_DIR})
|
|
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${CONFIG_TYPE} ${ZIG_CPP_LIB_DIR})
|
|
|
|
endforeach(CONFIG_TYPE CMAKE_CONFIGURATION_TYPES)
|
|
|
|
|
2020-01-16 18:09:45 +00:00
|
|
|
include_directories(${LLVM_INCLUDE_DIRS})
|
|
|
|
include_directories(${LLD_INCLUDE_DIRS})
|
|
|
|
include_directories(${CLANG_INCLUDE_DIRS})
|
2017-03-13 15:54:56 +00:00
|
|
|
|
2018-03-09 20:06:06 +00:00
|
|
|
# No patches have been applied to SoftFloat-3e
|
2017-09-14 06:44:22 +01:00
|
|
|
set(EMBEDDED_SOFTFLOAT_SOURCES
|
2018-03-09 20:06:06 +00:00
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/f128M_isSignalingNaN.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_commonNaNToF128M.c"
|
2018-06-27 15:20:04 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_commonNaNToF16UI.c"
|
2018-03-09 20:06:06 +00:00
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_commonNaNToF32UI.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_commonNaNToF64UI.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_f128MToCommonNaN.c"
|
2018-06-27 15:20:04 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_f16UIToCommonNaN.c"
|
2018-03-09 20:06:06 +00:00
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_f32UIToCommonNaN.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_f64UIToCommonNaN.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_propagateNaNF128M.c"
|
2018-06-27 15:20:04 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_propagateNaNF16UI.c"
|
2018-03-09 20:06:06 +00:00
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/softfloat_raiseFlags.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_add.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_div.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_eq.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_eq_signaling.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_le.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_le_quiet.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_lt.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_lt_quiet.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_mul.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_mulAdd.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_rem.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_roundToInt.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_sqrt.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_sub.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_f16.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_f32.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_f64.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_i32.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_i32_r_minMag.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_i64.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_i64_r_minMag.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_ui32.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_ui32_r_minMag.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_ui64.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_ui64_r_minMag.c"
|
2018-06-27 15:20:04 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_add.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_div.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_eq.c"
|
2019-04-05 03:07:15 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_isSignalingNaN.c"
|
2018-06-27 15:20:04 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_lt.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_mul.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_rem.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_roundToInt.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_sqrt.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_sub.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_to_f128M.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_to_f64.c"
|
2018-03-09 20:06:06 +00:00
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f32_to_f128M.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f64_to_f128M.c"
|
2018-06-27 15:20:04 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f64_to_f16.c"
|
2019-03-22 18:56:03 +00:00
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/i32_to_f128M.c"
|
2018-03-09 20:06:06 +00:00
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_add256M.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_addCarryM.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_addComplCarryM.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_addF128M.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_addM.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_addMagsF16.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_addMagsF32.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_addMagsF64.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_approxRecip32_1.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_approxRecipSqrt32_1.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_approxRecipSqrt_1Ks.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_approxRecip_1Ks.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_compare128M.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_compare96M.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_countLeadingZeros16.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_countLeadingZeros32.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_countLeadingZeros64.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_countLeadingZeros8.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_eq128.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_invalidF128M.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_isNaNF128M.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_le128.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_lt128.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_mul128MTo256M.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_mul64To128M.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_mulAddF128M.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_mulAddF16.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_mulAddF32.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_mulAddF64.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_negXM.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_normRoundPackMToF128M.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_normRoundPackToF16.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_normRoundPackToF32.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_normRoundPackToF64.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_normSubnormalF128SigM.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_normSubnormalF16Sig.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_normSubnormalF32Sig.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_normSubnormalF64Sig.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_remStepMBy32.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_roundMToI64.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_roundMToUI64.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_roundPackMToF128M.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_roundPackToF16.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_roundPackToF32.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_roundPackToF64.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_roundToI32.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_roundToI64.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_roundToUI32.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_roundToUI64.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_shiftLeftM.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_shiftNormSigF128M.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_shiftRightJam256M.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_shiftRightJam32.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_shiftRightJam64.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_shiftRightJamM.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_shiftRightM.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_shortShiftLeft64To96M.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_shortShiftLeftM.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_shortShiftRightExtendM.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_shortShiftRightJam64.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_shortShiftRightJamM.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_shortShiftRightM.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_sub1XM.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_sub256M.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_subM.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_subMagsF16.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_subMagsF32.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_subMagsF64.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_tryPropagateNaNF128M.c"
|
2019-06-18 23:28:49 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_mulAdd.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_mulAdd.c"
|
2018-03-09 20:06:06 +00:00
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/softfloat_state.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/ui32_to_f128M.c"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/ui64_to_f128M.c"
|
2017-09-14 06:44:22 +01:00
|
|
|
)
|
2019-08-15 19:34:52 +01:00
|
|
|
add_library(embedded_softfloat STATIC ${EMBEDDED_SOFTFLOAT_SOURCES})
|
2017-09-14 06:44:22 +01:00
|
|
|
if(MSVC)
|
|
|
|
set_target_properties(embedded_softfloat PROPERTIES
|
2020-03-31 15:13:31 +01:00
|
|
|
COMPILE_FLAGS "/w /O2"
|
2017-09-14 06:44:22 +01:00
|
|
|
)
|
|
|
|
else()
|
|
|
|
set_target_properties(embedded_softfloat PROPERTIES
|
2018-09-10 14:46:15 +01:00
|
|
|
COMPILE_FLAGS "-std=c99 -O3"
|
2017-09-14 06:44:22 +01:00
|
|
|
)
|
|
|
|
endif()
|
|
|
|
target_include_directories(embedded_softfloat PUBLIC
|
2018-03-09 20:06:06 +00:00
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e-prebuilt"
|
|
|
|
"${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086"
|
2015-08-05 23:46:40 +01:00
|
|
|
)
|
2018-03-09 20:06:06 +00:00
|
|
|
include_directories("${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/include")
|
2017-09-14 06:44:22 +01:00
|
|
|
set(SOFTFLOAT_LIBRARIES embedded_softfloat)
|
2020-04-28 13:44:48 +01:00
|
|
|
include_directories("${CMAKE_SOURCE_DIR}/deps/dbg-macro")
|
2017-09-14 06:44:22 +01:00
|
|
|
|
|
|
|
find_package(Threads)
|
2015-08-05 23:46:40 +01:00
|
|
|
|
stage1 is now a hybrid of C++ and Zig
This modifies the build process of Zig to put all of the source files
into libcompiler.a, except main.cpp and userland.cpp.
Next, the build process links main.cpp, userland.cpp, and libcompiler.a
into zig1. userland.cpp is a shim for functions that will later be
replaced with self-hosted implementations.
Next, the build process uses zig1 to build src-self-hosted/stage1.zig
into libuserland.a, which does not depend on any of the things that
are shimmed in userland.cpp, such as translate-c.
Finally, the build process re-links main.cpp and libcompiler.a, except
with libuserland.a instead of userland.cpp. Now the shims are replaced
with .zig code. This provides all of the Zig standard library to the
stage1 C++ compiler, and enables us to move certain things to userland,
such as translate-c.
As a proof of concept I have made the `zig zen` command use text defined
in userland. I added `zig translate-c-2` which is a work-in-progress
reimplementation of translate-c in userland, which currently calls
`std.debug.panic("unimplemented")` and you can see the stack trace makes
it all the way back into the C++ main() function (Thanks LemonBoy for
improving that!).
This could potentially let us move other things into userland, such as
hashing algorithms, the entire cache system, .d file parsing, pretty
much anything that libuserland.a itself doesn't need to depend on.
This can also let us have `zig fmt` in stage1 without the overhead
of child process execution, and without the initial compilation delay
before it gets cached.
See #1964
2019-04-16 21:47:47 +01:00
|
|
|
# CMake doesn't let us create an empty executable, so we hang on to this one separately.
|
|
|
|
set(ZIG_MAIN_SRC "${CMAKE_SOURCE_DIR}/src/main.cpp")
|
|
|
|
|
2020-02-17 00:16:08 +00:00
|
|
|
# This is our shim which will be replaced by libstage2 written in Zig.
|
|
|
|
set(ZIG0_SHIM_SRC "${CMAKE_SOURCE_DIR}/src/stage2.cpp")
|
stage1 is now a hybrid of C++ and Zig
This modifies the build process of Zig to put all of the source files
into libcompiler.a, except main.cpp and userland.cpp.
Next, the build process links main.cpp, userland.cpp, and libcompiler.a
into zig1. userland.cpp is a shim for functions that will later be
replaced with self-hosted implementations.
Next, the build process uses zig1 to build src-self-hosted/stage1.zig
into libuserland.a, which does not depend on any of the things that
are shimmed in userland.cpp, such as translate-c.
Finally, the build process re-links main.cpp and libcompiler.a, except
with libuserland.a instead of userland.cpp. Now the shims are replaced
with .zig code. This provides all of the Zig standard library to the
stage1 C++ compiler, and enables us to move certain things to userland,
such as translate-c.
As a proof of concept I have made the `zig zen` command use text defined
in userland. I added `zig translate-c-2` which is a work-in-progress
reimplementation of translate-c in userland, which currently calls
`std.debug.panic("unimplemented")` and you can see the stack trace makes
it all the way back into the C++ main() function (Thanks LemonBoy for
improving that!).
This could potentially let us move other things into userland, such as
hashing algorithms, the entire cache system, .d file parsing, pretty
much anything that libuserland.a itself doesn't need to depend on.
This can also let us have `zig fmt` in stage1 without the overhead
of child process execution, and without the initial compilation delay
before it gets cached.
See #1964
2019-04-16 21:47:47 +01:00
|
|
|
|
2019-11-24 20:29:43 +00:00
|
|
|
if(ZIG_ENABLE_MEM_PROFILE)
|
2020-02-11 02:08:08 +00:00
|
|
|
set(ZIG_SOURCES_MEM_PROFILE "${CMAKE_SOURCE_DIR}/src/mem_profile.cpp")
|
2019-11-24 20:29:43 +00:00
|
|
|
endif()
|
|
|
|
|
2015-08-05 23:23:15 +01:00
|
|
|
set(ZIG_SOURCES
|
2016-09-30 07:21:21 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/analyze.cpp"
|
2016-01-28 04:10:38 +00:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/ast_render.cpp"
|
2017-06-26 19:41:47 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/bigfloat.cpp"
|
|
|
|
"${CMAKE_SOURCE_DIR}/src/bigint.cpp"
|
2016-09-30 07:21:21 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/buffer.cpp"
|
2018-09-10 14:46:15 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/cache_hash.cpp"
|
2015-12-01 02:58:53 +00:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/codegen.cpp"
|
2018-09-10 22:30:45 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/compiler.cpp"
|
2019-10-03 22:58:22 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/dump_analysis.cpp"
|
2016-09-30 07:21:21 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/errmsg.cpp"
|
2015-11-05 07:05:25 +00:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/error.cpp"
|
2019-07-21 21:21:16 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/glibc.cpp"
|
2020-02-11 02:08:08 +00:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/heap.cpp"
|
2016-12-18 21:56:50 +00:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/ir.cpp"
|
2016-10-01 01:12:00 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/ir_print.cpp"
|
2016-09-30 07:21:21 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/link.cpp"
|
2020-02-11 02:08:08 +00:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/mem.cpp"
|
2015-12-01 02:58:53 +00:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/os.cpp"
|
2016-09-30 07:21:21 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/parser.cpp"
|
2017-05-07 17:07:35 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/range_set.cpp"
|
2016-09-30 07:21:21 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/target.cpp"
|
|
|
|
"${CMAKE_SOURCE_DIR}/src/tokenizer.cpp"
|
2019-03-22 18:56:03 +00:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/util.cpp"
|
2019-11-24 20:29:43 +00:00
|
|
|
"${ZIG_SOURCES_MEM_PROFILE}"
|
2017-12-27 00:44:08 +00:00
|
|
|
)
|
2019-03-22 18:56:03 +00:00
|
|
|
set(OPTIMIZED_C_SOURCES
|
2018-09-11 22:29:18 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/blake2b.c"
|
2019-03-22 18:56:03 +00:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/parse_f128.c"
|
2018-09-10 14:46:15 +01:00
|
|
|
)
|
2017-12-27 00:44:08 +00:00
|
|
|
set(ZIG_CPP_SOURCES
|
2015-11-24 20:00:38 +00:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/zig_llvm.cpp"
|
2019-02-16 20:14:51 +00:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/zig_clang.cpp"
|
2019-02-24 17:53:28 +00:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/zig_clang_driver.cpp"
|
|
|
|
"${CMAKE_SOURCE_DIR}/src/zig_clang_cc1_main.cpp"
|
|
|
|
"${CMAKE_SOURCE_DIR}/src/zig_clang_cc1as_main.cpp"
|
2018-07-21 04:37:37 +01:00
|
|
|
"${CMAKE_SOURCE_DIR}/src/windows_sdk.cpp"
|
2015-08-05 23:23:15 +01:00
|
|
|
)
|
|
|
|
|
2018-01-05 03:46:26 +00:00
|
|
|
if(MSVC)
|
|
|
|
set(MSVC_DIA_SDK_DIR "$ENV{VSINSTALLDIR}DIA SDK")
|
2019-06-23 02:21:48 +01:00
|
|
|
if(IS_DIRECTORY ${MSVC_DIA_SDK_DIR})
|
2018-01-05 03:46:26 +00:00
|
|
|
set(ZIG_DIA_GUIDS_LIB "${MSVC_DIA_SDK_DIR}/lib/amd64/diaguids.lib")
|
|
|
|
string(REGEX REPLACE "\\\\" "\\\\\\\\" ZIG_DIA_GUIDS_LIB_ESCAPED "${ZIG_DIA_GUIDS_LIB}")
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
2017-10-01 23:29:50 +01:00
|
|
|
set(ZIG_LIB_DIR "lib/zig")
|
|
|
|
set(C_HEADERS_DEST "${ZIG_LIB_DIR}/include")
|
2019-03-05 03:15:53 +00:00
|
|
|
set(LIBC_FILES_DEST "${ZIG_LIB_DIR}/libc")
|
2019-03-06 03:45:41 +00:00
|
|
|
set(LIBUNWIND_FILES_DEST "${ZIG_LIB_DIR}/libunwind")
|
|
|
|
set(LIBCXX_FILES_DEST "${ZIG_LIB_DIR}/libcxx")
|
2017-10-01 23:29:50 +01:00
|
|
|
set(ZIG_STD_DEST "${ZIG_LIB_DIR}/std")
|
2020-04-06 18:07:19 +01:00
|
|
|
set(ZIG_CONFIG_H_OUT "${CMAKE_BINARY_DIR}/config.h")
|
2015-08-05 23:23:15 +01:00
|
|
|
configure_file (
|
|
|
|
"${CMAKE_SOURCE_DIR}/src/config.h.in"
|
2020-04-06 18:07:19 +01:00
|
|
|
"${ZIG_CONFIG_H_OUT}"
|
2015-08-05 23:23:15 +01:00
|
|
|
)
|
|
|
|
|
2015-11-26 08:29:52 +00:00
|
|
|
include_directories(
|
|
|
|
${CMAKE_SOURCE_DIR}
|
|
|
|
${CMAKE_BINARY_DIR}
|
|
|
|
"${CMAKE_SOURCE_DIR}/src"
|
|
|
|
)
|
|
|
|
|
2018-09-05 17:10:53 +01:00
|
|
|
# These have to go before the -Wno- flags
|
2020-03-31 15:13:31 +01:00
|
|
|
if(MSVC)
|
|
|
|
set(EXE_CFLAGS "/std:c++14")
|
|
|
|
else(MSVC)
|
|
|
|
set(EXE_CFLAGS "-std=c++14")
|
|
|
|
endif(MSVC)
|
|
|
|
|
2018-09-05 15:18:12 +01:00
|
|
|
if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
|
|
|
|
if(MSVC)
|
|
|
|
set(EXE_CFLAGS "${EXE_CFLAGS} /w")
|
|
|
|
else()
|
2020-05-17 09:31:19 +01:00
|
|
|
set(EXE_CFLAGS "${EXE_CFLAGS} -Werror -Wall")
|
2020-05-17 21:38:26 +01:00
|
|
|
# fallthrough support was added in GCC 7.0
|
|
|
|
if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 7.0)
|
2020-05-17 09:31:19 +01:00
|
|
|
set(EXE_CFLAGS "${EXE_CFLAGS} -Werror=implicit-fallthrough")
|
|
|
|
endif()
|
2018-09-05 15:18:12 +01:00
|
|
|
endif()
|
2016-02-17 03:34:45 +00:00
|
|
|
endif()
|
|
|
|
|
2017-09-13 05:17:19 +01:00
|
|
|
if(MSVC)
|
2019-06-23 02:21:48 +01:00
|
|
|
set(EXE_CFLAGS "${EXE_CFLAGS}")
|
2017-09-13 05:17:19 +01:00
|
|
|
else()
|
2019-09-06 22:03:34 +01:00
|
|
|
set(EXE_CFLAGS "${EXE_CFLAGS} -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -D_GNU_SOURCE -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -Werror=type-limits -Wno-missing-braces")
|
2019-06-23 02:21:48 +01:00
|
|
|
if(MINGW)
|
|
|
|
set(EXE_CFLAGS "${EXE_CFLAGS} -Wno-format")
|
|
|
|
endif()
|
2017-09-10 21:05:18 +01:00
|
|
|
endif()
|
2017-09-13 05:17:19 +01:00
|
|
|
|
2020-03-31 15:13:31 +01:00
|
|
|
if(MSVC)
|
|
|
|
set(OPTIMIZED_C_FLAGS "/O2")
|
|
|
|
else(MSVC)
|
|
|
|
set(OPTIMIZED_C_FLAGS "-std=c99 -O3")
|
|
|
|
endif(MSVC)
|
2018-09-05 15:18:12 +01:00
|
|
|
|
2016-04-23 17:57:38 +01:00
|
|
|
set(EXE_LDFLAGS " ")
|
2019-03-27 05:54:46 +00:00
|
|
|
if(MSVC)
|
2019-07-26 22:26:01 +01:00
|
|
|
set(EXE_LDFLAGS "${EXE_LDFLAGS} /STACK:16777216")
|
2019-09-08 11:07:23 +01:00
|
|
|
if(NOT "${CMAKE_BUILD_TYPE}" STREQUAL "Release" AND NOT "${CMAKE_BUILD_TYPE}" STREQUAL "MinSizeRel")
|
|
|
|
set(EXE_LDFLAGS "${EXE_LDFLAGS} /debug:fastlink")
|
|
|
|
endif()
|
2020-03-28 03:43:21 +00:00
|
|
|
elseif(MINGW)
|
2019-06-23 07:15:04 +01:00
|
|
|
set(EXE_LDFLAGS "${EXE_LDFLAGS} -Wl,--stack,16777216")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if(ZIG_STATIC)
|
2018-09-27 20:07:51 +01:00
|
|
|
if(APPLE)
|
2019-07-26 22:26:01 +01:00
|
|
|
set(EXE_LDFLAGS "${EXE_LDFLAGS} -static-libgcc -static-libstdc++")
|
2019-07-13 23:44:05 +01:00
|
|
|
elseif(MINGW)
|
2019-07-26 22:26:01 +01:00
|
|
|
set(EXE_LDFLAGS "${EXE_LDFLAGS} -static-libgcc -static-libstdc++ -Wl,-Bstatic, -lwinpthread -lz3 -lz -lgomp")
|
2019-07-27 23:54:20 +01:00
|
|
|
elseif(NOT MSVC)
|
2019-07-26 22:26:01 +01:00
|
|
|
set(EXE_LDFLAGS "${EXE_LDFLAGS} -static")
|
2018-09-27 20:07:51 +01:00
|
|
|
endif()
|
2019-07-26 22:26:01 +01:00
|
|
|
else()
|
|
|
|
if(MINGW)
|
2020-04-06 20:42:04 +01:00
|
|
|
set(EXE_LDFLAGS "${EXE_LDFLAGS}")
|
2020-03-28 03:43:21 +00:00
|
|
|
endif()
|
2017-09-23 23:46:03 +01:00
|
|
|
endif()
|
2019-06-23 07:15:04 +01:00
|
|
|
|
2016-04-23 17:57:38 +01:00
|
|
|
if(ZIG_TEST_COVERAGE)
|
|
|
|
set(EXE_CFLAGS "${EXE_CFLAGS} -fprofile-arcs -ftest-coverage")
|
2017-09-23 23:46:03 +01:00
|
|
|
set(EXE_LDFLAGS "${EXE_LDFLAGS} -fprofile-arcs -ftest-coverage")
|
2016-04-23 17:57:38 +01:00
|
|
|
endif()
|
2015-08-05 23:23:15 +01:00
|
|
|
|
2017-12-27 00:44:08 +00:00
|
|
|
add_library(zig_cpp STATIC ${ZIG_CPP_SOURCES})
|
2017-12-27 01:04:09 +00:00
|
|
|
set_target_properties(zig_cpp PROPERTIES
|
|
|
|
COMPILE_FLAGS ${EXE_CFLAGS}
|
|
|
|
)
|
2020-02-04 08:39:20 +00:00
|
|
|
target_link_libraries(zig_cpp LINK_PUBLIC
|
|
|
|
${CLANG_LIBRARIES}
|
|
|
|
${LLD_LIBRARIES}
|
|
|
|
${LLVM_LIBRARIES}
|
|
|
|
)
|
2017-12-27 00:44:08 +00:00
|
|
|
|
2019-03-22 18:56:03 +00:00
|
|
|
add_library(opt_c_util STATIC ${OPTIMIZED_C_SOURCES})
|
|
|
|
set_target_properties(opt_c_util PROPERTIES
|
|
|
|
COMPILE_FLAGS "${OPTIMIZED_C_FLAGS}"
|
2018-09-10 14:46:15 +01:00
|
|
|
)
|
|
|
|
|
2020-02-17 02:10:03 +00:00
|
|
|
add_library(zigcompiler STATIC ${ZIG_SOURCES})
|
|
|
|
set_target_properties(zigcompiler PROPERTIES
|
2016-04-23 17:57:38 +01:00
|
|
|
COMPILE_FLAGS ${EXE_CFLAGS}
|
|
|
|
LINK_FLAGS ${EXE_LDFLAGS}
|
|
|
|
)
|
2020-02-17 02:10:03 +00:00
|
|
|
target_link_libraries(zigcompiler LINK_PUBLIC
|
2017-12-27 00:44:08 +00:00
|
|
|
zig_cpp
|
2019-03-22 18:56:03 +00:00
|
|
|
opt_c_util
|
2017-09-14 06:44:22 +01:00
|
|
|
${SOFTFLOAT_LIBRARIES}
|
2017-03-30 06:18:12 +01:00
|
|
|
${CMAKE_THREAD_LIBS_INIT}
|
2015-08-05 23:23:15 +01:00
|
|
|
)
|
2018-03-10 23:23:08 +00:00
|
|
|
if(NOT MSVC)
|
2020-02-17 02:10:03 +00:00
|
|
|
target_link_libraries(zigcompiler LINK_PUBLIC ${LIBXML2})
|
2018-03-10 19:48:41 +00:00
|
|
|
endif()
|
2019-03-09 23:54:34 +00:00
|
|
|
|
2018-01-05 03:46:26 +00:00
|
|
|
if(ZIG_DIA_GUIDS_LIB)
|
2020-02-17 02:10:03 +00:00
|
|
|
target_link_libraries(zigcompiler LINK_PUBLIC ${ZIG_DIA_GUIDS_LIB})
|
2018-01-05 03:46:26 +00:00
|
|
|
endif()
|
|
|
|
|
2017-09-14 06:44:22 +01:00
|
|
|
if(MSVC OR MINGW)
|
2020-02-17 02:10:03 +00:00
|
|
|
target_link_libraries(zigcompiler LINK_PUBLIC version)
|
stage1 is now a hybrid of C++ and Zig
This modifies the build process of Zig to put all of the source files
into libcompiler.a, except main.cpp and userland.cpp.
Next, the build process links main.cpp, userland.cpp, and libcompiler.a
into zig1. userland.cpp is a shim for functions that will later be
replaced with self-hosted implementations.
Next, the build process uses zig1 to build src-self-hosted/stage1.zig
into libuserland.a, which does not depend on any of the things that
are shimmed in userland.cpp, such as translate-c.
Finally, the build process re-links main.cpp and libcompiler.a, except
with libuserland.a instead of userland.cpp. Now the shims are replaced
with .zig code. This provides all of the Zig standard library to the
stage1 C++ compiler, and enables us to move certain things to userland,
such as translate-c.
As a proof of concept I have made the `zig zen` command use text defined
in userland. I added `zig translate-c-2` which is a work-in-progress
reimplementation of translate-c in userland, which currently calls
`std.debug.panic("unimplemented")` and you can see the stack trace makes
it all the way back into the C++ main() function (Thanks LemonBoy for
improving that!).
This could potentially let us move other things into userland, such as
hashing algorithms, the entire cache system, .d file parsing, pretty
much anything that libuserland.a itself doesn't need to depend on.
This can also let us have `zig fmt` in stage1 without the overhead
of child process execution, and without the initial compilation delay
before it gets cached.
See #1964
2019-04-16 21:47:47 +01:00
|
|
|
endif()
|
|
|
|
|
2019-04-17 19:09:18 +01:00
|
|
|
add_executable(zig0 "${ZIG_MAIN_SRC}" "${ZIG0_SHIM_SRC}")
|
|
|
|
set_target_properties(zig0 PROPERTIES
|
stage1 is now a hybrid of C++ and Zig
This modifies the build process of Zig to put all of the source files
into libcompiler.a, except main.cpp and userland.cpp.
Next, the build process links main.cpp, userland.cpp, and libcompiler.a
into zig1. userland.cpp is a shim for functions that will later be
replaced with self-hosted implementations.
Next, the build process uses zig1 to build src-self-hosted/stage1.zig
into libuserland.a, which does not depend on any of the things that
are shimmed in userland.cpp, such as translate-c.
Finally, the build process re-links main.cpp and libcompiler.a, except
with libuserland.a instead of userland.cpp. Now the shims are replaced
with .zig code. This provides all of the Zig standard library to the
stage1 C++ compiler, and enables us to move certain things to userland,
such as translate-c.
As a proof of concept I have made the `zig zen` command use text defined
in userland. I added `zig translate-c-2` which is a work-in-progress
reimplementation of translate-c in userland, which currently calls
`std.debug.panic("unimplemented")` and you can see the stack trace makes
it all the way back into the C++ main() function (Thanks LemonBoy for
improving that!).
This could potentially let us move other things into userland, such as
hashing algorithms, the entire cache system, .d file parsing, pretty
much anything that libuserland.a itself doesn't need to depend on.
This can also let us have `zig fmt` in stage1 without the overhead
of child process execution, and without the initial compilation delay
before it gets cached.
See #1964
2019-04-16 21:47:47 +01:00
|
|
|
COMPILE_FLAGS ${EXE_CFLAGS}
|
|
|
|
LINK_FLAGS ${EXE_LDFLAGS}
|
|
|
|
)
|
2020-02-17 02:10:03 +00:00
|
|
|
target_link_libraries(zig0 zigcompiler)
|
stage1 is now a hybrid of C++ and Zig
This modifies the build process of Zig to put all of the source files
into libcompiler.a, except main.cpp and userland.cpp.
Next, the build process links main.cpp, userland.cpp, and libcompiler.a
into zig1. userland.cpp is a shim for functions that will later be
replaced with self-hosted implementations.
Next, the build process uses zig1 to build src-self-hosted/stage1.zig
into libuserland.a, which does not depend on any of the things that
are shimmed in userland.cpp, such as translate-c.
Finally, the build process re-links main.cpp and libcompiler.a, except
with libuserland.a instead of userland.cpp. Now the shims are replaced
with .zig code. This provides all of the Zig standard library to the
stage1 C++ compiler, and enables us to move certain things to userland,
such as translate-c.
As a proof of concept I have made the `zig zen` command use text defined
in userland. I added `zig translate-c-2` which is a work-in-progress
reimplementation of translate-c in userland, which currently calls
`std.debug.panic("unimplemented")` and you can see the stack trace makes
it all the way back into the C++ main() function (Thanks LemonBoy for
improving that!).
This could potentially let us move other things into userland, such as
hashing algorithms, the entire cache system, .d file parsing, pretty
much anything that libuserland.a itself doesn't need to depend on.
This can also let us have `zig fmt` in stage1 without the overhead
of child process execution, and without the initial compilation delay
before it gets cached.
See #1964
2019-04-16 21:47:47 +01:00
|
|
|
|
2019-07-13 00:28:28 +01:00
|
|
|
if(MSVC)
|
2020-02-17 02:10:03 +00:00
|
|
|
set(LIBSTAGE2 "${CMAKE_BINARY_DIR}/zigstage2.lib")
|
stage1 is now a hybrid of C++ and Zig
This modifies the build process of Zig to put all of the source files
into libcompiler.a, except main.cpp and userland.cpp.
Next, the build process links main.cpp, userland.cpp, and libcompiler.a
into zig1. userland.cpp is a shim for functions that will later be
replaced with self-hosted implementations.
Next, the build process uses zig1 to build src-self-hosted/stage1.zig
into libuserland.a, which does not depend on any of the things that
are shimmed in userland.cpp, such as translate-c.
Finally, the build process re-links main.cpp and libcompiler.a, except
with libuserland.a instead of userland.cpp. Now the shims are replaced
with .zig code. This provides all of the Zig standard library to the
stage1 C++ compiler, and enables us to move certain things to userland,
such as translate-c.
As a proof of concept I have made the `zig zen` command use text defined
in userland. I added `zig translate-c-2` which is a work-in-progress
reimplementation of translate-c in userland, which currently calls
`std.debug.panic("unimplemented")` and you can see the stack trace makes
it all the way back into the C++ main() function (Thanks LemonBoy for
improving that!).
This could potentially let us move other things into userland, such as
hashing algorithms, the entire cache system, .d file parsing, pretty
much anything that libuserland.a itself doesn't need to depend on.
This can also let us have `zig fmt` in stage1 without the overhead
of child process execution, and without the initial compilation delay
before it gets cached.
See #1964
2019-04-16 21:47:47 +01:00
|
|
|
else()
|
2020-02-17 02:10:03 +00:00
|
|
|
set(LIBSTAGE2 "${CMAKE_BINARY_DIR}/libzigstage2.a")
|
2017-09-10 21:05:18 +01:00
|
|
|
endif()
|
2019-09-09 14:33:33 +01:00
|
|
|
if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
|
2020-02-17 00:16:08 +00:00
|
|
|
set(LIBSTAGE2_RELEASE_ARG "")
|
2019-09-09 14:33:33 +01:00
|
|
|
else()
|
2020-02-17 00:16:08 +00:00
|
|
|
set(LIBSTAGE2_RELEASE_ARG --release-fast --strip)
|
2020-02-16 23:57:34 +00:00
|
|
|
endif()
|
2020-01-18 00:39:43 +00:00
|
|
|
|
2020-02-17 00:16:08 +00:00
|
|
|
set(BUILD_LIBSTAGE2_ARGS "build-lib"
|
2020-02-17 02:10:03 +00:00
|
|
|
"src-self-hosted/stage2.zig"
|
2020-03-28 03:43:21 +00:00
|
|
|
-target "${ZIG_TARGET_TRIPLE}"
|
2020-04-08 22:41:51 +01:00
|
|
|
"-mcpu=${ZIG_TARGET_MCPU}"
|
2020-02-17 02:10:03 +00:00
|
|
|
--name zigstage2
|
2020-01-18 00:39:43 +00:00
|
|
|
--override-lib-dir "${CMAKE_SOURCE_DIR}/lib"
|
2020-02-16 23:57:34 +00:00
|
|
|
--cache on
|
|
|
|
--output-dir "${CMAKE_BINARY_DIR}"
|
2020-02-17 00:16:08 +00:00
|
|
|
${LIBSTAGE2_RELEASE_ARG}
|
2020-02-16 23:57:34 +00:00
|
|
|
--bundle-compiler-rt
|
|
|
|
-fPIC
|
|
|
|
-lc
|
2020-01-18 00:39:43 +00:00
|
|
|
)
|
|
|
|
|
2020-03-28 03:43:21 +00:00
|
|
|
if("${ZIG_TARGET_TRIPLE}" STREQUAL "native")
|
|
|
|
add_custom_target(zig_build_libstage2 ALL
|
|
|
|
COMMAND zig0 ${BUILD_LIBSTAGE2_ARGS}
|
|
|
|
DEPENDS zig0
|
|
|
|
BYPRODUCTS "${LIBSTAGE2}"
|
|
|
|
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
|
|
|
|
)
|
|
|
|
set(ZIG_EXECUTABLE "${zig_BINARY_DIR}/zig")
|
2020-04-11 21:18:54 +01:00
|
|
|
if (WIN32)
|
|
|
|
set(ZIG_EXECUTABLE "${ZIG_EXECUTABLE}.exe")
|
|
|
|
endif()
|
2020-03-28 03:43:21 +00:00
|
|
|
else()
|
|
|
|
add_custom_target(zig_build_libstage2 ALL
|
|
|
|
COMMAND "${ZIG_EXECUTABLE}" ${BUILD_LIBSTAGE2_ARGS}
|
|
|
|
BYPRODUCTS "${LIBSTAGE2}"
|
|
|
|
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
|
|
|
|
)
|
|
|
|
endif()
|
|
|
|
|
stage1 is now a hybrid of C++ and Zig
This modifies the build process of Zig to put all of the source files
into libcompiler.a, except main.cpp and userland.cpp.
Next, the build process links main.cpp, userland.cpp, and libcompiler.a
into zig1. userland.cpp is a shim for functions that will later be
replaced with self-hosted implementations.
Next, the build process uses zig1 to build src-self-hosted/stage1.zig
into libuserland.a, which does not depend on any of the things that
are shimmed in userland.cpp, such as translate-c.
Finally, the build process re-links main.cpp and libcompiler.a, except
with libuserland.a instead of userland.cpp. Now the shims are replaced
with .zig code. This provides all of the Zig standard library to the
stage1 C++ compiler, and enables us to move certain things to userland,
such as translate-c.
As a proof of concept I have made the `zig zen` command use text defined
in userland. I added `zig translate-c-2` which is a work-in-progress
reimplementation of translate-c in userland, which currently calls
`std.debug.panic("unimplemented")` and you can see the stack trace makes
it all the way back into the C++ main() function (Thanks LemonBoy for
improving that!).
This could potentially let us move other things into userland, such as
hashing algorithms, the entire cache system, .d file parsing, pretty
much anything that libuserland.a itself doesn't need to depend on.
This can also let us have `zig fmt` in stage1 without the overhead
of child process execution, and without the initial compilation delay
before it gets cached.
See #1964
2019-04-16 21:47:47 +01:00
|
|
|
add_executable(zig "${ZIG_MAIN_SRC}")
|
2019-07-13 00:28:28 +01:00
|
|
|
|
stage1 is now a hybrid of C++ and Zig
This modifies the build process of Zig to put all of the source files
into libcompiler.a, except main.cpp and userland.cpp.
Next, the build process links main.cpp, userland.cpp, and libcompiler.a
into zig1. userland.cpp is a shim for functions that will later be
replaced with self-hosted implementations.
Next, the build process uses zig1 to build src-self-hosted/stage1.zig
into libuserland.a, which does not depend on any of the things that
are shimmed in userland.cpp, such as translate-c.
Finally, the build process re-links main.cpp and libcompiler.a, except
with libuserland.a instead of userland.cpp. Now the shims are replaced
with .zig code. This provides all of the Zig standard library to the
stage1 C++ compiler, and enables us to move certain things to userland,
such as translate-c.
As a proof of concept I have made the `zig zen` command use text defined
in userland. I added `zig translate-c-2` which is a work-in-progress
reimplementation of translate-c in userland, which currently calls
`std.debug.panic("unimplemented")` and you can see the stack trace makes
it all the way back into the C++ main() function (Thanks LemonBoy for
improving that!).
This could potentially let us move other things into userland, such as
hashing algorithms, the entire cache system, .d file parsing, pretty
much anything that libuserland.a itself doesn't need to depend on.
This can also let us have `zig fmt` in stage1 without the overhead
of child process execution, and without the initial compilation delay
before it gets cached.
See #1964
2019-04-16 21:47:47 +01:00
|
|
|
set_target_properties(zig PROPERTIES
|
|
|
|
COMPILE_FLAGS ${EXE_CFLAGS}
|
|
|
|
LINK_FLAGS ${EXE_LDFLAGS}
|
|
|
|
)
|
2020-02-17 02:10:03 +00:00
|
|
|
target_link_libraries(zig zigcompiler "${LIBSTAGE2}")
|
2019-10-22 00:17:33 +01:00
|
|
|
if(MSVC)
|
|
|
|
target_link_libraries(zig ntdll.lib)
|
2020-03-28 03:43:21 +00:00
|
|
|
elseif(MINGW)
|
2019-10-23 01:34:34 +01:00
|
|
|
target_link_libraries(zig ntdll)
|
2019-10-22 00:17:33 +01:00
|
|
|
endif()
|
2020-02-17 00:16:08 +00:00
|
|
|
add_dependencies(zig zig_build_libstage2)
|
2020-01-18 00:39:43 +00:00
|
|
|
|
2015-08-05 23:23:15 +01:00
|
|
|
install(TARGETS zig DESTINATION bin)
|
2020-01-18 00:39:43 +00:00
|
|
|
|
2020-02-16 23:57:34 +00:00
|
|
|
set(ZIG_INSTALL_ARGS "build"
|
|
|
|
--override-lib-dir "${CMAKE_SOURCE_DIR}/lib"
|
|
|
|
"-Dlib-files-only"
|
|
|
|
--prefix "${CMAKE_INSTALL_PREFIX}"
|
2020-04-06 18:07:19 +01:00
|
|
|
"-Dconfig_h=${ZIG_CONFIG_H_OUT}"
|
2020-02-16 23:57:34 +00:00
|
|
|
install
|
|
|
|
)
|
|
|
|
|
|
|
|
# CODE has no effect with Visual Studio build system generator, therefore
|
|
|
|
# when using Visual Studio build system generator we resort to running
|
|
|
|
# `zig build install` during the build phase.
|
|
|
|
if(MSVC)
|
|
|
|
set(ZIG_SKIP_INSTALL_LIB_FILES off CACHE BOOL
|
|
|
|
"Windows-only: Disable copying lib/ files to install prefix during the build phase")
|
|
|
|
if(NOT ZIG_SKIP_INSTALL_LIB_FILES)
|
|
|
|
add_custom_target(zig_install_lib_files ALL
|
|
|
|
COMMAND zig ${ZIG_INSTALL_ARGS}
|
|
|
|
DEPENDS zig
|
|
|
|
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
|
|
|
|
)
|
|
|
|
endif()
|
|
|
|
else()
|
|
|
|
get_target_property(zig_BINARY_DIR zig BINARY_DIR)
|
2020-03-28 03:43:21 +00:00
|
|
|
install(CODE "set(zig_EXE \"${ZIG_EXECUTABLE}\")")
|
2020-02-16 23:57:34 +00:00
|
|
|
install(CODE "set(ZIG_INSTALL_ARGS \"${ZIG_INSTALL_ARGS}\")")
|
2020-01-18 00:39:43 +00:00
|
|
|
install(CODE "set(CMAKE_SOURCE_DIR \"${CMAKE_SOURCE_DIR}\")")
|
|
|
|
install(SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/cmake/install.cmake)
|
|
|
|
endif()
|