cmake_minimum_required(VERSION 3.5) set(CMAKE_CONFIGURATION_TYPES Debug Release CACHE TYPE INTERNAL FORCE) project (ZeldaClassic) set(USE_PCH FALSE CACHE BOOL "Use precompiled headers") set(UNITY_BUILD FALSE CACHE BOOL "Unity build") set(CMAKE_CXX_STANDARD 98) set(CMAKE_CXX_STANDARD_REQUIRED ON) option(WANT_ZSCRIPT "Enable ZScript Compiler" on) if(UNIX AND NOT APPLE) set(LINUX TRUE) endif() function(enable_unity_build UB_SUFFIX SOURCE_VARIABLE_NAME) set(files ${${SOURCE_VARIABLE_NAME}}) # Generate a unique filename for the unity build translation unit set(unit_build_file ${CMAKE_CURRENT_BINARY_DIR}/UB_${UB_SUFFIX}.cpp) # Exclude all translation units from compilation set_source_files_properties(${files} PROPERTIES HEADER_FILE_ONLY true) # Open the ub file FILE(WRITE ${unit_build_file} "// Unity Build generated by CMake\n") FILE(APPEND ${unit_build_file} "#include \"${CMAKE_SOURCE_DIR}/src/precompiled.h\"\n") # Add include statement for each translation unit foreach(source_file ${files} ) FILE( APPEND ${unit_build_file} "#include <${CMAKE_CURRENT_SOURCE_DIR}/${source_file}>\n") endforeach(source_file) # Complement list of translation units with the name of ub set(${SOURCE_VARIABLE_NAME} ${${SOURCE_VARIABLE_NAME}} ${unit_build_file} PARENT_SCOPE) endfunction(enable_unity_build) ############################################################# # Header and source file lists ############################################################# include_directories(./allegro/include) include_directories(./include/lpng1212) include_directories(./include/zlib123) include_directories(./include/loadpng) include_directories(./include/jpgalleg-2.5) include_directories(./include/dumb) include_directories(./include/alogg) include_directories(./include/almp3) include_directories(./include/gme) set(ZCSOUNDSOURCES src/zcmusic.cpp src/zcmusicd.cpp src/alleg_compat.cpp ) set(ROMVIEW_MODULES ${CMAKE_SOURCE_DIR}/modules/romview/RomviewCore.txt ${CMAKE_SOURCE_DIR}/modules/romview/RomviewGUI.txt ) set(ZELDA_MODULES ${CMAKE_SOURCE_DIR}/modules/zelda/ZeldaCore.txt ${CMAKE_SOURCE_DIR}/modules/zelda/ZeldaGUI.txt ${CMAKE_SOURCE_DIR}/modules/zelda/ZeldaSprite.txt ${CMAKE_SOURCE_DIR}/modules/zelda/ZeldaSubscreen.txt ) set(ZQUEST_MODULES ${CMAKE_SOURCE_DIR}/modules/zquest/ZQuestCore.txt ${CMAKE_SOURCE_DIR}/modules/zquest/ZQuestGUI.txt ${CMAKE_SOURCE_DIR}/modules/zquest/ZQuestMisc.txt ${CMAKE_SOURCE_DIR}/modules/zquest/ZQuestZScript.txt ${CMAKE_SOURCE_DIR}/modules/zquest/ZQuestZScriptNP.txt ) foreach(module ${ROMVIEW_MODULES} ${ZELDA_MODULES} ${ZQUEST_MODULES}) include(${module}) set_source_files_properties(${module} PROPERTIES HEADER_FILE_ONLY true) endforeach() ############################################################# # Build the ZScript parser ############################################################# find_package(BISON QUIET) find_package(FLEX QUIET) if(${BISON_FOUND} AND ${FLEX_FOUND} AND WANT_ZSCRIPT) if(MSVC) set(FLEXFLAGS "--wincompat") endif() FLEX_TARGET(ZScriptLexer ${CMAKE_SOURCE_DIR}/src/parser/ffscript.lpp ${CMAKE_SOURCE_DIR}/src/parser/lex.yy.cpp COMPILE_FLAGS ${FLEXFLAGS}) BISON_TARGET(ZScriptParser ${CMAKE_SOURCE_DIR}/src/parser/ffscript.ypp ${CMAKE_SOURCE_DIR}/src/parser/y.tab.cpp COMPILE_FLAGS -v) add_flex_bison_dependency(ZScriptLexer ZScriptParser) else() message(WARNING "Flex and Bison not found. ZQuest will be compiled without the ZScript parser.") set(ZQUEST_ZSCRIPT_SOURCES ${ZQUEST_ZSCRIPT_SOURCES_NOPARSER}) endif() ############################################################# # Global settings for the different platforms ############################################################# # Windows if(MSVC) set(ALLEGROLIB "$<$:${CMAKE_SOURCE_DIR}/libs/win32dbg/alleg44-debug.lib>" "$<$:${CMAKE_SOURCE_DIR}/libs/win32/alleg44.lib>") add_definitions(-DALLEGRO_MSVC) set(IMAGELIBS "$<$:${CMAKE_SOURCE_DIR}/libs/win32dbg/al_gif.lib$${CMAKE_SOURCE_DIR}/libs/win32dbg/libpng.lib$${CMAKE_SOURCE_DIR}/libs/win32dbg/zlibd.lib$${CMAKE_SOURCE_DIR}/libs/win32dbg/loadpng.lib$${CMAKE_SOURCE_DIR}/libs/win32dbg/libjpgal.lib>" "$<$:${CMAKE_SOURCE_DIR}/libs/win32/al_gif.lib$${CMAKE_SOURCE_DIR}/libs/win32/libpng.lib$${CMAKE_SOURCE_DIR}/libs/win32/zlib.lib$${CMAKE_SOURCE_DIR}/libs/win32/loadpng.lib$${CMAKE_SOURCE_DIR}/libs/win32/libjpgal.lib>") set(SOUNDLIBS "$<$:${CMAKE_SOURCE_DIR}/libs/win32dbg/aldmd.lib$${CMAKE_SOURCE_DIR}/libs/win32dbg/almp3.lib$${CMAKE_SOURCE_DIR}/libs/win32dbg/alogg.lib$${CMAKE_SOURCE_DIR}/libs/win32dbg/dumbd.lib$${CMAKE_SOURCE_DIR}/libs/win32dbg/gme.lib>" "$<$:${CMAKE_SOURCE_DIR}/libs/win32/aldmb.lib$${CMAKE_SOURCE_DIR}/libs/win32/almp3.lib$${CMAKE_SOURCE_DIR}/libs/win32/alogg.lib$${CMAKE_SOURCE_DIR}/libs/win32/dumb.lib$${CMAKE_SOURCE_DIR}/libs/win32/gme.lib>") if(MSVC_VERSION GREATER 1500) add_definitions(-DALLEGRO_HAVE_STDINT_H) endif() add_compile_options("$<$:/MTd>") add_compile_options("$<$:/MT>") # REQUIRED or else MSVC throws internal compiler error(!) add_compile_options("$<$:/fp:fast>") add_definitions(-D_CRT_SECURE_NO_WARNINGS) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:LIBCD /SUBSYSTEM:WINDOWS /DEBUG") if(USE_PCH) set(ZCPrecompiledBinary "${CMAKE_CURRENT_BINARY_DIR}/zcprecompiled.pch") set(ZQPrecompiledBinary "${CMAKE_CURRENT_BINARY_DIR}/zqprecompiled.pch") set_source_files_properties(src/precompiledzc.cpp PROPERTIES COMPILE_FLAGS "/Ycprecompiled.h /Fp\"${ZCPrecompiledBinary}\"" OBJECT_OUTPUTS "${ZCPrecompiledBinary}") set_source_files_properties(src/precompiledzq.cpp PROPERTIES COMPILE_FLAGS "/Ycprecompiled.h /Fp\"${ZQPrecompiledBinary}\"" OBJECT_OUTPUTS "${ZQPrecompiledBinary}") list(APPEND ZELDAEXTRASOURCES src/precompiledzc.cpp) list(APPEND ZQUESTEXTRASOURCES src/precompiledzq.cpp) endif() elseif(MINGW) set(ALLEGRO_MINGW32 1) set(ALLEGRO_WINDOWS 1) # Guess MINGDIR from the value of CMAKE_C_COMPILER if it's not set. if("$ENV{MINGDIR}" STREQUAL "") string(REGEX REPLACE "/bin/[^/]*$" "" MINGDIR "${CMAKE_C_COMPILER}") message(STATUS "Guessed MinGW directory: ${MINGDIR}") else("$ENV{MINGDIR}" STREQUAL "") file(TO_CMAKE_PATH "$ENV{MINGDIR}" MINGDIR) message(STATUS "Using MINGDIR: ${MINGDIR}") endif("$ENV{MINGDIR}" STREQUAL "") # Search in MINGDIR for headers and libraries. set(CMAKE_PREFIX_PATH "${MINGDIR}") # Install to MINGDIR if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set(CMAKE_INSTALL_PREFIX ${MINGDIR}) endif() message(STATUS "CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}") set(ALLEGROLIB ${CMAKE_SOURCE_DIR}/libs/mingw/liballeg.a ) set(IMAGELIBS ${CMAKE_SOURCE_DIR}/libs/mingw/libpng.a ${CMAKE_SOURCE_DIR}/libs/mingw/libz.a ${CMAKE_SOURCE_DIR}/libs/mingw/libldpng.a $${CMAKE_SOURCE_DIR}/libs/mingw/libjpgal.a ) #${CMAKE_SOURCE_DIR}/libs/mingw/al_gif.lib #${CMAKE_SOURCE_DIR}/libs/win32/al_gif.lib set(SOUNDLIBS ${CMAKE_SOURCE_DIR}/libs/mingw/libaldmb.a ${CMAKE_SOURCE_DIR}/libs/mingw/libalmp3.a ${CMAKE_SOURCE_DIR}/libs/mingw/libalogg.a ${CMAKE_SOURCE_DIR}/libs/mingw/libdumb.a ${CMAKE_SOURCE_DIR}/libs/mingw/libgme.a ) add_definitions(-DALLEGRO_MSVC) # Mistakenly used in the source. execute_process(COMMAND "${CMAKE_SOURCE_DIR}/allegro/configure --enable-static=yes --enable-shared=no --enable-ossdigi=no --enable-ossmidi=no --enable-esddigi=no --enable-artsdigi=no --enable-sgialdigi=no --enable-jackdigi=no --enable-xwin-dga2=no --enable-vga=no --enable-svgalib=no" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/allegro") # Linux elseif(LINUX) link_directories(/usr/lib/i386-linux-gnu) link_directories(./libs/linux) set(ALLEGROLIB alleg) add_definitions(-DALLEGRO_UNIX) add_definitions(-DALLEGRO_LINUX) # Mistakenly used in the source. execute_process(COMMAND "${CMAKE_SOURCE_DIR}/allegro/configure --enable-static=yes --enable-shared=no --enable-ossdigi=no --enable-ossmidi=no --enable-esddigi=no --enable-artsdigi=no --enable-sgialdigi=no --enable-jackdigi=no --enable-xwin-dga2=no --enable-vga=no --enable-svgalib=no" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/allegro") set(IMAGELIBS algif ldpng jpgal png z) set(SOUNDLIBS aldmb almp3 alogg dumb gme asound) set(X11_LIBRARIES X11 Xext Xcursor Xxf86vm pthread Xpm dl) add_compile_options("-m32") SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -m32 -static-libgcc -export-dynamic") SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -m32 -static-libgcc") endif() ############################################################# # Sound Library ############################################################# if(MSVC AND (MSVC_VERSION GREATER 1600)) set(ZCSOUNDLIBSEXTRA legacy_stdio_definitions) endif() add_library(zcsound SHARED ${ZCSOUNDSOURCES}) target_link_libraries(zcsound ${ALLEGROLIB} ${SOUNDLIBS} ${ZCSOUNDLIBSEXTRA}) ############################################################# # Romview ############################################################# if(MSVC) list(APPEND ROMVIEWEXTRASOURCES rv_icon.rc) elseif(LINUX) list(APPEND ROMVIEWEXTRASOURCES rv_icon.c) set(ROMVIEWLIBSEXTRA ${X11_LIBRARIES}) endif() if(UNITY_BUILD) enable_unity_build(RomviewCore ROMVIEW_CORE_SOURCES) enable_unity_build(RomviewGUI ROMVIEW_GUI_SOURCES) endif() add_executable(romview ${ROMVIEW_CORE_SOURCES} ${ROMVIEW_GUI_SOURCES} ${ROMVIEWEXTRASOURCES} ${ROMVIEW_MODULES}) target_link_libraries(romview ${IMAGELIBS} ${ALLEGROLIB} ${SOUNDLIBS} ${ROMVIEWLIBSEXTRA}) ############################################################# # Zelda ############################################################# if(MSVC) list(APPEND ZELDAEXTRASOURCES zc_icon.rc) elseif(LINUX) list(APPEND ZELDAEXTRASOURCES zc_icon.c src/single_instance_unix.cpp) set(ZELDALIBSEXTRA ${X11_LIBRARIES}) endif() if(UNITY_BUILD) enable_unity_build(ZeldaCore ZELDA_CORE_SOURCES) enable_unity_build(ZeldaGUI ZELDA_GUI_SOURCES) enable_unity_build(ZeldaSprite ZELDA_SPRITE_SOURCES) enable_unity_build(ZeldaSubscreen ZELDA_SUBSCREEN_SOURCES) endif() add_executable(zelda ${ZELDA_CORE_SOURCES} ${ZELDA_GUI_SOURCES} ${ZELDA_SPRITE_SOURCES} ${ZELDA_SUBSCREEN_SOURCES} ${ZELDA_SCRIPTING_SOURCES} ${ZELDAEXTRASOURCES} ${ZELDA_MODULES}) if(WIN32) target_link_libraries(zelda zcsound winmm ${IMAGELIBS} ${ALLEGROLIB} ${ZELDALIBSEXTRA}) elseif(LINUX) target_link_libraries(zelda zcsound ${IMAGELIBS} ${ALLEGROLIB} ${ZELDALIBSEXTRA}) endif() if(MSVC AND USE_PCH) set_target_properties(zelda PROPERTIES COMPILE_FLAGS "/Yuprecompiled.h /FIprecompiled.h /Fp\"${ZCPrecompiledBinary}\"" OBJECT_DEPENDS "${ZCPrecompiledBinary}") target_compile_definitions(zelda PRIVATE ZC_PCH) endif() ############################################################# # ZQuest ############################################################# if(MSVC) list(APPEND ZQUESTEXTRASOURCES zq_icon.rc) elseif(LINUX) list(APPEND ZQUESTEXTRASOURCES zq_icon.c src/single_instance_unix.cpp) set(ZQUESTLIBSEXTRA ${X11_LIBRARIES}) endif() if(UNITY_BUILD) enable_unity_build(ZQuestCore ZQUEST_CORE_SOURCES) enable_unity_build(ZQuestGUI ZQUEST_GUI_SOURCES) enable_unity_build(ZQuestMisc ZQUEST_MISC_SOURCES) enable_unity_build(ZQuestZScript ZQUEST_ZSCRIPT_SOURCES) endif() add_executable(zquest ${ZQUEST_CORE_SOURCES} ${ZQUEST_GUI_SOURCES} ${ZQUEST_MISC_SOURCES} ${ZQUEST_ZSCRIPT_SOURCES} ${ZQUESTEXTRASOURCES} ${BISON_ZScriptParser_OUTPUTS} ${FLEX_ZScriptLexer_OUTPUTS} ${ZQUEST_MODULES}) target_link_libraries(zquest zcsound ${IMAGELIBS} ${ALLEGROLIB} ${ZQUESTLIBSEXTRA}) if(MSVC AND USE_PCH) set_target_properties(zquest PROPERTIES COMPILE_FLAGS "/Yuprecompiled.h /FIprecompiled.h /Fp\"${ZQPrecompiledBinary}\"" OBJECT_DEPENDS "${ZQPrecompiledBinary}") target_compile_definitions(zquest PRIVATE ZC_PCH) endif() if(MSVC) target_compile_definitions(zcsound PRIVATE ZCM_DLL) target_compile_definitions(zelda PRIVATE ZCM_DLL_IMPORT) target_compile_definitions(zquest PRIVATE ZCM_DLL_IMPORT) endif()