For programming I start like:
1. Use UltraEdit to make my first class setup. Simply copy and alter some existing files.
2. I use DialogBlocks when I create a GUI app. It takes about 5 minutes to get a good GUI overview, and a starting point of from where I will start with my design.
3. Create a CMakeLists.txt which I use for CMake (http://www.cmake.org) to generate my initial project files. This looks like;
This generates my projects. I always use "out of source builds" which means my source is at: z:\src\someprj and I build from z:\builds\someprj-debug this is a neat feature from CMake so my source dir won't get polluted with intermediate files.PROJECT(WXGEN)
#wxWidgets build related stuff
SET(WXW_USE_DEBUG ON)
SET(WXW_USE_UNICODE OFF)
SET(WXW_USE_SHARED OFF)
SET(WXW_USE_UNIV OFF)
SET(WXW_USE_MONO OFF)
SET(WXW_FILE_VERSION "26")
SET(WXW_VERSION "2.6")
INCLUDE (${WXGEN_SOURCE_DIR}/bin/FindwxW.cmake)
INCLUDE_DIRECTORIES(${WXGEN_SOURCE_DIR}
${WXGEN_SOURCE_DIR}/lexer
${WXWIDGETS_INCLUDE_DIR})
LINK_DIRECTORIES( ${WXWIDGETS_LINK_DIRECTORIES} ${WXGEN_BINARY_DIR} )
SET(CMAKE_CXX_FLAGS "${CMAKE_WX_CXX_FLAGS}")
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D__WXDEBUG__ -DWXDEBUG=1")
IF(LINUX)
ADD_DEFINITIONS( -DLINUX=1 )
ENDIF(LINUX)
SUBDIRS(lexer generator)
4. After it compiles for the first time, then it is check in time. I use SuperVersion (http://www.superversion.org/) for the job. Why? I have used SVN for a while, and I hate the super large repository it leaves in your code tree, the lack of proper branching and not to mention it is so slow when you use it in combination with a mem stick. SuperVersion is a JAVA tool which uses the Smythe database. It is platform independent and it works like a charm on Linux as well as on Windows, with a centralized repository which checks your work dir and finds the match of the current version of the code in the database. With an USB stick checking in a large source tree on SVN can take up to an hour (no kidding) and with SuperVersion a few minutes. It uses file chunks instead of small files which is where the USB stick write speed is not so limiting.
5. For the remainder of the programming project I will use Visual Studio .NET as my programming platform is mostly Windows. Under Linux I simply use Kate or GEdit, which is ofcourse not so powerful. When I add files to the project, I regenerate my CMake project for the changes. My check in behaviour is; as long as it compiles, and after every change I did in my head which is significant. Also ofcourse when changing something big like refactoring, first check the old code in, mark a tag so you know what might have broken it later on.
6. Now, a tool that really proved to be invaluable is TodoList by AbstractSpoon (http://www.abstractspoon.com) which is a freeware windows only (unfortunately) Todo List manager. It's strength lies in it's simplicity and the author's enthousiasm to add anything people ask, making it a very good manager. One of it's strong points is that it saves in XML, and can archive the tasks that are done. This archived list is a seperate file which gets merged with new done tasks whenever they are done. In this list I add my ideas, and during programming I add things to do, and things I encounter that need attention later. I always make a This release and a Next release section. When I get feature requests I judge where to put them, also for future enhancements I think of myself, I let them 'brew' in the next release section first, so they won't distract my goal of getting a first release.
7. For compression of the final exe, I use UPX (upx.sourceforge.net). Which is a good tool to compress the slightly big wxWidgets exe code. I noticed you need to make sure that the resource section does not get compressed, or you lose your icon for windows. The upx command line I use is;
Which gives great results.upx -9 --force --compress-resources=0 somefile.exe
8. For documentation generation I used to use RoboHelp. But the pile of files that app created is surely unbvelievable. It also is not even sure what I can check in my revision control syetem and what not. I am now using Doxygen because in CMake I can create a target that automatically generates doxygen help during a build. This really takes away a lot of effort, and it is suitable enough to create API documentation, and even user documentation. In CMake you can create an entry like;
This will give the option to create it during a build. Also, it will use the file Doxygen.in in which I can set some project specific information like the latest version, project name, path etc. which are generated by CMake after copying the file to the build directory.OPTION( MAKE_DOXYGEN "Generate doxygen documentation for the treemultictrl" ON )
IF(MAKE_DOXYGEN)
ADD_CUSTOM_TARGET(api-docs ALL ${DOXYGEN}
${TREEMULTICTRL_BINARY_DIR}/docs/Doxyfile DEPENDS
${TREEMULTICTRL_SOURCE_DIR}/doc/Doxyfile.in )
ENDIF(MAKE_DOXYGEN)
9. For changelog generation, I look at what I did with TodoList. In the archived version of my todo list, I rename the "Current Release" to e.g. "v1.08" which is the change log release for that version (older versions will stay in the archived list too). Then I simply look at what relevant changes were, rephrase them a bit, add proper credit to people helping me out, or solving the bug. Then I copy and paste the contents of that version in a changelog.txt file. Now, TodoList also knows how to transform XML to any other output using XSL language. So what I will do in the future is write a small script that generates a changelog.txt from all versions I have in the archived todo, plus extra info like when it was fixed, how long it took etc. The XSL can be used to create HTML too.
Also a very neat thing I want to try is posting the latest generated TODOLIST (from HTML) to my site, so people can see an update of what I added to the todo list, what I already done, etc. I need to dig deeper in this, but I reckon I can use a simple batch file that first transforms the todolist xml file in a do-did-done list showing what needs to be done, what I did since last upload of the list, and what is already done. This will give people some live feedback on a project, and all it requires is a FTP client, and one of the many XML transform tools out there.
10. For creating an install package I use InnoSetup (http://www.jrsoftware.org/isinfo.php in combination with ISTool. Very powerful installer which is yet very simple to use and very well documented.
11. For distribution I usually use my site, to tell as much about the app as possible, and find forums and usenet groups that are appropiate to announce this release. Sometimes I also use free software sites to register my application like www.programmersheaven.com. They have a lot of info and freeware applications as well. I try to keep the help online as well for my components so I can always update those with the latest versions.
There, this is about it for my tools. I hope it was informative and I hope others will also post some of their traits and how they come to a software release. Allbeit not as extended as I wrote the introduction!
Regards,
- Jorgen