project(pawnc C) cmake_minimum_required(VERSION 2.8) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake) set(VERSION_MAJOR 3) set(VERSION_MINOR 10) set(VERSION_BUILD 3) set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_BUILD}) set(VERSION_STR ${VERSION}) math(EXPR VERSION_INT "${VERSION_MAJOR} << 8 | ${VERSION_MINOR}") # check for optional include files include(CheckIncludeFile) check_include_file("unistd.h" HAVE_UNISTD_H) if(HAVE_UNISTD_H) add_definitions(-DHAVE_UNISTD_H) endif() check_include_file("inttypes.h" HAVE_INTTYPES_H) if(HAVE_INTTYPES_H) add_definitions(-DHAVE_INTTYPES_H) endif() check_include_file("stdint.h" HAVE_STDINT_H) if(HAVE_STDINT_H) add_definitions(-DHAVE_STDINT_H) endif() check_include_file("alloca.h" HAVE_ALLOCA_H) if(HAVE_ALLOCA_H) add_definitions(-DHAVE_ALLOCA_H) endif() check_include_file("endian.h" HAVE_ENDIAN_H) if(HAVE_ENDIAN_H) add_definitions(-DHAVE_ENDIAN_H) endif() # check for optional library functions include(CheckFunctionExists) check_function_exists(strlcpy HAVE_STRLCPY) if(HAVE_STRLCPY) add_definitions(-DHAVE_STRLCPY) endif() check_function_exists(strlcat HAVE_STRLCAT) if(HAVE_STRLCAT) add_definitions(-DHAVE_STRLCAT) endif() if(MSVC) add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE /J) if(MSVC LESS 1900) # MSVC 2013 and below don't support the "inline" keyword add_definitions(-Dinline=__inline) endif() endif() if(UNIX) add_definitions(-DLINUX -DENABLE_BINRELOC -g) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../linux) link_libraries(pthread) endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/version.h) include_directories(${CMAKE_CURRENT_BINARY_DIR}) # The Pawn compiler shared library set(PAWNC_SRCS hashmap/hashmap.c hashmap/hashmap.h libpawnc.c lstring.c lstring.h memfile.c memfile.h sc.h sc1.c sc2.c sc3.c sc4.c sc5.c sc6.c sc7.c sci18n.c sclist.c scmemfil.c scstate.c scvars.c version.h) set_source_files_properties(sc1.c COMPILE_FLAGS -DNO_MAIN) if(WIN32) set(PAWNC_SRCS ${PAWNC_SRCS} libpawnc.rc) set_source_files_properties(libpawnc.c COMPILE_FLAGS -DPAWNC_DLL) if(BORLAND) # Borland linker uses a DEF file if one is in the output directory configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libpawnc.def.borland ${CMAKE_CURRENT_BINARY_DIR}/pawnc.def COPYONLY) else() # Microsoft Visual C/C++ supports a DEF file as if it were a source file set(PAWNC_SRCS ${PAWNC_SRCS} libpawnc.def) endif() endif() if(UNIX) set(PAWNC_SRCS ${PAWNC_SRCS} ${CMAKE_CURRENT_SOURCE_DIR}/../linux/binreloc.c ) endif() add_library(pawnc SHARED ${PAWNC_SRCS}) if(WATCOM) #Watcom C/C++ does not support a .DEF file for the exports set_target_properties(pawnc PROPERTIES LINK_FLAGS "/exp=libpawnc") elseif(MINGW) set_target_properties(pawnc PROPERTIES LINK_FLAGS "-Wl,--enable-stdcall-fixup") set_target_properties(pawnc PROPERTIES PREFIX "") endif() # The Pawn compiler driver (console program) set(PAWNCC_SRCS pawncc.c) if(WIN32) set(PAWNCC_SRCS ${PAWNCC_SRCS} libpawnc.rc) if(BORLAND) # Borland linker uses a DEF file if one is in the output directory configure_file(${CMAKE_CURRENT_SOURCE_DIR}/pawncc.def.borland ${CMAKE_CURRENT_BINARY_DIR}/pawncc.def COPYONLY) else() # Microsoft Visual C/C++ supports a DEF file as if it were a source file set(PAWNC_SRCS ${PAWNC_SRCS} pawncc.def) endif() endif() add_executable(pawncc ${PAWNCC_SRCS}) target_link_libraries(pawncc pawnc) # The Pawn disassembler set(PAWNDISASM_SRCS pawndisasm.c ../amx/amxdbg.c ../amx/amx.c ) add_executable(pawndisasm ${PAWNDISASM_SRCS}) if(UNIX) target_link_libraries(pawndisasm dl) endif() # Install compiler and disassembler binaries install(TARGETS pawnc pawncc pawndisasm RUNTIME DESTINATION bin LIBRARY DESTINATION lib) if(MSVC) # If building with Microsoft Visual C++ also install corresponding # Program Database files (for debugging) install( FILES ${PROJECT_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}/pawnc.pdb ${PROJECT_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}/pawncc.pdb ${PROJECT_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}/pawndisasm.pdb DESTINATION bin) endif() # Generate a binary package with CPack string(TOLOWER ${CMAKE_SYSTEM_NAME} SYSTEM_NAME_LOWER) set(CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR}) set(CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR}) set(CPACK_PACKAGE_VERSION ${VERSION_STR}) set(CPACK_PACKAGE_FILE_NAME pawnc-${VERSION_STR}-${SYSTEM_NAME_LOWER}) set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/../../license.txt) include(CPack)