From eb171c38037082446ac1fb26ad5ff1c81e0efb26 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 15 Jun 2023 03:52:31 +0200 Subject: [PATCH] cmake: add CMake build system --- CMakeLists.txt | 171 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..c7070bfe --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,171 @@ +cmake_minimum_required(VERSION 3.24) + +# MSVC runtime library flags are selected by an abstraction +cmake_policy(SET CMP0091 NEW) + +project(isledecomp C CXX RC) + +if(MSVC) + set(CMAKE_INSTALL_BINDIR "." CACHE PATH "Install bin directory") +else() + include(GNUInstallDirs) +endif() + +set(ISLE_ACCURACY_DEFAULT FALSE) +# Visual C++ 4.2 ships version 10.20.6166 +if(MSVC AND CMAKE_C_COMPILER_VERSION VERSION_LESS "12.0") + set(ISLE_ACCURACY_DEFAULT TRUE) +endif() + +option(ISLE_ACCURACY "Configure CFLAGS for recreating accuarte binaries" ${ISLE_ACCURACY_DEFAULT}) + +if(MSVC) + add_compile_definitions(_CRT_SECURE_NO_WARNINGS) +endif() +option(ISLE_WERROR "Treat warnings as errors" OFF) + +if(ISLE_WERROR) + set(CMAKE_COMPILE_WARNING_AS_ERROR ON) +endif() + +if(MSVC) + add_compile_options(/W3) +else() + add_compile_options(-Wall -Wextra) +endif() + +file(GLOB ISLE_SOURCES + "ISLE/*.c" + "ISLE/*.cpp" + "ISLE/*.h" + "ISLE/res/*.rc" + "ISLE/res/*.ico" + "ISLE/res/*.cur" +) +add_executable(isle WIN32 + ${ISLE_SOURCES} +) +target_include_directories(isle PRIVATE .) +target_include_directories(isle PRIVATE ISLE) +target_include_directories(isle PRIVATE LEGO1) +target_link_libraries(isle PRIVATE dsound winmm) +set_property(TARGET isle PROPERTY OUTPUT_NAME ISLE) +set_property(TARGET isle PROPERTY SUFFIX ".EXE") +set_property(TARGET isle PROPERTY CXX_STANDARD "98") +set_property(TARGET isle PROPERTY MSVC_RUNTIME_LIBARY "") +target_compile_options(isle PRIVATE "/ML$<$:d>") + +if(MSVC) + add_library(lego01_implib UNKNOWN IMPORTED) + set_property(TARGET lego01_implib PROPERTY IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/ISLE/ext/lego1.lib") + target_link_libraries(isle PRIVATE lego01_implib) +else() + target_link_libraries(isle PRIVATE lego1) +endif() + +file(GLOB LEGO1_SOURCES + "LEGO1/*.c" + "LEGO1/*.cpp" + "LEGO1/*.h" + "LEGO1/*.rc" + "LEGO1/*.ico" + "LEGO1/*.cur" +) +add_library(lego1 SHARED + ${LEGO1_SOURCES} +) +target_link_libraries(lego1 PRIVATE winmm) +set_property(TARGET lego1 PROPERTY OUTPUT_NAME LEGO1) +set_property(TARGET lego1 PROPERTY PREFIX "") +set_property(TARGET lego1 PROPERTY SUFFIX ".DLL") +set_property(TARGET lego1 PROPERTY CXX_STANDARD "98") +set_property(TARGET lego1 PROPERTY DEFINE_SYMBOL "") +set_property(TARGET lego1 PROPERTY PDB_NAME "LEGO1") +set_property(TARGET lego1 PROPERTY MSVC_RUNTIME_LIBARY "") +target_compile_options(lego1 PRIVATE "/MT$<$:d>") + +if(ISLE_ACCURACY) + # Flags from isle.mak: + # ISLE.EXE: + # - Debug: /nologo /MLd /W3 /Gm /GX /Zi /Od /I "LEGO1" /D "WIN32" /D "_DEBUG" /D \ + # "_WINDOWS" /Fp"$(INTDIR)/ISLE.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c + # - Release: /nologo /ML /W3 /GX /Zi /O2 /I "LEGO1" /D "WIN32" /D "NDEBUG" /D\ + # "_WINDOWS" /Fp"$(INTDIR)/ISLE.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c + # LEGO1.DLL: + # - Debug: /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS"\ + # /Fp"$(INTDIR)/LEGO1.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c + # - Release: /nologo /MT /W3 /GX /Zi /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS"\ + # /Fp"$(INTDIR)/LEGO1.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c + + # This is a fancy way of saying: + # - /MT for shared libraries in Release configuration + # - /MTd for shared libraries in Debug configuration + # - /ML for executables in Release configuration + # - /MLd for executables in Debug configuration + #set(stl_library "$<$,SHARED_LIBRARY>:/MT>$<$,EXECUTABLE>:/ML>$<$:d>") + + #set_property(TARGET isle lego1 PROPERTY MSVC_RUNTIME_LIBRARY "") + set(CMAKE_C_FLAGS "/GX /Zi /DWIN32 /D_WINDOWS") + set(CMAKE_CXX_FLAGS "/GX /Zi /DWIN32 /D_WINDOWS") + + set(CMAKE_C_FLAGS_RELEASE "/O2") + set(CMAKE_CXX_FLAGS_RELEASE "/O2") + set(CMAKE_C_FLAGS_DEBUG "/Gm /Od /D_DEBUG") + set(CMAKE_CXX_FLAGS_DEBUG "/Gm /Od /D_DEBUG") + + set(CMAKE_SHARED_LINKER_FLAGS "/machine:I386 /subsystem:windows") + set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "/debug /incremental:no") # /debug creates a pdb + set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "/debug /incremental:yes") + + set(CMAKE_EXE_LINKER_FLAGS "/machine:I386 /subsystem:windows") + set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/debug /incremental:no") # /debug creates a pdb + set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/debug /incremental:yes") + + set(CMAKE_C_STANDARD_LIBRARIES "kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib") + string(APPEND CMAKE_C_STANDARD_LIBRARIES " advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib") + string(APPEND CMAKE_C_STANDARD_LIBRARIES " odbccp32.lib") + set(CMAKE_CXX_STANDARD_LIBRARIES ${CMAKE_C_STANDARD_LIBRARIES}) +endif() + + +message(STATUS "Compiler ID: ${CMAKE_C_COMPILER_ID}") +message(STATUS "Compiler version: ${CMAKE_C_COMPILER_VERSION}") +message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") +message(STATUS "") +message(STATUS "CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}") +message(STATUS "CMAKE_C_FLAGS_DEBUG: ${CMAKE_C_FLAGS_DEBUG}") +message(STATUS "CMAKE_C_FLAGS_RELEASE: ${CMAKE_C_FLAGS_RELEASE}") +message(STATUS "") +message(STATUS "CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}") +message(STATUS "CMAKE_CXX_FLAGS_DEBUG: ${CMAKE_CXX_FLAGS_DEBUG}") +message(STATUS "CMAKE_CXX_FLAGS_RELEASE: ${CMAKE_CXX_FLAGS_RELEASE}") +message(STATUS "") +message(STATUS "CMAKE_EXE_LINKER_FLAGS: ${CMAKE_EXE_LINKER_FLAGS}") +message(STATUS "CMAKE_EXE_LINKER_FLAGS_RELEASE: ${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +message(STATUS "CMAKE_EXE_LINKER_FLAGS_DEBUG: ${CMAKE_EXE_LINKER_FLAGS_DEBUG}") +message(STATUS "") +message(STATUS "CMAKE_SHARED_LINKER_FLAGS: ${CMAKE_SHARED_LINKER_FLAGS}") +message(STATUS "CMAKE_SHARED_LINKER_FLAGS_RELEASE: ${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +message(STATUS "CMAKE_SHARED_LINKER_FLAGS_DEBUG: ${CMAKE_SHARED_LINKER_FLAGS_DEBUG}") +message(STATUS "") +message(STATUS "CMAKE_C_STANDARD_LIBRARIES: ${CMAKE_C_STANDARD_LIBRARIES}") +message(STATUS "") + +get_property(isle_options TARGET isle PROPERTY COMPILE_OPTIONS) +string(JOIN " " isle_options ${isle_options}) +message(STATUS "ISLE flags: ${isle_options}") + +get_property(lego1_options TARGET lego1 PROPERTY COMPILE_OPTIONS) +string(JOIN " " lego1_options ${lego1_options}) +message(STATUS "LEGO1 flags: ${lego1_options}") +message(STATUS "") + +install(PROGRAMS "$" "$" + DESTINATION "${CMAKE_INSTALL_BINDIR}" +) +if(MSVC) + install(FILES install "$" "$" + DESTINATION "${CMAKE_INSTALL_BINDIR}" + OPTIONAL + ) +endif()