3 include(CheckFunctionExists)
5 # Still not as one shared lib with win32
7 set(USE_DEVICES_SHARED_LIB OFF)
10 if(USE_DEVICES_SHARED_LIB)
11 add_definitions(-DUSE_SHARED_DLL)
12 add_definitions(-DUSE_SHARED_UI_DLL)
13 add_definitions(-DUSE_SHARED_DEVICES_DLL)
18 find_program(USE_CCACHE ccache)
20 SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
24 FIND_PACKAGE(Qt5Core REQUIRED)
26 FIND_PACKAGE(Qt5Widgets REQUIRED)
28 FIND_PACKAGE(Qt5Gui REQUIRED)
29 FIND_PACKAGE(Qt5OpenGL REQUIRED)
30 include_directories(${Qt5Widgets_INCLUDE_DIRS})
31 include_directories(${Qt5Core_INCLUDE_DIRS})
32 include_directories(${Qt5Gui_INCLUDE_DIRS})
33 include_directories(${Qt5OpenGL_INCLUDE_DIRS})
34 add_definitions(-D_USE_OPENGL -DUSE_OPENGL)
35 if(DEFINED QT5_ROOT_PATH)
36 SET(CMAKE_FIND_ROOT_PATH ${QT5_ROOT_PATH} ${CMAKE_FIND_ROOT_PATH})
40 function(APPEND_SOCKET_FEATURE)
42 FIND_PACKAGE(Qt5Network REQUIRED)
43 include_directories(${Qt5Network_INCLUDE_DIRS})
45 endfunction(APPEND_SOCKET_FEATURE)
48 set(USE_QT5_4_APIS ON CACHE BOOL "Build with Qt5.4 (or later) APIs if you can.")
49 set(USE_GCC_OLD_ABI ON CACHE BOOL "Build with older GCC ABIs if you can.")
50 set(USE_SDL2 ON CACHE BOOL "Build with libSDL2. DIsable is building with libSDL1.")
51 set(USE_MOVIE_SAVER ON CACHE BOOL "Save screen/audio as MP4 MOVIE. Needs libav .")
52 set(USE_MOVIE_LOADER ON CACHE BOOL "Load movie from screen for some VMs. Needs libav .")
53 set(USE_LTO ON CACHE BOOL "Use link-time-optimization to build.")
54 set(USE_OPENMP OFF CACHE BOOL "Build using OpenMP")
55 set(USE_OPENGL ON CACHE BOOL "Build using OpenGL")
58 set_property(TARGET PROPERTY INTERPROCEDURAL_OPTIMIZATION ON)
60 set_property(TARGET PROPERTY INTERPROCEDURAL_OPTIMIZATION OFF)
63 add_definitions(-D_USE_QT5)
66 add_definitions(-D_USE_QT_5_4)
68 #add_definitions(-DQT_NO_VERSION_TAGGING)
72 add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
74 add_definitions(-D_GLIBCXX_USE_CXX11_ABI=1)
77 SET(CMAKE_AUTOMOC OFF)
79 SET(CMAKE_INCLUDE_CURRENT_DIR ON)
81 add_definitions(-D_USE_QT)
82 add_definitions(-DUSE_QT)
83 add_definitions(-DQT_MAJOR_VERSION=${Qt5Widgets_VERSION_MAJOR})
84 add_definitions(-DQT_MINOR_VERSION=${Qt5Widgets_VERSION_MINOR})
88 include_directories(${OPENMP_INCLUDE_PATH})
90 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
91 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
96 include_directories(${THREADS_INCLUDE_PATH})
98 include(FindPkgConfig)
102 execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD OUTPUT_VARIABLE __tstr)
103 string(FIND ${__tstr} "fatal" __notfound)
104 string(REPLACE "\n" "" __tstr2 ${__tstr})
105 if(${__notfound} EQUAL -1)
106 add_definitions(-D__GIT_REPO_VERSION=\"${__tstr2}\")
108 add_definitions(-U__GIT_REPO_VERSION)
112 string(TIMESTAMP __build_date "%b %d,%Y %H:%M:%S UTC" UTC)
113 add_definitions(-D__BUILD_DATE=\"${__build_date}\")
117 add_definitions(-DUSE_LIBAV)
119 add_definitions(-DUSE_MOVIE_SAVER)
122 add_definitions(-DUSE_MOVIE_LOADER)
124 add_definitions(-D__STDC_CONSTANT_MACROS)
125 add_definitions(-D__STDC_FORMAT_MACROS)
127 set(USE_MOVIE_SAVER OFF)
128 set(USE_MOVIE_LOADER OFF)
129 set(LIBAV_LIBRARIES "")
133 if(CMAKE_CROSSCOMPILING)
134 include_directories(${SDL2_INCLUDE_DIRS})
136 pkg_search_module(SDL2 REQUIRED sdl2)
137 include_directories(${SDL2_INCLUDE_DIRS})
139 set(SDL_LIBS ${SDL2_LIBRARIES})
140 add_definitions(-DUSE_SDL2)
142 if(CMAKE_CROSSCOMPILING)
143 include_directories(${SDL_INCLUDE_DIRS})
144 set(SDL_LIBS ${SDL_LIBRARIES})
147 #pkg_search_module(SDL REQUIRED sdl)
148 #include_directories(${SDL_INCLUDE_DIRS})
149 include_directories(${SDL_INCLUDE_DIR})
150 set(SDL_LIBS ${SDL_LIBRARY})
156 add_definitions(-DUSE_ZLIB)
157 include_directories(${ZLIB_INCLUDE_DIRS})
161 if(CMAKE_COMPILER_IS_GNUCC)
162 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -flax-vector-conversions")
165 if(CMAKE_COMPILER_IS_GNUCXX)
166 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpermissive -flax-vector-conversions")
170 check_function_exists("nanosleep" HAVE_NANOSLEEP)
171 if(NOT HAVE_NANOSLEEP)
172 check_library_exists("rt" "nanosleep" "" LIB_RT_HAS_NANOSLEEP)
173 endif(NOT HAVE_NANOSLEEP)
175 if(LIB_RT_HAS_NANOSLEEP)
176 add_target_library(${EXEC_TARGET} rt)
177 endif(LIB_RT_HAS_NANOSLEEP)
179 if(HAVE_NANOSLEEP OR LIB_RT_HAS_NANOSLEEP)
180 add_definitions(-DHAVE_NANOSLEEP)
181 endif(HAVE_NANOSLEEP OR LIB_RT_HAS_NANOSLEEP)
184 set(SRC_BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../src)
188 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
189 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
196 include_directories(${LIBAV_INCLUDE_DIRS})
201 "${PROJECT_SOURCE_DIR}/src"
202 "${PROJECT_SOURCE_DIR}/src/vm"
203 "${PROJECT_SOURCE_DIR}/src/qt/common"
204 "${PROJECT_SOURCE_DIR}/src/qt/gui"
205 "${PROJECT_SOURCE_DIR}/src/qt/debugger"
206 "${PROJECT_SOURCE_DIR}/src/qt"
209 #find_library(AVCODEC_LIBRARY avcodec)
210 add_subdirectory("${PROJECT_SOURCE_DIR}/src/qt" osd)
211 add_subdirectory("${PROJECT_SOURCE_DIR}/src/qt/avio" qt/avio)
212 add_subdirectory("${PROJECT_SOURCE_DIR}/src/qt/gui" qt/gui)
213 add_subdirectory("${PROJECT_SOURCE_DIR}/src/qt/emuutils" emu_utils)
214 if(USE_DEVICES_SHARED_LIB)
215 add_subdirectory("${PROJECT_SOURCE_DIR}/src/vm/common_vm" vm/)
216 add_subdirectory("${PROJECT_SOURCE_DIR}/src/vm/fmgen" vm/fmgen)
218 add_subdirectory("${PROJECT_SOURCE_DIR}/src" common)
219 add_subdirectory("${PROJECT_SOURCE_DIR}/src/vm" vm)
222 function(ADD_VM VM_NAME EXE_NAME VMDEF)
223 set(COMMON_DIRECTORY ${PROJECT_SOURCE_DIR}/src/qt/common)
224 set(s_qt_common_headers
225 ${COMMON_DIRECTORY}/emu_thread.h
226 ${COMMON_DIRECTORY}/mainwidget.h
227 ${COMMON_DIRECTORY}/../osd.h
230 set(s_qt_common_headers ${s_qt_common_headers} ${COMMON_DIRECTORY}/../osd_socket.h)
232 QT5_WRAP_CPP(s_qt_common_headers_MOC ${s_qt_common_headers})
234 ${COMMON_DIRECTORY}/main.cpp
235 ${COMMON_DIRECTORY}/qt_utils.cpp
236 ${COMMON_DIRECTORY}/menu_flags.cpp
237 ${COMMON_DIRECTORY}/emu_thread.cpp
238 ${COMMON_DIRECTORY}/emu_thread_slots.cpp
239 ${COMMON_DIRECTORY}/util_bubble2.cpp
240 ${COMMON_DIRECTORY}/util_main.cpp
241 ${COMMON_DIRECTORY}/../osd.cpp
242 ${COMMON_DIRECTORY}/../osd_wrapper.cpp
246 add_executable(${EXE_NAME} WIN32
247 ${PROJECT_SOURCE_DIR}/src/vm/event.cpp
249 ${PROJECT_SOURCE_DIR}/src/emu.cpp
250 ${COMMON_DIRECTORY}/../gui/qt_main.cpp
252 ${s_qt_common_headers_MOC}
255 add_executable(${EXE_NAME}
256 ${PROJECT_SOURCE_DIR}/src/vm/event.cpp
258 ${PROJECT_SOURCE_DIR}/src/emu.cpp
260 ${s_qt_common_headers_MOC}
264 QT5_USE_MODULES(${EXE_NAME} Widgets Core Gui OpenGL Network)
266 QT5_USE_MODULES(${EXE_NAME} Widgets Core Gui OpenGL)
268 target_include_directories(${EXE_NAME}
269 PRIVATE "${PROJECT_SOURCE_DIR}/src/qt/machines/${VM_NAME}"
270 PRIVATE "${PROJECT_SOURCE_DIR}/src/vm/${VM_NAME}"
273 target_include_directories(${EXE_NAME} PUBLIC
274 "${PROJECT_SOURCE_DIR}/src/qt/avio"
278 set(DEBUG_LIBS qt_debugger_${EXE_NAME})
279 # target_include_directories(${EXE_NAME} PUBLIC
280 # PUBLIC "${PROJECT_SOURCE_DIR}/src/qt/debugger"
285 if(NOT USE_DEVICES_SHARED_LIB)
287 set(VM_APPEND_LIBS fmgen)
321 ${ADDITIONAL_LIBRARIES}
325 add_definitions(-D_UNICODE)
329 ${ADDITIONAL_LIBRARIES}
354 if(USE_DEVICES_SHARED_LIB)
372 add_subdirectory("${PROJECT_SOURCE_DIR}/src" common/${EXE_NAME} EXCLUDE_FROM_ALL)
373 add_subdirectory("${PROJECT_SOURCE_DIR}/src/vm/${VM_NAME}" vm/${EXE_NAME} EXCLUDE_FROM_ALL)
374 if(NOT USE_DEVICES_SHARED_LIB)
376 add_subdirectory("${PROJECT_SOURCE_DIR}/src/vm/fmgen" vm/fmgen_${EXE_NAME} EXCLUDE_FROM_ALL)
379 add_subdirectory("${PROJECT_SOURCE_DIR}/src/qt/machines/${VM_NAME}" qt/${EXE_NAME} EXCLUDE_FROM_ALL)
381 add_subdirectory("${PROJECT_SOURCE_DIR}/src/qt/debugger" qt/debugger_${EXE_NAME} EXCLUDE_FROM_ALL)
383 # add_subdirectory("${PROJECT_SOURCE_DIR}/src/qt/common" qt/common EXCLUDE_FROM_ALL)
384 add_dependencies(${EXE_NAME}
392 qt_debugger_${EXE_NAME}
395 target_compile_definitions(${EXE_NAME}
398 target_compile_definitions(vm_${EXE_NAME}
401 target_compile_definitions(qt_${EXE_NAME}
404 target_compile_definitions(qt_debugger_${EXE_NAME}
407 target_compile_definitions(common_${EXE_NAME}
412 target_link_libraries(${EXE_NAME}
418 target_link_libraries(${EXE_NAME}
423 install(TARGETS ${EXE_NAME} DESTINATION bin)