1
2####################################
3function(backend NAME DIR TARGET)
4	message(STATUS "In target ${TARGET}: include ${NAME} backend")
5	target_compile_definitions (${TARGET} PRIVATE -D${NAME}_BUILD)
6	if (NOT "${DIR}" STREQUAL "")
7		file (GLOB BACKEND_SRC	${SRCDIR}/generator/${DIR}/*.cpp ${SRCDIR}/generator/${DIR}/*.hh)
8		target_sources (${TARGET} PRIVATE ${BACKEND_SRC})
9		target_include_directories (${TARGET} PRIVATE ${SRCDIR}/generator/${DIR})
10	endif()
11endfunction()
12
13####################################
14function (scan_backends TARGET FLAG)
15	string (FIND "${C_BACKEND}" ${FLAG} POS)
16	if (${POS} GREATER -1)
17		backend (C c ${TARGET})
18	endif()
19	string (FIND "${CPP_BACKEND}" ${FLAG} POS)
20	if (${POS} GREATER -1)
21		backend (CPP cpp ${TARGET})
22	endif()
23	string (FIND "${CSHARP_BACKEND}" ${FLAG} POS)
24	if (${POS} GREATER -1)
25		backend (CSHARP csharp ${TARGET})
26	endif()
27	string (FIND "${DLANG_BACKEND}" ${FLAG} POS)
28	if (${POS} GREATER -1)
29		backend (DLANG dlang ${TARGET})
30	endif()
31	string (FIND "${FIR_BACKEND}" ${FLAG} POS)
32	if (${POS} GREATER -1)
33		backend (FIR "" ${TARGET})
34	endif()
35	string (FIND "${INTERP_BACKEND}" ${FLAG} POS)
36	if (${POS} GREATER -1)
37		backend (INTERP interpreter ${TARGET})
38	endif()
39	string (FIND "${JAVA_BACKEND}" ${FLAG} POS)
40	if (${POS} GREATER -1)
41		backend (JAVA java ${TARGET})
42	endif()
43	string (FIND "${JULIA_BACKEND}" ${FLAG} POS)
44	if (${POS} GREATER -1)
45		backend (JULIA julia ${TARGET})
46	endif()
47	string (FIND "${OLDCPP_BACKEND}" ${FLAG} POS)
48	if (${POS} GREATER -1)
49		backend (OCPP "" ${TARGET})
50	endif()
51	string (FIND "${RUST_BACKEND}" ${FLAG} POS)
52	if (${POS} GREATER -1)
53		backend (RUST rust ${TARGET})
54	endif()
55	string (FIND "${SOUL_BACKEND}" ${FLAG} POS)
56	if (${POS} GREATER -1)
57		backend (SOUL soul ${TARGET})
58	endif()
59	string (FIND "${WASM_BACKEND}" ${FLAG} POS)
60	if (${POS} GREATER -1)
61		backend (WASM wasm ${TARGET})
62	endif()
63	string (FIND "${LLVM_BACKEND}" ${FLAG} POS)
64	if (${POS} GREATER -1)
65		backend (LLVM llvm ${TARGET})
66		target_compile_definitions (${TARGET} PRIVATE -D${LLVM_VERSION})
67		target_include_directories (${TARGET} PRIVATE ${SRCDIR}/generator/c ${SRCDIR}/generator/cpp  ${LLVM_INCLUDE_DIRS})
68	endif()
69endfunction()
70
71####################################
72# Manual LLVM scan
73macro (llvm_config)
74	if ( NOT DEFINED LLVM_CONFIG)
75		set (LLVM_CONFIG llvm-config)
76	endif()
77	find_program (LC ${LLVM_CONFIG})
78	if (${LC} STREQUAL LC-NOTFOUND)
79		message (FATAL_ERROR "Cannot find program ${LLVM_CONFIG} (llvm-config or derived expected)")
80	endif()
81	execute_process (COMMAND ${LLVM_CONFIG} --version OUTPUT_VARIABLE LLVM_VERSION)
82	string ( STRIP ${LLVM_VERSION} LLVM_PACKAGE_VERSION )
83	message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
84
85	execute_process (COMMAND ${LLVM_CONFIG} --includedir OUTPUT_VARIABLE LLVM_INCLUDE)
86	string ( STRIP ${LLVM_INCLUDE} LLVM_INCLUDE_DIRS )
87	execute_process (COMMAND ${LLVM_CONFIG} --ldflags OUTPUT_VARIABLE LLVM_LDFLAGS_TMP)
88	string ( STRIP ${LLVM_LDFLAGS_TMP} LLVM_LD_FLAGS )
89	execute_process (COMMAND ${LLVM_CONFIG}  --libs OUTPUT_VARIABLE LLVM_LIBS_TMP)
90	string ( STRIP ${LLVM_LIBS_TMP} LLVM_LIBS_TMP2 )
91	string ( REPLACE "C:\\Program Files\\LLVM\\lib\\" "" LLVM_LIBS ${LLVM_LIBS_TMP2})
92	execute_process (COMMAND ${LLVM_CONFIG}  --system-libs OUTPUT_VARIABLE LLVM_SYS_LIBS_TMP)
93	string ( STRIP ${LLVM_SYS_LIBS_TMP} LLVM_SYS_LIBS)
94
95    string ( APPEND LLVM_LIBS " ${LLVM_SYS_LIBS}")
96    string ( REPLACE " " ";" LLVM_LIBS ${LLVM_LIBS} )
97endmacro()
98
99####################################
100# cmake LLVM scan
101macro (llvm_cmake)
102	find_package(LLVM REQUIRED CONFIG)
103	if (COMMAND llvm_map_components_to_libnames)
104		message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
105		message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")
106		# Find the libraries that correspond to the LLVM components that we wish to use
107		llvm_map_components_to_libnames(LLVM_LIBS all)
108#		list(REMOVE_ITEM LLVM_LIBS LTO)
109	else()
110		llvm_config()
111	endif()
112endmacro()
113
114
115####################################
116macro (include_llvm)
117	set (INCLUDE_LLVM off)
118	if (LLVM_BACKEND)
119		string (FIND "${LLVM_BACKEND}" "STATIC"  POS)
120		if (${POS} GREATER -1 AND INCLUDE_STATIC)
121			set (INCLUDE_LLVM on)
122		endif()
123		string (FIND "${LLVM_BACKEND}" "DYNAMIC" POS)
124		if (${POS} GREATER -1 AND INCLUDE_DYNAMIC)
125			set (INCLUDE_LLVM on)
126		endif()
127		string (FIND "${LLVM_BACKEND}" "COMPILER"  POS)
128		if (${POS} GREATER -1)
129			set (INCLUDE_LLVM on)
130		endif()
131	endif()
132endmacro()
133
134include_llvm()
135