FLTK logo

[master] f3005a4 - CMake: move test executables to build/bin/test

FLTK matrix user chat room
(using Element browser app)   FLTK gitter user chat room   GitHub FLTK Project   FLTK News RSS Feed  
  FLTK Apps      FLTK Library      Forums      Links     Login 
 All Forums  |  Back to fltk.commit  ]
 
Previous Message ]Next Message ]

[master] f3005a4 - CMake: move test executables to build/bin/test "Albrecht Schlosser" Aug 21, 2020  
 
commit f3005a44f87e30792acc410125113cd19b76a81a
Author:     Albrecht Schlosser <albrechts.fltk@online.de>
AuthorDate: Thu Aug 20 19:46:32 2020 +0200
Commit:     Albrecht Schlosser <albrechts.fltk@online.de>
CommitDate: Fri Aug 21 17:10:30 2020 +0200

    CMake: move test executables to build/bin/test

 test/CMakeLists.txt |  7 +++--
 test/demo.cxx       | 85 +++++++++++++++++++++++++++++------------------------
 2 files changed, 51 insertions(+), 41 deletions(-)

diff --git test/CMakeLists.txt test/CMakeLists.txt
index c1a9861..deb6a74 100644
--- test/CMakeLists.txt
+++ test/CMakeLists.txt
@@ -18,7 +18,7 @@
 include (../CMake/FLTK-Functions.cmake)
 include (../CMake/fl_create_example.cmake)
 
-set (EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/../bin)
+set (EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/../bin/test)
 set (TESTFILE_PATH ${CMAKE_CURRENT_BINARY_DIR}/../data)
 
 # create data and binary directory to copy scripts and data files
@@ -226,7 +226,8 @@ file (COPY
   DESTINATION ${TESTFILE_PATH}
 )
 
-# the main test program 'demo' needs additional hints and configurations
+# The main test program 'demo' needs additional hints and configurations.
+# Note: CMake defines "CMAKE_INTDIR" which is the build type folder (e.g. "Debug")
+# for multi config builds (MSVC, Xcode)
 
 target_compile_definitions (demo PRIVATE GENERATED_BY_CMAKE)
-target_compile_definitions (demo PRIVATE CMAKE_SOURCE_PATH="${CMAKE_CURRENT_SOURCE_DIR}")
diff --git test/demo.cxx test/demo.cxx
index 04dd4f0..d766e65 100644
--- test/demo.cxx
+++ test/demo.cxx
@@ -37,17 +37,21 @@
 
     fltk/fluid              fluid (../fluid/fluid)
     fltk/test               demo, demo.menu, working directory, data files
-    fltk/documentation/src  images for help_dialog(.html)
+    fltk/test/images        images for help_dialog(.html)
 
   (2) CMake + make (e.g. Unix)
 
-    build/bin               fluid, demo
+    build/bin               fluid
+    build/bin/test          test and demo programs
     build/data              demo.menu, working directory, data files
+    build/data/images       images for help_dialog(.html)
 
   (3) CMake + Visual Studio (TYPE == build type: Debug, Release, ...)
 
-    build/bin/TYPE          fluid, demo
+    build/bin/TYPE          fluid
+    build/bin/test/TYPE     test and demo programs
     build/data              demo.menu, working directory, data files
+    build/data/images       images for help_dialog(.html)
 
   (4) macOS                 The setup is similar to Windows and Linux:
                             Makefiles: like (1) or (2)
@@ -109,7 +113,6 @@ char params[256];           // commandline arguments
 // Global path variables for all platforms and build systems
 // to avoid duplication and dynamic allocation
 
-char src_path   [FL_PATH_MAX];          // directory of this souce file
 char app_path   [FL_PATH_MAX];          // directory of all demo binaries
 char fluid_path [FL_PATH_MAX];          // binary directory of fluid
 char data_path  [FL_PATH_MAX];          // working directory of all demos
@@ -125,6 +128,15 @@ const char *suffix = ".app";
 const char *suffix = "";
 #endif
 
+// CMake defines the "build type" subdirectory for multi configuration
+// build setups like Visual Studio and Xcode
+
+#ifdef CMAKE_INTDIR
+const char *cmake_intdir = "/" CMAKE_INTDIR;
+#else
+const char *cmake_intdir = 0;
+#endif
+
 // debug output function
 void debug_var(const char *varname, const char *value) {
   tty->printf("%-10s = '%s'\n", varname, value);
@@ -134,7 +146,7 @@ void debug_var(const char *varname, const char *value) {
 void show_tty(int val) {
   if ( val ) {
     form->size_range(FORM_W,FORM_H+TTY_H,0,0); // allow resizing
-    form->size(TTY_W,FORM_H+TTY_H);         // demo + height for tty
+    form->size(TTY_W,FORM_H+TTY_H);            // demo + height for tty
     demogrp->size(FORM_W,FORM_H);
     tty->show();                               // show tty
     tty->resize(0, FORM_H, TTY_W, TTY_H);      // force tty position
@@ -433,7 +445,7 @@ void doexit(Fl_Widget *, void *) {exit(0);}
 /*
   Load the menu file. Returns whether successful.
 */
-int load_the_menu(char *menu) {
+int load_the_menu(const char * const menu) {
   FILE *fin = 0;
   char line[256], mname[64],iname[64],cname[64];
   int i, j;
@@ -502,7 +514,7 @@ void fix_path(char *path, int strip_filename = 1) {
 
 int main(int argc, char **argv) {
 
-  fl_putenv("FLTK_DOCDIR=../documentation/html"); // not sure if this is needed
+  fl_putenv("FLTK_DOCDIR=../documentation/html"); // used by fluid
 
   char menu[FL_PATH_MAX];
 
@@ -515,50 +527,46 @@ int main(int argc, char **argv) {
 #endif
   fix_path(app_path);
 
-  // construct src_path in case we want to use it (macOS ?)
+  // fluid's path is relative to app_path:
+  // - "../fluid" for autoconf/make builds
+  // - ".." (parent directory) for single configuration CMake builds
+  // - "../../$CMAKE_INTDIR" for multi-config (Visual Studio or Xcode) CMake builds
 
-#if defined(GENERATED_BY_CMAKE)
-  strcpy(src_path, CMAKE_SOURCE_PATH);
-#else
-  strcpy(src_path, app_path);
-#endif
-  fix_path(src_path, 0);
+  strcpy(fluid_path, app_path);
 
-  // fluid's path is the same for CMake builds but not for autoconf/make
+  if (cmake_intdir)
+    fix_path(fluid_path); // remove intermediate (build type) folder, e.g. "/Debug"
 
-  strcpy(fluid_path, app_path);
+  fix_path(fluid_path); // remove folder name ("test")
 
 #if !defined(GENERATED_BY_CMAKE)
-  fix_path(fluid_path); // removes folder name (test)
   strcat(fluid_path, "/fluid");
-#endif
+#else
+  // CMake: potentially Visual Studio or Xcode (multi config)
+  if (cmake_intdir)
+    strcat(fluid_path, cmake_intdir); // append e.g. "/Debug"
+
+#endif // GENERATED_BY_CMAKE
 
   // construct data_path for the menu file and all resources (data files)
-  // CMake: replace "/bin/*"" with "/data"
+  // CMake: replace "/bin/test/*" with "/data"
   // autotools: use app_path directly
 
   strcpy(data_path, app_path);
 
 #if defined(GENERATED_BY_CMAKE)
   {
-    char *pos = strstr(data_path, "/bin");
+    char *pos = strstr(data_path, "/bin/test");
     if (pos)
       strcpy(pos, "/data");
   }
-#endif
+#endif // GENERATED_BY_CMAKE
 
-  // construct the menu file name, optionally overridden by command args
-  // CMake: use data_path instead of app_path
+  // Construct the menu file name, optionally overridden by command args.
+  // Use data_path and append "/<exe-file-name>.menu"
 
   const char *fn = fl_filename_name(argv[0]);
-
-#if defined(GENERATED_BY_CMAKE)
   strcpy(menu, data_path);
-#else
-  strcpy(menu, app_path);
-#endif
-
-  // append "/<exe-file-name>.menu"
   strcat(menu, "/");
   strcat(menu, fn);
   fl_filename_setext(menu, sizeof(menu), ".menu");
@@ -566,7 +574,7 @@ int main(int argc, char **argv) {
   // parse commandline
 
   int i = 0;
-  if (!Fl::args(argc,argv,i) || i < argc-1)
+  if (!Fl::args(argc, argv, i) || i < argc-1)
     Fl::fatal("Usage: %s <switches> <menufile>\n%s", argv[0], Fl::help);
   if (i < argc) {
     // override menu file *and* data path !
@@ -575,7 +583,7 @@ int main(int argc, char **argv) {
     fix_path(data_path);
   }
 
-  // set current work directory to 'app_path'
+  // set current work directory to 'data_path'
 
   if (fl_chdir(data_path) == -1) { /* ignore */ }
 
@@ -586,21 +594,22 @@ int main(int argc, char **argv) {
 
   {
     char cwd[1024];
-    debug_var("src_path",   src_path);
+    fl_getcwd(cwd, sizeof(cwd));
+    fix_path(cwd, 0);
+
     debug_var("app_path",   app_path);
     debug_var("fluid_path", fluid_path);
     debug_var("data_path",  data_path);
-    debug_var("Menu file",  menu);
-    debug_var("Cwd",        fl_getcwd(cwd,sizeof(cwd)));
+    debug_var("menu file",  menu);
+    debug_var("cwd",        cwd);
     tty->printf("\n");
   }
 
-  // note: load_the_menu() *may* change the `menu` buffer contents !
   if (!load_the_menu(menu))
-    Fl::fatal("Can't open %s", menu);
+    Fl::fatal("Can't open menu file '%s'", menu);
 
   push_menu("@main");
-  form->show(argc,argv);
+  form->show(argc, argv);
   Fl::run();
   return 0;
 }
Direct Link to Message ]
 
     
Previous Message ]Next Message ]
 
 

Comments are owned by the poster. All other content is copyright 1998-2024 by Bill Spitzak and others. This project is hosted by The FLTK Team. Please report site problems to 'erco@seriss.com'.