diff options
Diffstat (limited to 'cmake/dists')
-rw-r--r-- | cmake/dists/cmake/Modules/ConfigurePasFile.cmake | 28 | ||||
-rw-r--r-- | cmake/dists/cmake/Modules/FindPPC.cmake | 38 | ||||
-rw-r--r-- | cmake/dists/cmake/Modules/UsePascal.cmake | 164 |
3 files changed, 146 insertions, 84 deletions
diff --git a/cmake/dists/cmake/Modules/ConfigurePasFile.cmake b/cmake/dists/cmake/Modules/ConfigurePasFile.cmake deleted file mode 100644 index 803afc1d..00000000 --- a/cmake/dists/cmake/Modules/ConfigurePasFile.cmake +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright (c) 2009 Tobias Gunkel <tobigun@at@users.sourceforge.net> -# -# Copying and distribution of this file, with or without -# modification, are permitted in any medium without royalty provided -# the copyright notice and this notice are preserved. - -# - Macro for handling Pascal configuration files -# -# CONFIGURE_PAS_FILE(InputFile OutputFile) -# Works as configure_file(InputFile OutputFile) but in addition -# it replaces occurences of {$CMAKEDEFINE(VAR) XYZ} with -# {$DEFINE XYZ} if the value of VAR is true -# {$UNDEF XYZ} if the value of VAR is false - -macro(CONFIGURE_PAS_FILE) - file(READ ${ARGV0} config_file) - string(REGEX MATCHALL "{\\$CMAKEDEFINE\\([^\\)]+\\)" pasdefine_list "${config_file}") - foreach(pasdefine ${pasdefine_list}) - string(REGEX REPLACE "{\\$CMAKEDEFINE\\(([^\\)]+)\\)" "\\1" pasdefine_var ${pasdefine}) - if (${pasdefine_var}) - string(REPLACE ${pasdefine} "{$DEFINE" config_file "${config_file}") - else (${pasdefine_var}) - string(REPLACE ${pasdefine} "{$UNDEF" config_file "${config_file}") - endif (${pasdefine_var}) - endforeach(pasdefine) - string(CONFIGURE "${config_file}" config_file) - file(WRITE ${ARGV1} "${config_file}") -endmacro(CONFIGURE_PAS_FILE) diff --git a/cmake/dists/cmake/Modules/FindPPC.cmake b/cmake/dists/cmake/Modules/FindPPC.cmake index 67b49dd9..3f82b720 100644 --- a/cmake/dists/cmake/Modules/FindPPC.cmake +++ b/cmake/dists/cmake/Modules/FindPPC.cmake @@ -103,6 +103,29 @@ foreach(once 1) set(FPC_TARGET "${FPC_PROCESSOR}-${FPC_PLATFORM}") + #-v -l verbose/banner + #-n ignore fpc.cfg + #-Fi -I include-dir + #-k + #-Fl linker-dir + #-Fo -Fu object-/unit-dir + #-Xt -Xc + #-Ciort range checks + #-Cs -Ch stack/heap size + #-Cg -fPIC PIC code + #-E + #-g -gv -gw(2/3) -gh -gl -pg + #-O + #-T -Xd -XP cross-compiling + #-d -u define/undefine + #-Xs strip + #-B build all modules + #-Dd -Dv description + DLL-version + + #PFLAGS_BASE_DEFAULT := -Si -Sg- -Sc- -v0Binwe + #PFLAGS_DEBUG_DEFAULT := -Xs- -g -gl -dDEBUG_MODE + #PFLAGS_RELEASE_DEFAULT := -Xs- -O2 + ## # Compiler checks ## @@ -142,14 +165,19 @@ foreach(once 1) ppc_check(testlib.pas "library link;\nbegin\nend." "${default_flags}" check_result NO_CLEAN) - find_library(libpath testlib + # find generated library + find_library(PPC_TEST_LIBPATH testlib PATHS ${PPC_CHECK_DIR} NO_DEFAULT_PATH) - if(libpath) - get_filename_component(PPC_LIBRARY_SUFFIX ${libpath} EXT CACHE) - get_filename_component(libfilename ${libpath} NAME_WE) + # do not show library name in GUI + mark_as_advanced(PPC_TEST_LIBPATH) + # extract prefix and suffix from library name + if(PPC_TEST_LIBPATH) + get_filename_component(PPC_LIBRARY_SUFFIX ${PPC_TEST_LIBPATH} EXT CACHE) + get_filename_component(libfilename ${PPC_TEST_LIBPATH} NAME_WE) string(REGEX REPLACE "^(.*)testlib.*" "\\1" PPC_LIBRARY_PREFIX ${libfilename}) - endif(libpath) + endif(PPC_TEST_LIBPATH) + # remove library test directory file(REMOVE_RECURSE ${PPC_CHECK_DIR}) if(check_result) set(PPC_ERROR "Cannot link with standard libraries") diff --git a/cmake/dists/cmake/Modules/UsePascal.cmake b/cmake/dists/cmake/Modules/UsePascal.cmake index a67e07b6..e3c3612b 100644 --- a/cmake/dists/cmake/Modules/UsePascal.cmake +++ b/cmake/dists/cmake/Modules/UsePascal.cmake @@ -4,25 +4,80 @@ # modification, are permitted in any medium without royalty provided # the copyright notice and this notice are preserved. -# - Pascal module build macros +# - Creates a virtual Pascal package. +# Do not mix this up with Delphi (dpk), FPC or Lazarus (lpk) packages. +# A package specified by this command does not define a dll or similar. +# It is just a compilation of units, includes and object-dirs +# (mostly used for header files). +# This information will be appended to a module generated by +# add_pascal_module() if a package is specified with the PACKAGE +# option. +# PASCAL_ADD_PACKAGE( +# <name> +# [UNITS file1 [...]] +# [INCLUDES file1 [...]] +# [OBJECT_DIRS dir1 [...]] # -# ADD_PASCAL_MODULE( +# - Builds a Pascal module. +# The module can be a program, library or unit. The type is either autodetected +# (by the file header) or can be set by the appropriate flag. +# The output name for executables and libraries (exe, dll, so) will be the +# name of the target (or the one given by OUTPUT_NAME). It will be located in +# the current binary dir by default (or in the directory given by OUTPUT_DIR). +# If main_source is a unit the name of the generated object file (mostly a .o/.ppu pair) +# will match the units name and located in an extra directory (like i386-linux) in the +# current binary dir. +# It is recommended to pass all unit (pas/pp) files and include (inc) files required +# by the module with the UNITS/INCLUDES flags. Although dependencies are normally +# already defined in the project file (.lpr/.dpr/...) FPC is not able to reliably track +# changes in dependencies as it does not search for source-files besides the directory +# of the project file. When calling FPC directly the user has to pass all paths to source +# files with the -Fu flag, otherwise FPC will not recompile changed source-files. +# If you pass all source files (wildcards as dir/*.pas are allowed) with UNITS/INCLUDES +# pascal_add_module does this for you. In addition the filenames are appended to auto-generated +# project files for e.g. lazarus. +# The UNITS/INCLUDES files are also used as dependencies for triggering a rebuild. If REBUILD_ALL +# is not specified FPC tries to perform a minimal rebuild (only files that changed). If inline +# functions are used in your project's sources FPC might not be able to perform a minimum rebuild +# and compiles lots of unchanged units too. +# (See http://www.mail-archive.com/fpc-devel@lists.freepascal.org/msg11914.html) +# If for some reason a minimal rebuild fails, specify +# REBUILD_ALL to recompile all units used by your project. +# Units/includes used by packages specified by the PACKAGES option do not have to be specified +# again with UNITS/INCLUDES. Package sources are not appended to auto-generated project files +# for lazarus. +# Sets target properties: +# - PASCAL_TYPE: module type (one of PROGRAM/LIBRARY/UNIT) +# - PASCAL_LOCATION: full path of output file (equivalent to LOCATION) +# PASCAL_ADD_MODULE( # <name> # [PROGRAM | LIBRARY | UNIT] -# <source> -# FLAGS ... -# DEPENDS depend [...] -# UNITS file1 [...] -# INCLUDES file1 [...] -# OBJECT_DIRS dir1 [...] -# PACKAGES pkg1 [...] -# EXCLUDE_FROM_ALL -# REBUILD_ALL +# <main_source> +# [OUTPUT_NAME name] +# [OUTPUT_DIR dir] +# [FLAGS ...] +# [DEPENDS depend [...]] +# [UNITS file1 [...]] +# [INCLUDES file1 [...]] +# [OBJECT_DIRS dir1 [...]] +# [PACKAGES pkg1 [...]] +# [EXCLUDE_FROM_ALL] +# [REBUILD_ALL] # ) +# +# - Macro for handling Pascal configuration files +# Works as configure_file(InputFile OutputFile) but in addition +# it replaces occurences of {$CMAKEDEFINE(VAR) XYZ} with +# {$DEFINE XYZ} if the value of VAR is true +# {$UNDEF XYZ} if the value of VAR is false +# PASCAL_CONFIGURE_FILE(InputFile OutputFile) +# include(MacroParseArguments) include(LazarusGenerator) +option(GENERATE_LAZARUS_PROJECTS "Generate lazarus project files (.lpi) for every Pascal target" OFF) + function(PASCAL_ADD_PACKAGE name) set(ARG) parse_arguments(ARG @@ -51,7 +106,7 @@ endfunction(PASCAL_ADD_PACKAGE) macro(PASCAL_ADD_MODULE) set(ARG) parse_arguments(ARG - "FLAGS;DEPENDS;UNITS;INCLUDES;OBJECT_DIRS;PACKAGES" + "OUTPUT_NAME;OUTPUT_DIR;FLAGS;DEPENDS;UNITS;INCLUDES;OBJECT_DIRS;PACKAGES" "EXCLUDE_FROM_ALL;REBUILD_ALL" ${ARGN} ) @@ -118,18 +173,31 @@ macro(PASCAL_ADD_MODULE) # init list of additional "make clean" files set(extra_clean_files "") - # set ppu and obj output dir + # set output directory + if(ARG_OUTPUT_DIR) + set(output_dir ${ARG_OUTPUT_DIR}) + else() + set(output_dir ${CMAKE_CURRENT_BINARY_DIR}) + endif() + + # set compiled units (ppu/obj) output directory set(unit_out_dir ${CMAKE_CURRENT_BINARY_DIR}/${FPC_TARGET}) list(APPEND extra_clean_files ${unit_out_dir}) - # create output name - set(output_name ${target}) + # set output-file basename + if(ARG_OUTPUT_NAME) + set(output_name ${ARG_OUTPUT_NAME}) + else() + set(output_name ${target}) + endif() + + # create output filename if(type STREQUAL PROGRAM) - set(output "${CMAKE_CURRENT_BINARY_DIR}/${output_name}${CMAKE_EXECUTABLE_SUFFIX}") + set(output "${output_dir}/${output_name}${CMAKE_EXECUTABLE_SUFFIX}") list(APPEND extra_clean_files ${output}) endif(type STREQUAL PROGRAM) if(type STREQUAL LIBRARY) - set(output "${CMAKE_CURRENT_BINARY_DIR}/${PPC_LIBRARY_PREFIX}${output_name}${PPC_LIBRARY_SUFFIX}") + set(output "${output_dir}/${PPC_LIBRARY_PREFIX}${output_name}${PPC_LIBRARY_SUFFIX}") list(APPEND extra_clean_files ${output}) endif(type STREQUAL LIBRARY) if(type STREQUAL UNIT) @@ -228,29 +296,6 @@ macro(PASCAL_ADD_MODULE) # set flags list(APPEND PFLAGS ${ARG_FLAGS}) - #-v -l verbose/banner - #-n ignore fpc.cfg - #-Fi -I include-dir - #-k - #-Fl linker-dir - #-Fo -Fu object-/unit-dir - #-Xt -Xc - #-Ciort range checks - #-Cs -Ch stack/heap size - #-Cg -fPIC PIC code - #-E - #-g -gv -gw(2/3) -gh -gl -pg - #-O - #-T -Xd -XP cross-compiling - #-d -u define/undefine - #-Xs strip - #-B build all modules - #-Dd -Dv description + DLL-version - - #PFLAGS_BASE_DEFAULT := -Si -Sg- -Sc- -v0Binwe - #PFLAGS_DEBUG_DEFAULT := -Xs- -g -gl -dDEBUG_MODE - #PFLAGS_RELEASE_DEFAULT := -Xs- -O2 - # lower-case project type (just for user info) string(TOLOWER ${type} proj_type_lowcase) @@ -295,15 +340,32 @@ macro(PASCAL_ADD_MODULE) # of the target set_target_properties(${target} PROPERTIES PASCAL_LOCATION ${output}) - generate_lazarus_project( - ${source} - ${output} - ${unit_out_dir} - "${ARG_UNITS}" - "${unit_dirs}" - "${ARG_INCLUDES}" - "${inc_dirs}" - "${obj_dirs}" - "${PFLAGS}" - ) + if(GENERATE_LAZARUS_PROJECTS) + generate_lazarus_project( + ${source} + ${output} + ${unit_out_dir} + "${ARG_UNITS}" + "${unit_dirs}" + "${ARG_INCLUDES}" + "${inc_dirs}" + "${obj_dirs}" + "${PFLAGS}" + ) + endif(GENERATE_LAZARUS_PROJECTS) endmacro(PASCAL_ADD_MODULE) + +macro(PASCAL_CONFIGURE_FILE) + file(READ ${ARGV0} config_file) + string(REGEX MATCHALL "{\\$CMAKEDEFINE\\([^\\)]+\\)" pasdefine_list "${config_file}") + foreach(pasdefine ${pasdefine_list}) + string(REGEX REPLACE "{\\$CMAKEDEFINE\\(([^\\)]+)\\)" "\\1" pasdefine_var ${pasdefine}) + if (${pasdefine_var}) + string(REPLACE ${pasdefine} "{$DEFINE" config_file "${config_file}") + else (${pasdefine_var}) + string(REPLACE ${pasdefine} "{$UNDEF" config_file "${config_file}") + endif (${pasdefine_var}) + endforeach(pasdefine) + string(CONFIGURE "${config_file}" config_file) + file(WRITE ${ARGV1} "${config_file}") +endmacro(PASCAL_CONFIGURE_FILE) |